【Kubernetes】Pod 之 实战 Deployment 升级 Pod

106 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第13天,点击查看活动详情

一、前言

使用 Deployment 进行 Pod 的部署、升级与回滚。

DeploymentPodReplicaSet 提供了声明式定义方法,可以替代之前使用的 ReplicationController(RC)来管理应用。

Deployment 资源对象为 PodReplicaSetReplicationController 的升级版)提供了声明式定义,在 Deployment YAML 文件中描述期望达到的目标状态。

Deployment Controller 会创建符合目标状态的 ReplicaSetPod,如果更新 Deployment,对应的 ReplicaSetPod 的状态也会改变以符合新的目标状态。

(1)典型应用场景

  1. 定义 Deployment 来创建 ReplicaSetPod

使用 Deployment 来创建 ReplicaSetReplicaSet 又会在后台创建 Pod。可以检查 Pod 的启动状态,观察是成功还是失败。也可以根据 Deployment 的状态判断上线是否 hang 住了。

  1. 滚动升级和回滚应用

通过更新 DeploymentPodTemplateSpec 字段来声明 Pod 的新状态,更新 Deployment 后会创建一个新的 ReplicaSetDeployment 会按照控制的速率删除由旧的 ReplicaSet 创建的 Pod、并使用新的 ReplicaSet 创建新的 Pod,当新生成的 Pod 达到要求的目标状态后,会清除旧的 ReplicaSet

如果当前状态不稳定,可以回滚到之前的 Deployment revision,每次回滚都会更新 Deploymentrevision

  1. 扩容和缩容

根据系统负载进行 Deployment 的扩容和缩容。

  1. 暂停和继续 Deployment

暂停 Deployment 并修改 PodTemplateSpec 字段,然后重新恢复上线。



二、实验

需求:

  1. 使用Deployment创建 3 个镜像名为 mysql:5.7pod
  2. 创建完成后,将mysql:5.7 镜像升级到 mysql:8.0

步骤如下:

  1. 编写 deployment yaml文件
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-deployment
spec:
  selector:
    matchLabels:
      app: mysql
  replicas: 3
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - name: database
          image: registry-vpc.cn-hangzhou.aliyuncs.com/chenshi-kubernetes/mysql:5.7
          ports:
            - containerPort: 3306
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: "123456"
  1. 执行创建
$ kubectl create -f mysql-deployment.yaml --record

deployment.apps/mysql-deployment created

创建后查看 Deployment RS Pods

$ kubectl get deployment                                
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
mysql-deployment   3/3     3            3           3m50s


$ kubectl get rs                                        
NAME                          DESIRED   CURRENT   READY   AGE
mysql-deployment-7f7c764c46   3         3         3       3m55s


$ kubectl get pods                                      
NAME                                READY   STATUS    RESTARTS   AGE
mysql-deployment-7f7c764c46-5lnwc   1/1     Running   0          18s
mysql-deployment-7f7c764c46-5mhsd   1/1     Running   0          18s
mysql-deployment-7f7c764c46-jsdbb   1/1     Running   0          18s
  1. 升级

mysql:5.7 的镜像升级为 mysql:8.0镜像:

$ kubectl set image deployment/mysql-deployment database=registry-vpc.cn-hangzhou.aliyuncs.com/chenshi-kubernetes/mysql:8.0

deployment.extensions/mysql-deployment image updated

可以通过查看 describe 信息:kubectl describe deployment