应用更新与回滚
[root@k8s-master01 ~]# kubectl create namespace replicaset namespace/replicaset created [root@k8s-master01 ~]# vim replicaset-demo.yaml [root@k8s-master01 ~]# vim replicaset-demo.yaml [root@k8s-master01 ~]# kubectl apply -f replicaset-demo.yaml replicaset.apps/replicaset-demo created [root@k8s-master01 ~]# kubectl get replicaset/replicaset-demo -n replicaset -o wide NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR replicaset-demo 3 3 3 52s demoapp ikubernetes/demoapp:v1.0 app=demoapp,release=stable [root@k8s-master01 ~]# kubectl get pods -n replicaset -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES replicaset-demo-k5w6g 1/1 Running 0 2m34s 10.244.2.34 k8s-node01 <none> <none> replicaset-demo-nqrc8 1/1 Running 0 2m34s 10.244.3.39 k8s-node03 <none> <none> replicaset-demo-z7nmb 0/1 Running 2 2m34s 10.244.1.34 k8s-node02 <none> <none> [root@k8s-master01 ~]# kubectl get pods -n replicaset -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES replicaset-demo-k5w6g 1/1 Running 0 2m49s 10.244.2.34 k8s-node01 <none> <none> replicaset-demo-nqrc8 1/1 Running 0 2m49s 10.244.3.39 k8s-node03 <none> <none> replicaset-demo-z7nmb 1/1 Running 2 2m49s 10.244.1.34 k8s-node02 <none> <none>
下面进行测试手动更改一个副本的标签选择器,来表示作用域中pod对象之上的容器意外删除等等故障
[root@k8s-master01 ~]# kubectl get replicaset/replicaset-demo -n replicaset -o wide NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR replicaset-demo 3 3 3 19m demoapp ikubernetes/demoapp:v1.0 app=demoapp,release=stable [root@k8s-master01 ~]# kubectl get pods -l app=demoapp,release=stable -n replicaset -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES replicaset-demo-k5w6g 1/1 Running 0 19m 10.244.2.34 k8s-node01 <none> <none> replicaset-demo-nqrc8 1/1 Running 0 19m 10.244.3.39 k8s-node03 <none> <none> replicaset-demo-z7nmb 1/1 Running 8 19m 10.244.1.34 k8s-node02 <none> <none> [root@k8s-master01 ~]# pod=$(kubectl get pods -l app=demoapp,release=stable -n replicaset -o jsonpath={.items[1].metadata.name}) [root@k8s-master01 ~]# [root@k8s-master01 ~]# echo $pod replicaset-demo-nqrc8 [root@k8s-master01 ~]#
上面我们随机获取了作用域内的一个pod对象
下面我们删除其中一个标签,验证是否生成新的pod对象
[root@k8s-master01 ~]# kubectl label pod $pod app- -n replicaset pod/replicaset-demo-nqrc8 labeled [root@k8s-master01 ~]# kubectl get pods -l app=demoapp,release=stable -n replicaset -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES replicaset-demo-265lx 0/1 Running 0 23s 10.244.3.40 k8s-node03 <none> <none> replicaset-demo-k5w6g 1/1 Running 0 24m 10.244.2.34 k8s-node01 <none> <none> replicaset-demo-z7nmb 1/1 Running 8 24m 10.244.1.34 k8s-node02 <none> <none> [root@k8s-master01 ~]#
可以看到
replicaset-demo-nqrc8
这个pod对象没有了
重新生成一个pod对象
replicaset-demo-265lx
[root@k8s-master01 ~]# kubectl get pods -n replicaset --show-labels NAME READY STATUS RESTARTS AGE LABELS replicaset-demo-265lx 1/1 Running 0 9m57s app=demoapp,release=stable replicaset-demo-k5w6g 1/1 Running 0 34m app=demoapp,release=stable replicaset-demo-nqrc8 1/1 Running 0 34m release=stable replicaset-demo-z7nmb 1/1 Running 8 34m app=demoapp,release=stable
通过--show-labels 参数可以看到此前的pod对象依然存在,但是它成为了自主式pod对象
下面将移出去的pod再通过修改标签添加回来
[root@k8s-master01 ~]# kubectl label pods -n replicaset $pod app=demoapp pod/replicaset-demo-nqrc8 labeled [root@k8s-master01 ~]# kubectl get pods -n replicaset --show-labels NAME READY STATUS RESTARTS AGE LABELS replicaset-demo-265lx 1/1 Terminating 0 14m app=demoapp,release=stable replicaset-demo-k5w6g 1/1 Running 0 38m app=demoapp,release=stable replicaset-demo-nqrc8 1/1 Running 0 38m app=demoapp,release=stable replicaset-demo-z7nmb 1/1 Running 8 38m app=demoapp,release=stable
可以看到已经触发控制器删除了多余的pod对象
下面进行应用更新与回滚
[root@k8s-master01 ~]# vim /yaml/replicaset-demo.yaml [root@k8s-master01 ~]# cat /yaml/replicaset-demo.yaml apiVersion: apps/v1 kind: ReplicaSet metadata: name: replicaset-demo namespace: replicaset spec: minReadySeconds: 3 replicas: 3 selector: matchLabels: app: demoapp release: stable template: metadata: labels: app: demoapp release: stable spec: containers: - name: demoapp image: ikubernetes/demoapp:v1.1 ports: - name: http containerPort: 80 livenessProbe: httpGet: path: '/livez' port: 80 initialDelaySeconds: 5 readinessProbe: httpGet: path: '/readyz' port: 80 initialDelaySeconds: 15 [root@k8s-master01 ~]# kubectl apply -f /yaml/replicaset-demo.yaml replicaset.apps/replicaset-demo configured
我们已经将镜像版本由v1.0改为v1.1
[root@k8s-master01 ~]# kubectl get pods -n replicaset -l app=demoapp,release=stable -o jsonpath='{range .items[*]} [{.metadata.name}, {.spec.containers[0].image}]{"\n"}{end}' [replicaset-demo-k5w6g, ikubernetes/demoapp:v1.0] [replicaset-demo-nqrc8, ikubernetes/demoapp:v1.0] [replicaset-demo-z7nmb, ikubernetes/demoapp:v1.0] [root@k8s-master01 ~]#
通过命令及返回的结果,证实了更新模板不会对现在的pod对象产生实质影响
常见的更新机制有2种
1.单批次替换
2.多批次替换
为了测试这2种效果,我们在replicaset-demo的作用域内的各pod对象创建一个ClusterIP类型的Service对象,以方便客户端在更新过程中进行测试请求。配置文件为service-for-replicaset-demo.yaml
[root@k8s-master01 ~]# cat /yaml/service-for-replicaset-demo.yaml apiVersion: v1 kind: Service metadata: name: demoapp namespace: replicaset spec: type: ClusterIP selector: app: demoapp release: stable ports: - name: http port: 80 protocol: TCP targetPort: 80 [root@k8s-master01 ~]# kubectl apply -f /yaml/service-for-replicaset-demo.yaml service/demoapp created [root@k8s-master01 ~]#
下面来进行单批次测试更新
在管理节点上重新打开一个新的终端,创建一个临时的客户端pod,并发起持续性请求测试,来验证单批次更新过程是否发生中断服务
[root@k8s-master01 ~]# kubectl run pod-$RANDOM --image=ikubernetes/admin-toolbox:v1.0 -n replicaset -it --rm --command -- /bin/sh If you don't see a command prompt, try pressing enter. [root@pod-29638 /]# while true; do curl --connect-timeout 1 demoapp.replicaset.svc; sleep 1; done iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-z7nmb, ServerIP: 10.244.1.34! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-z7nmb, ServerIP: 10.244.1.34! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-nqrc8, ServerIP: 10.244.3.39! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-k5w6g, ServerIP: 10.244.2.34! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-nqrc8, ServerIP: 10.244.3.39! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-nqrc8, ServerIP: 10.244.3.39! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-k5w6g, ServerIP: 10.244.2.34! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-nqrc8, ServerIP: 10.244.3.39! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-nqrc8, ServerIP: 10.244.3.39! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-nqrc8, ServerIP: 10.244.3.39! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-nqrc8, ServerIP: 10.244.3.39! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-z7nmb, ServerIP: 10.244.1.34! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-z7nmb, ServerIP: 10.244.1.34! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-k5w6g, ServerIP: 10.244.2.34! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-z7nmb, ServerIP: 10.244.1.34! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-nqrc8, ServerIP: 10.244.3.39! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-k5w6g, ServerIP: 10.244.2.34! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-z7nmb, ServerIP: 10.244.1.34! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-z7nmb, ServerIP: 10.244.1.34! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-z7nmb, ServerIP: 10.244.1.34! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-z7nmb, ServerIP: 10.244.1.34! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-nqrc8, ServerIP: 10.244.3.39! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-z7nmb, ServerIP: 10.244.1.34! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-k5w6g, ServerIP: 10.244.2.34! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-z7nmb, ServerIP: 10.244.1.34! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-k5w6g, ServerIP: 10.244.2.34! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-nqrc8, ServerIP: 10.244.3.39! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-k5w6g, ServerIP: 10.244.2.34! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-nqrc8, ServerIP: 10.244.3.39! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-z7nmb, ServerIP: 10.244.1.34! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-k5w6g, ServerIP: 10.244.2.34! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-z7nmb, ServerIP: 10.244.1.34! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-nqrc8, ServerIP: 10.244.3.39! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-nqrc8, ServerIP: 10.244.3.39! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-nqrc8, ServerIP: 10.244.3.39! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-z7nmb, ServerIP: 10.244.1.34! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-k5w6g, ServerIP: 10.244.2.34! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-k5w6g, ServerIP: 10.244.2.34! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-nqrc8, ServerIP: 10.244.3.39! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-k5w6g, ServerIP: 10.244.2.34! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-z7nmb, ServerIP: 10.244.1.34! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-k5w6g, ServerIP: 10.244.2.34! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-nqrc8, ServerIP: 10.244.3.39! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-nqrc8, ServerIP: 10.244.3.39! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-nqrc8, ServerIP: 10.244.3.39! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-k5w6g, ServerIP: 10.244.2.34! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-z7nmb, ServerIP: 10.244.1.34! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-z7nmb, ServerIP: 10.244.1.34! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-k5w6g, ServerIP: 10.244.2.34! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-k5w6g, ServerIP: 10.244.2.34! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-nqrc8, ServerIP: 10.244.3.39! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-nqrc8, ServerIP: 10.244.3.39! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-nqrc8, ServerIP: 10.244.3.39! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-k5w6g, ServerIP: 10.244.2.34! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-nqrc8, ServerIP: 10.244.3.39! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-z7nmb, ServerIP: 10.244.1.34! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-z7nmb, ServerIP: 10.244.1.34! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-k5w6g, ServerIP: 10.244.2.34! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-nqrc8, ServerIP: 10.244.3.39! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-z7nmb, ServerIP: 10.244.1.34! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-k5w6g, ServerIP: 10.244.2.34! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-nqrc8, ServerIP: 10.244.3.39! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-k5w6g, ServerIP: 10.244.2.34! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-nqrc8, ServerIP: 10.244.3.39! iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.35, ServerName: replicaset-demo-z7nmb, ServerIP: 10.244.1.34! curl: (28) Connection timed out after 1000 milliseconds curl: (28) Connection timed out after 1000 milliseconds curl: (28) Connection timed out after 1000 milliseconds curl: (28) Connection timed out after 1000 milliseconds
刚开始交互过程访问正常,待
kubectl delete pods -n replicaset -l app=demoapp,release=stable
将pod删除后,访问变成不通
验证完成,停止测试
[root@k8s-master01 ~]# kubectl get pods -n replicaset -o wide --show-labels NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS pod-29638 1/1 Running 0 31m 10.244.1.35 k8s-node02 <none> <none> run=pod-29638 这个pod是创建的临时客户端pod发起测试请求 replicaset-demo-clggt 1/1 Running 6 28m 10.244.3.41 k8s-node03 <none> <none> app=demoapp,release=stable replicaset-demo-q2kc4 1/1 Running 0 28m 10.244.1.36 k8s-node02 <none> <none> app=demoapp,release=stable replicaset-demo-q7ts7 1/1 Running 0 28m 10.244.2.35 k8s-node01 <none> <none> app=demoapp,release=stable
[root@k8s-master01 ~]# kubectl get pods -n replicaset -l app=demoapp,release=stable -o jsonpath='{range .items[*]} [{.metadata.name}, {.spec.containers[0].image}]{"\n"}{end}' [replicaset-demo-clggt, ikubernetes/demoapp:v1.1] [replicaset-demo-q2kc4, ikubernetes/demoapp:v1.1] [replicaset-demo-q7ts7, ikubernetes/demoapp:v1.1]
通过命令看到已经更新成功
下面进行多批次更新操作
[root@k8s-master01 ~]# kubectl set image replicasets/replicaset-demo demoapp="ikubernetes/demoapp:v1.2" -n replicaset
通过命令方式更换镜像版本
[root@k8s-master01 ~]# kubectl get pods -n replicaset -l app=demoapp,release=stable -o jsonpath='{range .items[*]} [{.metadata.name}, {.spec.containers[0].image}]{"\n"}{end}' [replicaset-demo-55bj9, ikubernetes/demoapp:v1.0] [replicaset-demo-6ccr9, ikubernetes/demoapp:v1.0] [replicaset-demo-b5r6n, ikubernetes/demoapp:v1.0] [replicaset-demo-sq6fb, ikubernetes/demoapp:v1.0]
当前pods和镜像信息
[root@k8s-master01 ~]# kubectl delete pods/replicaset-demo-55bj9 -n replicaset pod "replicaset-demo-55bj9" deleted [root@k8s-master01 ~]# kubectl delete pods/replicaset-demo-6ccr9 -n replicaset pod "replicaset-demo-6ccr9" deleted [root@k8s-master01 ~]# kubectl delete pods/replicaset-demo-b5r6n -n replicaset pod "replicaset-demo-b5r6n" deleted [root@k8s-master01 ~]# kubectl delete pods/replicaset-demo-sq6fb -n replicaset pod "replicaset-demo-sq6fb" deleted [root@k8s-master01 ~]# kubectl get pods -n replicaset -l app=demoapp,release=stable -o jsonpath='{range .items[*]} [{.metadata.name}, {.spec.containers[0].image}]{"\n"}{end}' [replicaset-demo-8597q, ikubernetes/demoapp:v1.2] [replicaset-demo-j6wmk, ikubernetes/demoapp:v1.2] [replicaset-demo-mq796, ikubernetes/demoapp:v1.2] [replicaset-demo-pknmk, ikubernetes/demoapp:v1.2] [root@k8s-master01 ~]#
逐个删除旧pod,最后查看pods和镜像版本
在整个过程中,客户端发出的请求没有中断,
浙公网安备 33010602011771号