运行一个单实例有状态应用

    • 在你的环境中创建一个引用磁盘的 PersistentVolume
    • 创建一个 MySQL Deployment.
    • 在集群内以一个已知的 DNS 名称将 MySQL 暴露给其他 Pod

    准备开始

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

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

    • 你需要有一个带有默认 的 动态 PersistentVolume 供应程序, 或者自己 来满足这里使用的 PersistentVolumeClaim

    你可以通过创建一个 Kubernetes Deployment 并使用 PersistentVolumeClaim 将其连接到 某已有的 PV 卷来运行一个有状态的应用。 例如,这里的 YAML 描述的是一个运行 MySQL 的 Deployment,其中引用了 PVC 申领。 文件为 /var/lib/mysql 定义了加载卷,并创建了一个 PVC 申领,寻找一个 20G 大小的卷。 该申领可以通过现有的满足需求的卷来满足,也可以通过动态供应卷的机制来满足。

    注意:在配置的 YAML 文件中定义密码的做法是不安全的。具体安全解决方案请参考 Kubernetes Secrets.

    application/mysql/mysql-pv.yaml 运行一个单实例有状态应用 - 图2

    1. apiVersion: v1
    2. kind: PersistentVolume
    3. metadata:
    4. name: mysql-pv-volume
    5. labels:
    6. type: local
    7. spec:
    8. storageClassName: manual
    9. capacity:
    10. storage: 20Gi
    11. accessModes:
    12. - ReadWriteOnce
    13. hostPath:
    14. path: "/mnt/data"
    15. ---
    16. apiVersion: v1
    17. kind: PersistentVolumeClaim
    18. metadata:
    19. name: mysql-pv-claim
    20. spec:
    21. storageClassName: manual
    22. - ReadWriteOnce
    23. resources:
    24. requests:
    25. storage: 20Gi
    1. 部署 YAML 文件中定义的 PV 和 PVC:

      1. kubectl apply -f https://k8s.io/examples/application/mysql/mysql-pv.yaml
      1. kubectl apply -f https://k8s.io/examples/application/mysql/mysql-deployment.yaml
    2. 展示 Deployment 相关信息:

      输出类似于:

      1. Namespace: default
      2. CreationTimestamp: Tue, 01 Nov 2016 11:18:45 -0700
      3. Labels: app=mysql
      4. Annotations: deployment.kubernetes.io/revision=1
      5. Selector: app=mysql
      6. Replicas: 1 desired | 1 updated | 1 total | 0 available | 1 unavailable
      7. StrategyType: Recreate
      8. MinReadySeconds: 0
      9. Pod Template:
      10. Labels: app=mysql
      11. Containers:
      12. mysql:
      13. Image: mysql:5.6
      14. Port: 3306/TCP
      15. Environment:
      16. MYSQL_ROOT_PASSWORD: password
      17. Mounts:
      18. /var/lib/mysql from mysql-persistent-storage (rw)
      19. Volumes:
      20. mysql-persistent-storage:
      21. Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
      22. ClaimName: mysql-pv-claim
      23. ReadOnly: false
      24. Conditions:
      25. Type Status Reason
      26. Available False MinimumReplicasUnavailable
      27. Progressing True ReplicaSetUpdated
      28. NewReplicaSet: mysql-63082529 (1/1 replicas created)
      29. Events:
      30. FirstSeen LastSeen Count From SubobjectPath Type Reason Message
      31. --------- -------- ----- ---- ------------- -------- ------ -------
      32. 33s 33s 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set mysql-63082529 to 1
    3. 列举出 Deployment 创建的 pods:

      1. kubectl get pods -l app=mysql

      输出类似于:

      1. NAME READY STATUS RESTARTS AGE
      2. mysql-63082529-2z3ki 1/1 Running 0 3m
    4. 查看 PersistentVolumeClaim:

      输出类似于:

      1. Name: mysql-pv-claim
      2. Namespace: default
      3. StorageClass:
      4. Status: Bound
      5. Volume: mysql-pv-volume
      6. Labels: <none>
      7. Annotations: pv.kubernetes.io/bind-completed=yes
      8. pv.kubernetes.io/bound-by-controller=yes
      9. Capacity: 20Gi
      10. Access Modes: RWO
      11. Events: <none>

    访问 MySQL 实例

    前面 YAML 文件中创建了一个允许集群内其他 Pod 访问的数据库服务。该服务中选项 clusterIP: None 让服务 DNS 名称直接解析为 Pod 的 IP 地址。 当在一个服务下只有一个 Pod 并且不打算增加 Pod 的数量这是最好的.

    1. kubectl run -it --rm --image=mysql:5.6 --restart=Never mysql-client -- mysql -h mysql -ppassword

    此命令在集群内创建一个新的 Pod 并运行 MySQL 客户端,并通过 Service 连接到服务器。 如果连接成功,你就知道有状态的 MySQL 数据库正处于运行状态。

    1. Waiting for pod default/mysql-client-274442439-zyp6i to be running, status is Pending, pod ready: false
    2. If you don't see a command prompt, try pressing enter.
    3. mysql>

    Deployment 中镜像或其他部分同往常一样可以通过 kubectl apply 命令更新。 以下是特定于有状态应用的一些注意事项:

    • 不要对应用进行规模扩缩。这里的设置仅适用于单实例应用。下层的 PersistentVolume 仅只能挂载到一个 Pod 上。对于集群级有状态应用,请参考 .
    • 在 Deployment 的 YAML 文件中使用 strategy: type: Recreate。 该选项指示 Kubernetes 使用滚动升级。滚动升级无法工作,因为这里一次不能 运行多个 Pod。在使用更新的配置文件创建新的 Pod 前, 策略将 保证先停止第一个 Pod。

    删除 Deployment

    通过名称删除部署的对象:

    如果通过手动的方式供应 PersistentVolume, 那么也需要手动删除它以释放下层资源。 如果是用动态供应方式创建的 PersistentVolume,在删除 PersistentVolumeClaim 后 PersistentVolume 将被自动删除。 一些存储服务(比如 EBS 和 PD)也会在 PersistentVolume 被删除时自动回收下层资源。