十四、Pod的升级和回滚

发布于:2024-12-18 ⋅ 阅读:(39) ⋅ 点赞:(0)

当集群中的某个服务需要升级时,我们需要停止目前与该服务相关的所有Pod,然后下载新版本镜像并创建新的Pod。如果集群规模比较大,则这个工作变成了一个挑战,而且先全部停止然后逐步升级的方式会导致较长时间的服务不可用。Kubernetes提供了滚动升级功能来解决上述问题。

如果Pod是通过Deployment创建的,则用户可以在运行时修改Deployment的Pod定义(spec.template)或镜像名称,并应用到Deployment对象上,系统即可完成Deployment的rollout动作,rollout可被视为Deployment的自动更新或者自动部署动作。如果在更新过程中发生了错误,则还可以通过回滚操作恢复Pod的版本。

一、Deployment 更新策略

创建一个 Deployment:

apiVersion: apps/v1
kind: Deployment                         # Deployment类型
metadata:
  name: nginx-deployment                 # Deployment名称
  labels:                                # Deployment标签
    app: nginx
spec:                                    # Deployment配置
  replicas: 3                            # Deployment的副本
  selector:
    matchLabels:
      app: nginx                         # Deployment管理的Pod标签
  template:                              # Pod的定义
    metadata:
      labels:                            # Pod的标签
        app: nginx
    spec:                                # Pod的配置
      containers:
      - name: nginx
        image: registry.cn-hangzhou.aliyuncs.com/cyanjiang/nginx:1.0
        ports:
        - containerPort: 80

已运行的Pod副本数量有3个:

[root@k8s-master01 deploy]#kubectl get deploy,pod
NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deployment   3/3     3            3           14s

NAME                                    READY   STATUS    RESTARTS   AGE
pod/nginx-deployment-5ddfc76b5c-hfr2k   1/1     Running   0          14s
pod/nginx-deployment-5ddfc76b5c-ptjm6   1/1     Running   0          14s
pod/nginx-deployment-5ddfc76b5c-qkkhf   1/1     Running   0          14s


1、更新 Deployment

当且仅当 Deployment 的 Pod 模板(即**.spec.template**)更改时,才会触发 Deployment更新,例如更改内存、CPU 配置或者容器的 image。

应用编排与管理:Deployment

更新过程会新建RS,然后新建一个Pod,就绪后,自动修改新旧RS策略,新的增加副本,老的减少副本,直到老的RS变为0,新的RS变成原来的副本数,逐一进行。

方式一、命令更新

直接使用命令kubectl set image修改deployment的镜像,--record并且记录。

# kubectl set image deployment nginx-deployment nginx=nginx:1.9.1 --record
deployment.extensions/nginx-deployment image updated

假如更新 Nginx Pod 的 image 使用 nginx:latest,并使用–record 记录当前更改的参数,后期回滚时可以查看到对应的信息。

方式二、编辑deploment更新

也可以使用 edit 命令直接编辑 Deployment,保存退出。效果相同:

# kubectl edit deployment.v1.apps/nginx-deployment
deployment.apps/nginx-deployment edited

… 不推荐直接使用yaml文件更新 …

长时间使用,不能确认当前yaml文件和现有deployment是否一致。如果有人有edit已经修改,不知道,再去编辑就会覆盖掉原来的配置。导出再编辑yaml文件也可以,但是需要删除很多东西。综合考虑,不推荐直接编辑yaml文件。

同样可以使用 kubectl rollout status 查看更新过程(过程很快):

# kubectl rollout status deployment.v1.apps/nginx-deployment
Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 
new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 
new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3
new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 
new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 1 old 
replicas are pending termination...
Waiting for deployment "nginx-deployment" rollout to finish: 1 old 
replicas are pending termination...
deployment "nginx-deployment" successfully rolled out

可以看出更新过程为新旧交替更新,首先新建一个 Pod,当 Pod 状态为 Running 时,删除一个旧的 Pod,同时再创建一个新的 Pod。当触发一个更新后,会有新的 ReplicaSet 产生,旧的ReplicaSet 会被保存,查看此时 ReplicaSet,可以从 AGE 或 READY 看出来新旧 ReplicaSet:

[root@k8s-master01 ~]# kubectl get rs
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-5c8578bf64   0         0         0       17h
nginx-deployment-7ffd5c8dc9   5         5         5       12m

通过describe查看Deployment的详细信息

[root@k8s-master01 ~]# kubectl describe deploy nginx-deployment
Name:                   nginx-deployment
Namespace:              default
CreationTimestamp:      Wed, 11 Oct 2023 20:40:37 +0800
Labels:                 app=nginx
Annotations:            deployment.kubernetes.io/revision: 2
                        kubernetes.io/change-cause: kubectl set image deployment nginx-deployment nginx=nginx:1.9.1 --record=true
Selector:               app=nginx
Replicas:               5 desired | 5 updated | 5 total | 5 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=nginx
  Containers:
   nginx:
    Image:        nginx:1.9.1
    Port:         80/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Progressing    True    NewReplicaSetAvailable
  Available      True    MinimumReplicasAvailable
OldReplicaSets:  nginx-deployment-5c8578bf64 (0/0 replicas created)
NewReplicaSet:   nginx-deployment-7ffd5c8dc9 (5/5 replicas created)
Events:
  Type    Reason             Age    From                   Message
  ----    ------             ----   ----                   -------
  Normal  ScalingReplicaSet  14m    deployment-controller  Scaled up replica set nginx-deployment-7ffd5c8dc9 to 2
  Normal  ScalingReplicaSet  14m    deployment-controller  Scaled down replica set nginx-deployment-5c8578bf64 to 4 from 

网站公告

今日签到

点亮在社区的每一天
去签到