kubernetes(k8s)可以让WordPress+MySQL容器更持久

本文的示例描述了如何在 Kubernetes 上运行一个WordPressMySQL 的持续化安装。我们将使用 MySQL和 WordPress 官方Docker镜像进行安装。(WordPress镜像包括Apache服务器)。

本文会展示以下 Kubernetes 概念:

● Persistent Volumes(以下简称PV)用来定义持久化磁盘(磁盘生命周期不与Pods绑定)。
● Services可以让 Pods 具备定位其他Pod的能力。
● 外部负载均衡用于对外暴露Services。
● Deployments用来确保Pods保持运行。
● Secrets用以存储敏感密码。

目录

  • 在kubernetes中持久化安装MySQL和WordPress
  • tl;dr说明
  • 目录内容
  • 集群要求
  • 决定在何处存储数据
  • 主机路径
  • GCE 持久盘
  • 创建MySQL密码 Secret
  • 部署 MySQL
  • 部署 WordPress
  • 访问新建的WordPress 博客
  • 卸载并重启博客
  • 下一步

tl;dr 说明

把你想要的MySQL密码放入名为password.txt 的文件中,不要尾部换行。如果你的编辑器会自动添加一个,使用下面的第一个指令 tr 将换行符删除。

tr --delete '\n' .strippedpassword.txt && mv
 .strippedpassword.txt password.txt
 kubectl create -f https://raw.githubusercontent.com/kubernetes
 /kubernetes/master/examples/mysql-wordpress-pd/local-volumes.yaml
 kubectl create secret generic mysql-pass --from-file=password.txt
 kubectl create -f https://raw.githubusercontent.com/kubernetes
 /kubernetes/master/examples/mysql-wordpress-pd/mysql-deployment.yaml
 kubectl create -f https://raw.githubusercontent.com/kubernetes/kubernetes
 /master/examples/mysql-wordpress-pd/wordpress-deployment.yaml

集群要求

Kubernetes可运行在多种环境并且是天生模块化的,并非所有集群都是相同的,以下是该示例的要求。

● Kubernetes1.2 版本。由于使用较新功能(如PV Claims和Deployments)。运行“kubectl versioin”来查看你的集群版本。
● 集群DNS。用于服务发现。
● 外部负载均衡。用于访问WordPress。
● 使用Persistent Volume Claims(以下简称PVC)。你必须在集群中创建PV并被认领。示例中仅演示了如何创建两种类型的volumes,但任何volume类型都可以满足要求。

查阅Getting Started Guide来安装一个集群以及kubectl命令行客户端

决定在何处存储数据

MySQL和WordPress都将使用PV来存储数据。我们将使用PVC来认领可用的PV。这个例子涉及了HostPath 和GCEPersistentDisk 存储卷。选择其中之一,或查看Types of Persistent Volumes获取更多选项。

◆ 主机路径

Host Paths是映射到主机目录的存储卷,应只用于测试或单节点
集群。如果在新节点重建pod,数据将不会在节点间移动,此时数据将丢失。
使用local-volumes.yaml 在 Kubernetes 中创建PV对象:

export KUBE_REPO=https://raw.githubusercontent.com/kubernetes/kubernetes/master
 kubectl create -f $KUBE_REPO/examples/mysql-wordpress-pd/local-volumes.yaml

◆ GCE 持久盘

如果你在谷歌计算引擎上运行示例,该存储选项是可合适的选择。

你需要在Kubernetes集群所在的GCE 区域创建两个持久磁盘。默认的安装脚本将在 us-central1-b 区域创建集群,参考在config-default.sh文件。用适当的区域替换<区域>。名称wordpress-1和wordpress-2必须与gce-volumes.yaml中指定的pdname字段匹配。

gcloud compute disks create --size=20GB --zone= wordpress-1
gcloud compute disks create --size=20GB --zone= wordpress-2

在Kubernetes 中为这些磁盘创建持久卷对象:

export KUBE_REPO=https://raw.githubusercontent.com/kubernetes/kubernetes/master
kubectl create -f $KUBE_REPO/examples/mysql-wordpress-pd/gce-volumes.yaml

创建MySQL密码

使用 Secret 对象来存储 MySQL 密码。首先创建一个临时文件password.txt 并保存你的密码。确保不在密码末尾换行。如果你的编辑器自动添加了一个换行,下面的第一个命令tr将删除换行符。然后,创建 Secret 对象。

tr --delete '\n' .strippedpassword.txt && mv .strippedpassword.txt password.txt
kubectl create secret generic mysql-pass --from-file=password.txt

MySQL和WordPress pod 配置会引用secret。MySQL pod 将设置数据库密码,同时 WordPress pod 将使用密码来访问数据库。

部署 MySQL

既然定义了持久盘和 Secrets ,那么现在可以启动Kubernetes pods 了,用mysql-deployment.yaml 启动MySQL。

kubectl create -f $KUBE_REPO/examples/mysql-wordpress-pd/mysql-deployment.yaml

从mysql-deployment.yaml中可以注意到我们定义为/var/lib/mysql定义了volume,然后创建一个持久PVC来寻找一个20G 的 volume。任何符合条件的volume 都可以满足这个要求,对应之前示例中我们所创建的volume之一。

再看看 env 部分,我们通过引用之前创建的Secret(mysql-pass) 来指定密码。 Secrets 可以有多个键-值对。我们只有一个键 password.txt ,是用来创建Secret 的文件名。MySQL 镜像使用 MYSQL_ROOT_PASSWORD 环境变量设置数据库密码。

新 pod 到达Running状态前可能需要一段时间。列出所有的pods 来观察这个新pod的状态。

kubectl get pods
NAME READY STATUS RESTARTS AGE
wordpress-mysql-cqcf4-9q8lo 1/1 Running 0 1m

Kubernetes会记录每个 pod 的stderr和stdout。通过 Kubectl log指令可以查看pod 日志。从 get pods 命令复制pod 名称,然后:

kubectl logs ...
 2016-02-19 16:58:05 1 [Note] InnoDB: 128 rollback segment(s) are active.
 2016-02-19 16:58:05 1 [Note] InnoDB: Waiting for purge to start
 2016-02-19 16:58:05 1 [Note] InnoDB: 5.6.29 started; log sequence number
 1626007
 2016-02-19 16:58:05 1 [Note] Server hostname (bind-address): '*'; port: 3306
 2016-02-19 16:58:05 1 [Note] IPv6 is available.
 2016-02-19 16:58:05 1 [Note] - '::' resolves to '::';
 2016-02-19 16:58:05 1 [Note] Server socket created on IP: '::'.
 2016-02-19 16:58:05 1 [Warning] 'proxies_priv' entry '@ root@wordpress-
 mysql-cqcf4-9q8lo' ignored in --skip-name-resolve mode.
 2016-02-19 16:58:05 1 [Note] Event Scheduler: Loaded 0 events
 2016-02-19 16:58:05 1 [Note] mysqld: ready for connections.
 Version: '5.6.29' socket: '/var/run/mysqld/mysqld.sock' port: 3306
 MySQL Community Server (GPL)

在 mysql-deployment.yaml 我们还创建了一个service,允许其他 pods 访问这个MySQL实例。Service名称是wordpress-mysql,通过名称可以解析到 pod IP。

部署 WordPress

下一步使用wordpress-deployment.yaml 部署WordPress

kubectl create -f $KUBE_REPO/examples/mysql-wordpress-pd/wordpress-deployment.yaml

此处使用了许多相同的功能,如对持久存储的 volume 认领和保存密码的 Secret。

WordPress的镜像通过环境变量 WORDPRESS_DB_HOST设置数据库主机名。我们使用已创建的MySQL service的名称wordpress-mysql 设定环境变量。

WordPress service设置了“type: LoadBalancer”。这将为WordPress service分配一个external IP。

找到WordPress服务的外部IP。外部IP分配给服务的过程可能需要一分钟,这取决于你的集群环境。

kubectl get services wordpress
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
wordpress 10.0.0.5 1.2.3.4 80/TCP 19h

访问新建的WordPress 博客

现在我们可以使用已获得的服务外部IP来访问运行中的WordPress app。

http://<external-ip>

你应该可以看到熟悉的WordPress 初始页。

20160927211008

警告:不要在这个页面保留WordPress安装入口。如果它被另一个用户发现,他们可以在你的实例上建立一个网站,并使用它来服务潜在的恶意内容。你应该继续安装直到创建用户名和密码,并删除你的实例,或设置一个防火墙来限制访问。

卸载并重启博客

设置WordPress博客并把玩一下。然后删除pods、再恢复。因为你使用了持久盘,所以你的博客状态会被保存下来。

所有的资源都打上了 app=wordpress标签,所以你可以很容易地通过标签选择器进行删除:

kubectl delete deployment,service -l app=wordpress
kubectl delete secret mysql-pass

之后用原来的命令重新创建资源,这些资源将在原来的磁盘中获取到你的完整数据。因为我们并没有删除PVC,在我们删除pods 后,集群中没有其他的pods能认领PV。

如果你准备好释放持久卷和上面的数据,执行以下指令:

kubectl delete pvc -l app=wordpress

然后删除volume 对象自身。

kubectl delete pv local-pv-1 local-pv-2

kubectl delete pv wordpress-pv-1 wordpress-pv-2

Next Steps

  • Introspection and Debugging
  • Jobs may be useful to run SQL queries.
  • Exec
  • Port Forwarding

原文链接:https://github.com/kubernetes/kubernetes/tree/release-1.3/examples/mysql-wordpress-pd#gce-persistent-disk

K8S中文社区微信公众号
分享到:更多 ()