示例:使用持久卷部署 WordPress 和 MySQL

本示例描述了如何通过 Minikube 在 Kubernetes 上安装 WordPress 和 MySQL。 这两个应用都使用 PersistentVolumes 和 PersistentVolumeClaims 保存数据。

PersistentVolume(PV)是在集群里由管理员手动制备或 Kubernetes 通过 StorageClass 动态制备的一块存储。 PersistentVolumeClaim 是用户对存储的请求,该请求可由某个 PV 来满足。 PersistentVolumes 和 PersistentVolumeClaims 独立于 Pod 生命周期而存在, 在 Pod 重启、重新调度甚至删除过程中用于保存数据。

教程目标

  • 创建 PersistentVolumeClaims 和 PersistentVolumes
  • 创建 kustomization.yaml 以使用
    • Secret 生成器
    • MySQL 资源配置
    • WordPress 资源配置
  • kubectl apply -k ./ 来应用整个 kustomization 目录
  • 清理

准备开始

你必须拥有一个 Kubernetes 的集群,且必须配置 kubectl 命令行工具让其与你的集群通信。 建议运行本教程的集群至少有两个节点,且这两个节点不能作为控制平面主机。 如果你还没有集群,你可以通过 Minikube 构建一个你自己的集群,或者你可以使用下面的 Kubernetes 练习环境之一:

要获知版本信息,请输入 kubectl version.

此例在 kubectl 1.27 或者更高版本有效。

下载下面的配置文件:

  1. mysql-deployment.yaml

  2. wordpress-deployment.yaml

创建 PersistentVolumeClaims 和 PersistentVolumes

MySQL 和 Wordpress 都需要一个 PersistentVolume 来存储数据。 它们的 PersistentVolumeClaims 将在部署步骤中创建。

许多集群环境都安装了默认的 StorageClass。如果在 PersistentVolumeClaim 中未指定 StorageClass, 则使用集群的默认 StorageClass。

创建 PersistentVolumeClaim 时,将根据 StorageClass 配置动态制备一个 PersistentVolume。

创建 kustomization.yaml

创建 Secret 生成器

Secret 是存储诸如密码或密钥之类敏感数据的对象。 从 1.14 开始,kubectl 支持使用一个 kustomization 文件来管理 Kubernetes 对象。 你可以通过 kustomization.yaml 中的生成器创建一个 Secret。

通过以下命令在 kustomization.yaml 中添加一个 Secret 生成器。 你需要将 YOUR_PASSWORD 替换为自己要用的密码。

cat <<EOF >./kustomization.yaml secretGenerator: - name: mysql-pass  literals:  - password=YOUR_PASSWORD EOF 

补充 MySQL 和 WordPress 的资源配置

以下清单文件描述的是一个单实例的 MySQL Deployment。MySQL 容器将 PersistentVolume 挂载在 /var/lib/mysqlMYSQL_ROOT_PASSWORD 环境变量根据 Secret 设置数据库密码。

apiVersion: v1 kind: Service metadata:  name: wordpress-mysql  labels:  app: wordpress spec:  ports:  - port: 3306  selector:  app: wordpress  tier: mysql  clusterIP: None --- apiVersion: v1 kind: PersistentVolumeClaim metadata:  name: mysql-pv-claim  labels:  app: wordpress spec:  accessModes:  - ReadWriteOnce  resources:  requests:  storage: 20Gi --- apiVersion: apps/v1 kind: Deployment metadata:  name: wordpress-mysql  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 Deployment。WordPress 容器将 PersistentVolume 挂载到 /var/www/html,用于保存网站数据文件。 WORDPRESS_DB_HOST 环境变量设置上面定义的 MySQL Service 的名称,WordPress 将通过 Service 访问数据库。 WORDPRESS_DB_PASSWORD 环境变量根据使用 kustomize 生成的 Secret 设置数据库密码。

apiVersion: v1 kind: Service metadata:  name: wordpress  labels:  app: wordpress spec:  ports:  - port: 80  selector:  app: wordpress  tier: frontend  type: LoadBalancer --- apiVersion: v1 kind: PersistentVolumeClaim metadata:  name: wp-pv-claim  labels:  app: wordpress spec:  accessModes:  - ReadWriteOnce  resources:  requests:  storage: 20Gi --- apiVersion: apps/v1 kind: Deployment metadata:  name: 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:6.2.1-apache  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 
  1. 下载 MySQL Deployment 配置文件。

    curl -LO https://k8s.io/examples/application/wordpress/mysql-deployment.yaml 
  1. 下载 WordPress 配置文件。

    curl -LO https://k8s.io/examples/application/wordpress/wordpress-deployment.yaml 
  1. 将上述内容追加到 kustomization.yaml 文件。

    cat <<EOF >>./kustomization.yaml resources:  - mysql-deployment.yaml  - wordpress-deployment.yaml EOF 

应用和验证

kustomization.yaml 包含用于部署 WordPress 网站以及 MySQL 数据库的所有资源。你可以通过以下方式应用目录:

kubectl apply -k ./ 

现在,你可以验证所有对象是否存在。

  1. 通过运行以下命令验证 Secret 是否存在:

    kubectl get secrets 

    响应应如下所示:

    NAME TYPE DATA AGE mysql-pass-c57bb4t7mf Opaque 1 9s 
  1. 验证是否已动态制备 PersistentVolume:

    kubectl get pvc 

    响应应如下所示:

    NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE mysql-pv-claim Bound pvc-8cbd7b2e-4044-11e9-b2bb-42010a800002 20Gi RWO standard 77s wp-pv-claim Bound pvc-8cd0df54-4044-11e9-b2bb-42010a800002 20Gi RWO standard 77s 
  1. 通过运行以下命令来验证 Pod 是否正在运行:

    kubectl get pods 

    响应应如下所示:

    NAME READY STATUS RESTARTS AGE wordpress-mysql-1894417608-x5dzt 1/1 Running 0 40s 
  1. 通过运行以下命令来验证 Service 是否正在运行:

    kubectl get services wordpress 

    响应应如下所示:

    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE wordpress LoadBalancer 10.0.0.89 <pending> 80:32406/TCP 4m 
  1. 运行以下命令以获取 WordPress 服务的 IP 地址:

    minikube service wordpress --url 

    响应应如下所示:

    http://1.2.3.4:32406 
  1. 复制 IP 地址,然后将页面加载到浏览器中来查看你的站点。

    你应该看到类似于以下屏幕截图的 WordPress 设置页面。

    wordpress-init

清理现场

  1. 运行以下命令删除你的 Secret、Deployment、Service 和 PersistentVolumeClaims:

    kubectl delete -k ./ 

接下来

最后修改 September 22, 2023 at 9:36 PM PST: [zh-cn] sync tutorials/stateful-application/* (7a86c9de71)