应用更新与回滚

[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和镜像版本

在整个过程中,客户端发出的请求没有中断,

 
posted @ 2021-08-28 22:55  拥抱大海,面向天空  阅读(134)  评论(0)    收藏  举报