【重识云原生】第六章容器基础6.4.10.3节——StatefulSet实操案例-部署WordPress 和 MySQL

【重识云原生】第六章容器基础6.4.10.3节——StatefulSet实操案例-部署WordPress 和 MySQL_第1张图片

  《重识云原生系列》专题索引:

  1. 第一章——不谋全局不足以谋一域
  2. 第二章计算第1节——计算虚拟化技术总述
  3. 第二章计算第2节——主流虚拟化技术之VMare ESXi
  4. 第二章计算第3节——主流虚拟化技术之Xen
  5. 第二章计算第4节——主流虚拟化技术之KVM
  6. 第二章计算第5节——商用云主机方案
  7. 第二章计算第6节——裸金属方案
  8. 第三章云存储第1节——分布式云存储总述
  9. 第三章云存储第2节——SPDK方案综述
  10. 第三章云存储第3节——Ceph统一存储方案
  11. 第三章云存储第4节——OpenStack Swift 对象存储方案
  12. 第三章云存储第5节——商用分布式云存储方案
  13. 第四章云网络第一节——云网络技术发展简述
  14. 第四章云网络4.2节——相关基础知识准备
  15. 第四章云网络4.3节——重要网络协议
  16. 第四章云网络4.3.1节——路由技术简述
  17. 第四章云网络4.3.2节——VLAN技术
  18. 第四章云网络4.3.3节——RIP协议
  19. 第四章云网络4.3.4节——OSPF协议
  20. 第四章云网络4.3.5节——EIGRP协议
  21. 第四章云网络4.3.6节——IS-IS协议
  22. 第四章云网络4.3.7节——BGP协议
  23. 第四章云网络4.3.7.2节——BGP协议概述
  24. 第四章云网络4.3.7.3节——BGP协议实现原理
  25. 第四章云网络4.3.7.4节——高级特性
  26. 第四章云网络4.3.7.5节——实操
  27. 第四章云网络4.3.7.6节——MP-BGP协议
  28. 第四章云网络4.3.8节——策略路由
  29. 第四章云网络4.3.9节——Graceful Restart(平滑重启)技术
  30. 第四章云网络4.3.10节——VXLAN技术
  31. 第四章云网络4.3.10.2节——VXLAN Overlay网络方案设计
  32. 第四章云网络4.3.10.3节——VXLAN隧道机制
  33. 第四章云网络4.3.10.4节——VXLAN报文转发过程
  34. 第四章云网络4.3.10.5节——VXlan组网架构
  35. 第四章云网络4.3.10.6节——VXLAN应用部署方案
  36. 第四章云网络4.4节——Spine-Leaf网络架构
  37. 第四章云网络4.5节——大二层网络
  38. 第四章云网络4.6节——Underlay 和 Overlay概念
  39. 第四章云网络4.7.1节——网络虚拟化与卸载加速技术的演进简述
  40. 第四章云网络4.7.2节——virtio网络半虚拟化简介
  41. 第四章云网络4.7.3节——Vhost-net方案
  42. 第四章云网络4.7.4节vhost-user方案——virtio的DPDK卸载方案
  43. 第四章云网络4.7.5节vDPA方案——virtio的半硬件虚拟化实现
  44. 第四章云网络4.7.6节——virtio-blk存储虚拟化方案
  45. 第四章云网络4.7.8节——SR-IOV方案
  46. 第四章云网络4.7.9节——NFV
  47. 第四章云网络4.8.1节——SDN总述
  48. 第四章云网络4.8.2.1节——OpenFlow概述
  49. 第四章云网络4.8.2.2节——OpenFlow协议详解
  50. 第四章云网络4.8.2.3节——OpenFlow运行机制
  51. 第四章云网络4.8.3.1节——Open vSwitch简介
  52. 第四章云网络4.8.3.2节——Open vSwitch工作原理详解
  53. 第四章云网络4.8.4节——OpenStack与SDN的集成
  54. 第四章云网络4.8.5节——OpenDayLight
  55. 第四章云网络4.8.6节——Dragonflow
  56.  第四章云网络4.9.1节——网络卸载加速技术综述

  57. 第四章云网络4.9.2节——传统网络卸载技术

  58. 第四章云网络4.9.3.1节——DPDK技术综述

  59. 第四章云网络4.9.3.2节——DPDK原理详解

  60. 第四章云网络4.9.4.1节——智能网卡SmartNIC方案综述

  61. 第四章云网络4.9.4.2节——智能网卡实现

  62. 第六章容器6.1.1节——容器综述

  63. 第六章容器6.1.2节——容器安装部署

  64. 第六章容器6.1.3节——Docker常用命令

  65. 第六章容器6.1.4节——Docker核心技术LXC

  66. 第六章容器6.1.5节——Docker核心技术Namespace

  67. 第六章容器6.1.6节—— Docker核心技术Chroot

  68. 第六章容器6.1.7.1节——Docker核心技术cgroups综述

  69. 第六章容器6.1.7.2节——cgroups原理剖析

  70. 第六章容器6.1.7.3节——cgroups数据结构剖析

  71. 第六章容器6.1.7.4节——cgroups使用

  72. 第六章容器6.1.8节——Docker核心技术UnionFS

  73. 第六章容器6.1.9节——Docker镜像技术剖析

  74. 第六章容器6.1.10节——DockerFile解析

  75. 第六章容器6.1.11节——docker-compose容器编排

  76. 第六章容器6.1.12节——Docker网络模型设计

  77. 第六章容器6.2.1节——Kubernetes概述

  78. 第六章容器6.2.2节——K8S架构剖析

  79. 第六章容器6.3.1节——K8S核心组件总述

  80. 第六章容器6.3.2节——API Server组件

  81. 第六章容器6.3.3节——Kube-Scheduler使用篇

  82. 第六章容器6.3.4节——etcd组件

  83. 第六章容器6.3.5节——Controller Manager概述

  84. 第六章容器6.3.6节——kubelet组件

  85. 第六章容器6.3.7节——命令行工具kubectl

  86. 第六章容器6.3.8节——kube-proxy

  87. 第六章容器6.4.1节——K8S资源对象总览

  88. 第六章容器6.4.2.1节——pod详解

  89. 第六章容器6.4.2.2节——Pod使用(上)

  90. 第六章容器6.4.2.3节——Pod使用(下)

  91. 第六章容器6.4.3节——ReplicationController

  92. 第六章容器6.4.4节——ReplicaSet组件

  93. 第六章容器基础6.4.5.1节——Deployment概述

  94. 第六章容器基础6.4.5.2节——Deployment配置详细说明

  95. 第六章容器基础6.4.5.3节——Deployment实现原理解析

  96. 第六章容器基础6.4.6节——Daemonset

  97. 第六章容器基础6.4.7节——Job

  98. 第六章容器基础6.4.8节——CronJob

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

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

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

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

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

1.1 教程目标

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

1.2 准备开始

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

  • Killercoda
  • 玩转 Kubernetes要获知版本信息,请输入 kubectl version.

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

        下载下面的配置文件:

  • mysql-deployment.yaml
  • wordpress-deployment.yaml

1.3 创建 PersistentVolumeClaims 和 PersistentVolumes

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

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

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

警告:

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

说明:

如果要建立需要使用 hostPath 制备程序的集群, 则必须在 controller-manager 组件中设置 --enable-hostpath-provisioner 标志。

说明:

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

1.4 创建 kustomization.yaml

1.4.1 创建 Secret 生成器

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

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

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

1.5 补充 MySQL 和 WordPress 的资源配置

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

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:5.6 
          name: mysql 
          env: 
            - name: MYSQL_ROOT_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 设置数据库密码。application/wordpress/wordpress-deployment.yaml 

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:4.8-apache 
          name: wordpress 
          env: 
            - name: WORDPRESS_DB_HOST 
              value: wordpress-mysql 
            - name: WORDPRESS_DB_PASSWORD 
              valueFrom: 
                secretKeyRef: 
                  name: mysql-pass 
                  key: password 
          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

2. 下载 WordPress 配置文件。

curl -LO https://k8s.io/examples/application/wordpress/wordpress-deployment.yaml

3. 将上述内容追加到kustomization.yaml 文件。

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

1.6 应用和验证

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

kubectl apply -k ./

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

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

kubectl get secrets

        响应应如下所示:

NAME                   TYPE  DATA AGE 
mysql-pass-c57bb4t7mf Opaque   1  9s

2. 验证是否已动态制备 PersistentVolume:

kubectl get pvc

说明:

制备和绑定 PV 可能要花费几分钟。

        响应应如下所示:

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

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

kubectl get pods

说明:

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

响应应如下所示:

NAME                             READY STATUS  RESTARTS AGE 
wordpress-mysql-1894417608-x5dzt  1/1  Running    0     40s

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

kubectl get services wordpress

        响应应如下所示:

NAME         TYPE   CLUSTER-IP EXTERNAL-IP PORT(S)      AGE 
wordpress ClusterIP 10.0.0.89     80:32406/TCP 4m

说明:

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

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

minikube service wordpress --url

响应应如下所示:

http://1.2.3.4:32406

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

        你应该可以看到WordPress 设置页面。

警告:

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

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

1.7 清理现场

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

kubectl delete -k ./

参考链接

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

StatefulSet 基础 | Kubernetes

示例:使用 StatefulSet 部署 Cassandra | Kubernetes

运行一个有状态的应用程序 | Kubernetes

Statefulset详细解析 - 不懂123 - 博客园

k8s中statefulset资源类型的深入理解

十,StatefulSet简介及简单使用 - 戴红领巾的少年 - 博客园

k8s之StatefulSet详解_最美dee时光的博客-CSDN博客_statefulset

你可能感兴趣的:(云原生专栏,云原生,kubernetes,Pod,容器,StatefulSet)