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

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

    警告:

    这种部署并不适合生产场景,因为它使用的是单实例 WordPress 和 MySQL Pod。 在生产场景中,请考虑使用 部署 WordPress。

    说明:

    本教程中提供的文件使用 GA Deployment API,并且特定于 kubernetes 1.9 或更高版本。 如果你希望将本教程与 Kubernetes 的早期版本一起使用,请相应地更新 API 版本,或参考本教程的早期版本。

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

    准备开始

    你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 建议在至少有两个节点的集群上运行本教程,且这些节点不作为控制平面主机。 如果你还没有集群,你可以通过 Minikube 构建一个你自己的集群,或者你可以使用下面任意一个 Kubernetes 工具构建:

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

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

    下载下面的配置文件:

    1. wordpress-deployment.yaml

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

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

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

    警告:

    在本地集群中,默认的 StorageClass 使用 hostPath 制备程序。hostPath 卷仅适用于开发和测试。 使用 hostPath 卷时,你的数据位于 Pod 调度到的节点上的 /tmp 中,并且不会在节点之间移动。 如果 Pod 死亡并被调度到集群中的另一个节点,或者该节点重新启动,则数据将丢失。

    说明:

    说明:

    如果你已经有运行在 Google Kubernetes Engine 的集群, 请参考此指南

    创建 kustomization.yaml

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

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

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

    1. apiVersion: v1
    2. kind: Service
    3. metadata:
    4. name: wordpress-mysql
    5. labels:
    6. app: wordpress
    7. spec:
    8. ports:
    9. - port: 3306
    10. selector:
    11. app: wordpress
    12. tier: mysql
    13. clusterIP: None
    14. ---
    15. apiVersion: v1
    16. kind: PersistentVolumeClaim
    17. metadata:
    18. name: mysql-pv-claim
    19. labels:
    20. app: wordpress
    21. spec:
    22. accessModes:
    23. - ReadWriteOnce
    24. resources:
    25. requests:
    26. storage: 20Gi
    27. ---
    28. apiVersion: apps/v1
    29. kind: Deployment
    30. metadata:
    31. name: wordpress-mysql
    32. labels:
    33. app: wordpress
    34. spec:
    35. selector:
    36. matchLabels:
    37. app: wordpress
    38. tier: mysql
    39. strategy:
    40. type: Recreate
    41. template:
    42. labels:
    43. app: wordpress
    44. tier: mysql
    45. spec:
    46. containers:
    47. - image: mysql:5.6
    48. name: mysql
    49. env:
    50. - name: MYSQL_ROOT_PASSWORD
    51. valueFrom:
    52. secretKeyRef:
    53. name: mysql-pass
    54. key: password
    55. ports:
    56. - containerPort: 3306
    57. name: mysql
    58. volumeMounts:
    59. - name: mysql-persistent-storage
    60. mountPath: /var/lib/mysql
    61. volumes:
    62. - name: mysql-persistent-storage
    63. persistentVolumeClaim:
    64. claimName: mysql-pv-claim

    以下清单文件描述的是一个单实例 WordPress Deployment。WordPress 容器将 PersistentVolume 挂载到 /var/www/html,用于保存网站数据文件。 WORDPRESS_DB_HOST 环境变量设置上面定义的 MySQL Service 的名称,WordPress 将通过 Service 访问数据库。 WORDPRESS_DB_PASSWORD 环境变量根据使用 kustomize 生成的 Secret 设置数据库密码。

    application/wordpress/wordpress-deployment.yaml 示例:使用持久卷部署 WordPress 和 MySQL - 图2

    1. apiVersion: v1
    2. kind: Service
    3. metadata:
    4. name: wordpress
    5. labels:
    6. app: wordpress
    7. spec:
    8. ports:
    9. - port: 80
    10. selector:
    11. app: wordpress
    12. tier: frontend
    13. type: LoadBalancer
    14. ---
    15. apiVersion: v1
    16. kind: PersistentVolumeClaim
    17. metadata:
    18. name: wp-pv-claim
    19. labels:
    20. app: wordpress
    21. spec:
    22. accessModes:
    23. - ReadWriteOnce
    24. resources:
    25. requests:
    26. storage: 20Gi
    27. ---
    28. apiVersion: apps/v1
    29. kind: Deployment
    30. metadata:
    31. name: wordpress
    32. app: wordpress
    33. spec:
    34. selector:
    35. matchLabels:
    36. app: wordpress
    37. tier: frontend
    38. type: Recreate
    39. template:
    40. metadata:
    41. labels:
    42. app: wordpress
    43. tier: frontend
    44. spec:
    45. containers:
    46. - image: wordpress:4.8-apache
    47. name: wordpress
    48. env:
    49. - name: WORDPRESS_DB_HOST
    50. value: wordpress-mysql
    51. - name: WORDPRESS_DB_PASSWORD
    52. valueFrom:
    53. secretKeyRef:
    54. name: mysql-pass
    55. key: password
    56. ports:
    57. - containerPort: 80
    58. name: wordpress
    59. volumeMounts:
    60. - name: wordpress-persistent-storage
    61. mountPath: /var/www/html
    62. volumes:
    63. - name: wordpress-persistent-storage
    64. persistentVolumeClaim:
    65. claimName: wp-pv-claim
    1. 下载 MySQL Deployment 配置文件。

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

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

      1. cat <<EOF >>./kustomization.yaml
      2. resources:
      3. - mysql-deployment.yaml
      4. - wordpress-deployment.yaml
      5. EOF

    应用和验证

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

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

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

      1. kubectl get secrets

      响应应如下所示:

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

      1. kubectl get pvc

      说明:

      响应应如下所示:

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

      1. kubectl get pods

      说明:

      等待 Pod 状态变成 RUNNING 可能会花费几分钟。

      响应应如下所示:

    4. 通过运行以下命令来验证 Service 是否正在运行:

      1. kubectl get services wordpress

      响应应如下所示:

      1. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
      2. wordpress ClusterIP 10.0.0.89 <pending> 80:32406/TCP 4m

      说明:

      Minikube 只能通过 NodePort 公开服务。EXTERNAL-IP 始终处于 pending 状态。

    5. 运行以下命令以获取 WordPress 服务的 IP 地址:

      1. minikube service wordpress --url

      响应应如下所示:

    6. 复制 IP 地址,然后将页面加载到浏览器中来查看你的站点。

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

    警告:

    不要在此页面上保留 WordPress 安装。如果其他用户找到了它,他们可以在你的实例上建立一个网站并使用它来提供恶意内容。

    通过创建用户名和密码来安装 WordPress 或删除你的实例。

      1. kubectl delete -k ./

    接下来