k8s学习第9天

Pod的升级和回滚

升级

k8s使用默认使用的升级策略为Recreate(重建)和RollingUpdate(滚动更新),默认值为RollingUpdate,在Deployment定义中,可以通过spec.strategy指定pod的更新策略,

Recreate: spec.strategy=Recreate, 表示在更新pod时候,会先杀掉所有正在运行的pod,然后创建新的pod

RollingUpdate: 设置spec.strategy=RollingUpdate,表示Deployment会以滚动更新的方式来逐个更新pod,同时可以设置RollingUpdate下的两个参数:maxUnavailable 和maxSurge 来控制滚动更新的过程。

下面进行演示

apiVersion: apps/v1
kind: Deployment
metadata:
   name: nginx-delpoyment-v1
spec:
   selector:
      matchLabels:
         app: nginx
   replicas: 3
   template:
         metadata:
            labels:
               app: nginx
         spec:
           containers:
           - name: nginx
             image: nginx:1.7.9
             ports:
             - containerPort: 8
kubectl create -f d.yaml 
deployment.apps/nginx-delpoyment-v1 created

查看是否正常

kubectl get pods |grep v1
nginx-delpoyment-v1-57c68fcd95-5fj9t   1/1     Running            0                9s
nginx-delpoyment-v1-57c68fcd95-d65ng   1/1     Running            0                9s
nginx-delpoyment-v1-57c68fcd95-lwr4l   1/1     Running    

下面我们修改nginx的版本

kubectl edit deployment/nginx-delpoyment-v1

查看

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

可见每次都是滚动更新,注意只有改动了模版定义部分的属性才会触发roolout行为。t

查看 relicaSet的最终状态

[root@scms01 day8]# kubectl get rs |grep v1
nginx-delpoyment-v1-f5d9744f     3         3         3       16m

在系统升级过程中,保证至少有两个pod可用,并且最多运行4个pod,只是由Deployment通过算法完成的。Deployment需要确保整个更新过程中只有一个数量的pod处于不可用状态,默认情况下,确保可用的pod总数量至少为所需副本数量-1,也就是最多一个不可用。但是从1.6开开始 把maxUnailabe和maxSurge默认值给成了25%,25%。这样其实更合理了,在线上环境中为了加快部署一步都需要改动这两个值。

在 Kubernetes 中,maxUnavailable 和 maxSurge 是用于配置 Deployment 对象中管理的 Replication Controller 的属性。

  • maxUnavailable:指定在进行 Deployment 更新(滚动更新)时,最多可以让多少个 Pod 处于不可用状态。默认值为 25%。

  • maxSurge:指定在进行 Deployment 更新(滚动更新)时,最多可以增加多少个 Pod。默认值为 25%。

这两个参数可以用来控制滚动更新期间应同时运行的 Pod 的数量,并且可以保证您的应用程序始终可以维持所需的资源。

下面是一个示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 10
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 2
      maxSurge: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-container
          image: my-image
          ports:
            - containerPort: 80

在上面的示例中,maxUnavailable 被设置为 2,表示在进行滚动更新时,最多只能关闭 2 个 Pod。maxSurge 被设置为 1,表示在进行滚动更新时,最多只能增加 1 个 Pod。通过这些设置,我们可以确保在更新期间还有一些额外的容量来处理流量,而不会损害部署的可用性''

回滚

如果在Deployment升级过程中出现一位,比如写错镜像名称、新镜像还没有放入库中,新镜像配置文件有问题,新镜像的启动参数不对,以及可能更为复杂的依赖关系而导致的升级失败,就要回退到之前的旧版本,就时候就要Deployment的回滚功能

假如改个nginx不存在的版本

nginx:1.9.1111

kubectl edit deployment/nginx-delpoyment-v1

查看relicaSet

kubectl get rs |grep v1
nginx-delpoyment-v1-66df999fc6   1         1         0       34s

发现启动失败,查看pod

[root@scms01 day8]# kubectl get pod |grep v1
nginx-delpoyment-v1-66df999fc6-j92cp   0/1     ImagePullBackOff   0                 54s
nginx-delpoyment-v1-f5d9744f-9wzxr     1/1     Running            0                 32m
nginx-delpoyment-v1-f5d9744f-h628d     1/1     Running            0                 32m
nginx-delpoyment-v1-f5d9744f-twk26     1/1     Running            0                 32m

这时候我们就要止损,及时回滚,查看历史版本

kubectl rollout history deployment/nginx-delpoyment-v1
deployment.apps/nginx-delpoyment-v1 
REVISION  CHANGE-CAUSE
1         <none>
2         <none>
3         <none>

发现为none,是因为我create Deplolment文件的时候,没有指定--record参数,实际是应该这么启动

kubectl apply -f deployment-v1.yml --record

Revision 1.2.3含义:

  第一次是创建 nginx-deployment

  第二次是滚动更新 nginx-deployment

  第三次是再次滚动更新 nginx-deployment

 所以我们只要使用revision=2即可

[root@scms01 day8]# kubectl rollout history deployment/nginx-delpoyment-v1 --revision=2
deployment.apps/nginx-delpoyment-v1 with revision #2
Pod Template:
  Labels:       app=nginx
        pod-template-hash=f5d9744f
  Containers:
   nginx:
    Image:      nginx:1.9.1
    Port:       80/TCP
    Host Port:  0/TCP
    Environment:        <none>
    Mounts:     <none>
  Volumes:      <none>

然后撤销本次发布并回滚到上一个部署版本:

kubectl rollout undo deployment/nginx-delpoyment-v1

 或者指定revison,一次性回滚

kubectl rollout undo deployment/nginx-delpoyment-v1 --to-revision=2

查看操作过程:

[root@scms01 day8]# kubectl describe deployment/nginx-delpoyment-v1
Name:                   nginx-delpoyment-v1
Namespace:              default
CreationTimestamp:      Sun, 23 Apr 2023 14:24:28 +0800
Labels:                 <none>
Annotations:            deployment.kubernetes.io/revision: 4
Selector:               app=nginx
Replicas:               3 desired | 3 updated | 3 total | 3 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
...
...
...
  Type    Reason             Age    From                   Message
  ----    ------             ----   ----                   -------
  Normal  ScalingReplicaSet  39m    deployment-controller  Scaled up replica set nginx-delpoyment-v1-57c68fcd95 to 3
  Normal  ScalingReplicaSet  36m    deployment-controller  Scaled up replica set nginx-delpoyment-v1-f5d9744f to 1
  Normal  ScalingReplicaSet  36m    deployment-controller  Scaled down replica set nginx-delpoyment-v1-57c68fcd95 to 2 from 3
  Normal  ScalingReplicaSet  36m    deployment-controller  Scaled up replica set nginx-delpoyment-v1-f5d9744f to 2 from 1
  Normal  ScalingReplicaSet  36m    deployment-controller  Scaled down replica set nginx-delpoyment-v1-57c68fcd95 to 1 from 2
  Normal  ScalingReplicaSet  36m    deployment-controller  Scaled up replica set nginx-delpoyment-v1-f5d9744f to 3 from 2
  Normal  ScalingReplicaSet  36m    deployment-controller  Scaled down replica set nginx-delpoyment-v1-57c68fcd95 to 0 from 1
  Normal  ScalingReplicaSet  5m18s  deployment-controller  Scaled up replica set nginx-delpoyment-v1-66df999fc6 to 1
  Normal  ScalingReplicaSet  19s    deployment-controller  Scaled down replica set nginx-delpoyment-v1-66df999fc6 to 0 from 1

暂停和恢复Deployment的部署操作

对于一次复杂的Deployment配置修改,为了避免频繁触发Deployment的更新操作,可以先暂停更新操作,然后就行配置修改,再恢复Deployment,一次性触发完整更新操作,就可以避免不必要的Deployment更新操作

先暂停

[root@scms01 day8]# kubectl rollout pause deployment/nginx-delpoyment-v1 
deployment.apps/nginx-delpoyment-v1 paused

修改资源配置可以通过edit命令,也可以直接通过下面的方式

kubectl set resources  deployment nginx-delpoyment-v1 -c=nginx -- imits=cpu=200m,memory=512Mi

我们可以看下修改后的文件

[root@scms01 day8]# kubectl edit  deployment/nginx-delpoyment-v1
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "4"
  creationTimestamp: "2023-04-23T06:24:28Z"
  generation: 6
  name: nginx-delpoyment-v1
  namespace: default
  resourceVersion: "3713238"
  uid: e2a28c3a-6dd8-4e80-99e8-3f3b22e46902
spec:
  paused: true
  progressDeadlineSeconds: 600
  replicas: 3
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: nginx
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.9.1
        imagePullPolicy: IfNotPresent
        name: nginx
        ports:
        - containerPort: 80
          protocol: TCP
        resources:
          limits:
            cpu: 200m
            memory: 512Mi

看下描述信息

kubectl describe deployment/nginx-delpoyment-v1
...
Events:
  Type    Reason             Age    From                   Message
  ----    ------             ----   ----                   -------
  Normal  ScalingReplicaSet  39m    deployment-controller  Scaled up replica set nginx-delpoyment-v1-57c68fcd95 to 3
  Normal  ScalingReplicaSet  36m    deployment-controller  Scaled up replica set nginx-delpoyment-v1-f5d9744f to 1
  Normal  ScalingReplicaSet  36m    deployment-controller  Scaled down replica set nginx-delpoyment-v1-57c68fcd95 to 2 from 3
  Normal  ScalingReplicaSet  36m    deployment-controller  Scaled up replica set nginx-delpoyment-v1-f5d9744f to 2 from 1
  Normal  ScalingReplicaSet  36m    deployment-controller  Scaled down replica set nginx-delpoyment-v1-57c68fcd95 to 1 from 2
  Normal  ScalingReplicaSet  36m    deployment-controller  Scaled up replica set nginx-delpoyment-v1-f5d9744f to 3 from 2
  Normal  ScalingReplicaSet  36m    deployment-controller  Scaled down replica set nginx-delpoyment-v1-57c68fcd95 to 0 from 1
  Normal  ScalingReplicaSet  5m28s  deployment-controller  Scaled up replica set nginx-delpoyment-v1-66df999fc6 to 1
  Normal  ScalingReplicaSet  29s    deployment-controller  Scaled down replica set nginx-delpoyment-v1-66df999fc6 to 0 from 1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值