使用 k8s 搭建 wordpress
k8s 是容器编排系统,使用 K8s 可以做到 自动扩缩 、 故障转移,等等优秀的特性,被常常在企业中使用。
搭建一个简易的 k8s 可以使用 k3s 。
- 轻量级(0.5G 就可以使用)
- 拥有大部分的 k8s 功能
- 支持多节点
具体搭建过程及更多信息可以参考官网。
部署思路
wordpress 部分
搭建 wordpress ,需要了解搭建一个完整的 wordpress 服务并且对外开放,所需要的服务。
- wordpress 服务端(提供 wordpress 后端服务、配置、插件等等)
- Mysql (提供存储数据的能力,比如:文章、评论等等)
根据以上信息,wordpress 服务端和 Mysql 需要存储一些信息,故需要对数据进行持久化。
k8s 中卷常见的类型:
- hostpath 。无法被多个节点中 pods 读写
- 网络卷(比如: NFS)。可以被多个节点内的 pods 读写。推荐
在 k8s 中,一个 pod 可以包含多个 container ,那么对于 wordpress 与 mysql 也可以吗?
可以,但是不推荐。
- 耦合性强
- 博客网站多为多读少写,瓶颈在 IO ,故可能只需要动态地对 mysql 进行扩缩,而不需要对 wordperss 进行扩散。
最后需要对外暴露服务,故需要 service 对 pod 指定一个访问接口。
mysql 部分:
编写 wordpress 部署 yaml
service : 对集群内部暴露 80 端口给集群内部访问,通过 LoadBalancer 暴露端口给外部访问。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| apiVersion: v1 kind: Service metadata: name: wordpress namespace: wordpress labels: app: wordpress spec: ports: - port: 80 selector: app: wordpress tier: fontend type: LoadBalancer
|
PersistentVolumeClaim : 申请 20G 存储空间
1 2 3 4 5 6 7 8 9 10 11 12 13
| apiVersion: v1 kind: PersistentVolumeClaim metadata: name: wp-pv-claim namespace: wordpress labels: app: wordpress spec: accessModes: - ReadWriteOnce resources: requests: storage: 20Gi
|
Deployment : 部署 wordpress
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| apiVersion: apps/v1 kind: Deployment metadata: name: wordpress namespace: wordpress labels: app: wordpress spec: selector: matchLabels: app: wordpress tier: frontend strategy: type: Recreate template: metadata: labels: app: wordpress tier: frontend spec: containers: - image: wordpress:laest name: wordpress env: - name: WORDPRESS_DB_HOST value: wordpress-mysql - name: WORDPRESS_DB_PASSWORD valueFrom: secretKeyRef: name: mysql-pass key: password - name: WORDPRESS_DB_USER value: wordpress ports: - containerPort: 80 name: wordpress volumeMounts: - name: wordpress-persistent-storage mountPath: /var/www/html volumes: - name: wordpress-persistent-storage persistentVolumeClaim: claimName: wp-pv-claim
|
编写 mysql.yaml
secret :
1 2 3 4 5 6 7 8
| apiVersion: v1 kind: Secret metadata: name: mysql-pass namespace: wordpress type: Opaque data: password: <your-base64-encoded-password>
|
service :
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| apiVersion: v1 kind: Service metadata: name: wordpress-mysql namespace: wordpress labels: app: wordpress spec: ports: - port: 3306 selector: app: wordpress tier: mysql clusterIP: None
|
PersistentVolumeClaim :
1 2 3 4 5 6 7 8 9 10 11 12 13
| apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-pv-claim namespace: wordpress labels: app: wordpress spec: accessModes: - ReadWriteOnce resources: requests: storage: 20Gi
|
Deployment :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| apiVersion: apps/v1 kind: Deployment metadata: name: wordpress-mysql namespace: wordpress labels: app: wordpress spec: selector: matchLabels: app: wordpress tier: mysql strategy: type: Recreate template: metadata: labels: app: wordpress tier: mysql spec: containers: - image: mysql:8.0 name: mysql env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: mysql-pass key: password - name: MYSQL_DATABASE value: wordpress - name: MYSQL_USER value: wordpress - name: MYSQL_PASSWORD valueFrom: secretKeyRef: name: mysql-pass key: password ports: - containerPort: 3306 name: mysql volumeMounts: - name: mysql-persistent-storage mountPath: /var/lib/mysql volumes: - name: mysql-persistent-storage persistentVolumeClaim: claimName: mysql-pv-claim
|
部署验证
将以上两个配置,分别组合为 wordpress-frontend.yaml / wordpress-mysql.yaml 文件。
1 2
| kubectl apply -f wordpress-frontend.yaml kubectl apply -f wordpress-mysql.yaml
|
k8s 将会开始部署。由于镜像可能有点慢,等待时间可以会有点久。
可以通过以下命令进行验证:
1
| kubectl get secrets -n wordpress
|
查看为 mysql 创建的 secret 是否存在。
1
| kubectl get pvc -n wordpress
|
查看为 wordpress 与 mysql 创建的两个 pvc 是否存在。
1
| kubectl get pods -n wordpress
|
查看 wordpress 与 mysql 两个服务是否在运行。
1
| kubectl get services -n wordpress
|
查看两个 service 是否操作。
当两个 pod 都在运行时,可以通过 kubectl get services -n wordpress
查看进行服务信息,如上图,名为 wordpress 栏的 PORT(s) 列,其中 30122 为外部地址访问的端口。
我使用云服务器部署该应用,故可以通过 http://:30122 访问 wordpress 初始页面。