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