Kubernetes Deployment 实现金丝雀发布-rollout pause/resume

创建Deployment资源

[root@k8s-master01 deployment]# cat Traffic-seperate-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: traffic-seperate-deployment
  name: traffic-seperate-deployment
spec:
  replicas: 4
  selector:
    matchLabels:
      app: traffic-seperate-deployment
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  template:
    metadata:
      labels:
        app: traffic-seperate-deployment
    spec:
      containers:
      - image: ikubernetes/demoapp:v1.0
        name: demoapp

    [root@k8s-master01 deployment]# kubectl apply -f Traffic-seperate-deployment.yaml && kubectl rollout status deployment traffic-seperate-deployment
deployment.apps/traffic-seperate-deployment created
Waiting for deployment "traffic-seperate-deployment" rollout to finish: 0 of 4 updated replicas are available...
Waiting for deployment "traffic-seperate-deployment" rollout to finish: 1 of 4 updated replicas are available...
Waiting for deployment "traffic-seperate-deployment" rollout to finish: 2 of 4 updated replicas are available...
Waiting for deployment "traffic-seperate-deployment" rollout to finish: 3 of 4 updated replicas are available...
deployment "traffic-seperate-deployment" successfully rolled out

#此时的hash值是一样的
[root@k8s-master01 deployment]# kubectl get rs
NAME                                     DESIRED   CURRENT   READY   AGE
traffic-seperate-deployment-77bdbdcbc5   4         4         4       33s


#名字为traffic-seperate-deployment-77bdbdcbc5 + 随机数
[root@k8s-master01 deployment]# kubectl get pods
NAME                                           READY   STATUS             RESTARTS         AGE
traffic-seperate-deployment-77bdbdcbc5-2zlq6   1/1     Running            0                48s
traffic-seperate-deployment-77bdbdcbc5-6g7jp   1/1     Running            0                48s
traffic-seperate-deployment-77bdbdcbc5-nfn47   1/1     Running            0                48s
traffic-seperate-deployment-77bdbdcbc5-wj8kb   1/1     Running            0                48s

更改版本

#image改为新版本
[root@k8s-master01 deployment]# vim Traffic-seperate-deployment.yaml
    - image: ikubernetes/demoapp:v1.1

[root@k8s-master01 deployment]# kubectl apply -f Traffic-seperate-deployment.yaml && kubectl rollout status deployment traffic-seperate-deployment
deployment.apps/traffic-seperate-deployment configured
Waiting for deployment "traffic-seperate-deployment" rollout to finish: 1 out of 4 new replicas have been updated...
Waiting for deployment "traffic-seperate-deployment" rollout to finish: 1 out of 4 new replicas have been updated...
Waiting for deployment "traffic-seperate-deployment" rollout to finish: 1 out of 4 new replicas have been updated...
Waiting for deployment "traffic-seperate-deployment" rollout to finish: 2 out of 4 new replicas have been updated...
Waiting for deployment "traffic-seperate-deployment" rollout to finish: 2 out of 4 new replicas have been updated...
Waiting for deployment "traffic-seperate-deployment" rollout to finish: 2 out of 4 new replicas have been updated...
Waiting for deployment "traffic-seperate-deployment" rollout to finish: 3 out of 4 new replicas have been updated...
Waiting for deployment "traffic-seperate-deployment" rollout to finish: 3 out of 4 new replicas have been updated...
Waiting for deployment "traffic-seperate-deployment" rollout to finish: 3 out of 4 new replicas have been updated...
Waiting for deployment "traffic-seperate-deployment" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "traffic-seperate-deployment" rollout to finish: 1 old replicas are pending termination...
deployment "traffic-seperate-deployment" successfully rolled out

#由于模板改变了 Hash码也改变了 rs 也多了一个版本
#traffic-seperate-deployment-565b945b98
[root@k8s-master01 deployment]# kubectl get rs
NAME                                     DESIRED   CURRENT   READY   AGE
traffic-seperate-deployment-565b945b98   4         4         4       66s
traffic-seperate-deployment-77bdbdcbc5   0         0         0       3m46s

#查看历史版本更新情况  rollout history
[root@k8s-master01 deployment]# kubectl rollout history deployment traffic-seperate-deployment
deployment.apps/traffic-seperate-deployment
REVISION  CHANGE-CAUSE
1         <none>
2         <none>

#现在要回滚到上一次版本
[root@k8s-master01 deployment]# kubectl rollout undo deployment traffic-seperate-deployment
deployment.apps/traffic-seperate-deployment rolled back

[root@k8s-master01 deployment]# kubectl get rs
NAME                                     DESIRED   CURRENT   READY   AGE
traffic-seperate-deployment-565b945b98   0         0         0       3m37s
traffic-seperate-deployment-77bdbdcbc5   4         4         4       6m17s
#history 自动加一个版本
[root@k8s-master01 deployment]# kubectl rollout history deployment traffic-seperate-deployment
deployment.apps/traffic-seperate-deployment
REVISION  CHANGE-CAUSE
2         <none>
3         <none>
#需要回滚到指定版本 --to-revision=2
[root@k8s-master01 deployment]# kubectl rollout undo deployment  traffic-seperate-deployment --to-revision=2
deployment.apps/traffic-seperate-deployment rolled back

 实现Deployment 金丝雀发布

[root@k8s-master01 deployment]# vim service.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    app: traffic-seperate-deployment-svc
  name: traffic-seperate-deployment-svc
spec:
  ports:
  - name: 80-80
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: traffic-seperate-deployment
  type: LoadBalancer

[root@k8s-master01 deployment]# kubectl apply -f service.yaml
service/traffic-seperate-deployment-svc created

[root@k8s-master01 deployment]# kubectl get svc
NAME                              TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)        AGE
kubernetes                        ClusterIP      10.96.0.1       <none>          443/TCP        6d
traffic-seperate-deployment-svc   LoadBalancer   10.111.235.35   192.168.40.53   80:31529/TCP   2s

#此时找个终端持续请求 v1.1 上
[root@k8s-node01 ~]# while true;do curl 192.168.40.53; sleep 2;done
iKubernetes demoapp v1.1 !! ClientIP: 172.16.85.192, ServerName: traffic-seperate-deployment-565b945b98-sxz7q, ServerIP: 172.16.58.217!
iKubernetes demoapp v1.1 !! ClientIP: 172.16.85.192, ServerName: traffic-seperate-deployment-565b945b98-554nv, ServerIP: 172.16.58.215!
iKubernetes demoapp v1.1 !! ClientIP: 172.16.85.192, ServerName: traffic-seperate-deployment-565b945b98-pjbqw, ServerIP: 172.16.32.154!
iKubernetes demoapp v1.1 !! ClientIP: 192.168.40.111, ServerName: traffic-seperate-deployment-565b945b98-g7wwk, ServerIP: 172.16.85.250!
iKubernetes demoapp v1.1 !! ClientIP: 172.16.85.192, ServerName: traffic-seperate-deployment-565b945b98-sxz7q, ServerIP: 172.16.58.217!
iKubernetes demoapp v1.1 !! ClientIP: 172.16.85.192, ServerName: traffic-seperate-deployment-565b945b98-554nv, ServerIP: 172.16.58.215!
iKubernetes demoapp v1.1 !! ClientIP: 172.16.85.192, ServerName: traffic-seperate-deployment-565b945b98-pjbqw, ServerIP: 172.16.32.154!
iKubernetes demoapp v1.1 !! ClientIP: 192.168.40.111, ServerName: traffic-seperate-deployment-565b945b98-g7wwk, ServerIP: 172.16.85.250!
iKubernetes demoapp v1.1 !! ClientIP: 172.16.85.192, ServerName: traffic-seperate-deployment-565b945b98-sxz7q, ServerIP: 172.16.58.217!
iKubernetes demoapp v1.1 !! ClientIP: 172.16.85.192, ServerName: traffic-seperate-deployment-565b945b98-554nv, ServerIP: 172.16.58.215!
iKubernetes demoapp v1.1 !! ClientIP: 172.16.85.192, ServerName: traffic-seperate-deployment-565b945b98-pjbqw, ServerIP: 172.16.32.154!
iKubernetes demoapp v1.1 !! ClientIP: 192.168.40.111, ServerName: traffic-seperate-deployment-565b945b98-g7wwk, ServerIP: 172.16.85.250!
iKubernetes demoapp v1.1 !! ClientIP: 172.16.85.192, ServerName: traffic-seperate-deployment-565b945b98-sxz7q, ServerIP: 172.16.58.217!
iKubernetes demoapp v1.1 !! ClientIP: 172.16.85.192, ServerName: traffic-seperate-deployment-565b945b98-554nv, ServerIP: 172.16.58.215!

#修改版本 并且 使用 
      - image: ikubernetes/demoapp:v1.0

[root@k8s-master01 deployment]# kubectl apply -f Traffic-seperate-deployment.yaml && kubectl rollout pause deployment traffic-seperate-deployment
deployment.apps/traffic-seperate-deployment configured
deployment.apps/traffic-seperate-deployment paused

#会多出一个pod  是当初指定 最多多出一个 traffic-seperate-deployment-77bdbdcbc5-nd27c
#因为刚增加出来就被pause了 
[root@k8s-master01 deployment]# kubectl get pods
NAME                                           READY   STATUS             RESTARTS          AGE
traffic-seperate-deployment-565b945b98-554nv   1/1     Running            0                 10m
traffic-seperate-deployment-565b945b98-g7wwk   1/1     Running            0                 10m
traffic-seperate-deployment-565b945b98-pjbqw   1/1     Running            0                 10m
traffic-seperate-deployment-565b945b98-sxz7q   1/1     Running            0                 10m
traffic-seperate-deployment-77bdbdcbc5-nd27c   1/1     Running            0                 74s
#rs traffic-seperate-deployment-77bdbdcbc5 版本只有一个
[root@k8s-master01 deployment]# kubectl get rs
NAME                                     DESIRED   CURRENT   READY   AGE
traffic-seperate-deployment-565b945b98   4         4         4       17m
traffic-seperate-deployment-77bdbdcbc5   1         1         1       19m

#此时有流量转移到v1.0
iKubernetes demoapp v1.1 !! ClientIP: 172.16.85.192, ServerName: traffic-seperate-deployment-565b945b98-pjbqw, ServerIP: 172.16.32.154!
iKubernetes demoapp v1.0 !! ClientIP: 192.168.40.111, ServerName: traffic-seperate-deployment-77bdbdcbc5-nd27c, ServerIP: 172.16.85.251!
iKubernetes demoapp v1.1 !! ClientIP: 192.168.40.111, ServerName: traffic-seperate-deployment-565b945b98-g7wwk, ServerIP: 172.16.85.250!
iKubernetes demoapp v1.1 !! ClientIP: 172.16.85.192, ServerName: traffic-seperate-deployment-565b945b98-sxz7q, ServerIP: 172.16.58.217!
iKubernetes demoapp v1.1 !! ClientIP: 172.16.85.192, ServerName: traffic-seperate-deployment-565b945b98-554nv, ServerIP: 172.16.58.215!
iKubernetes demoapp v1.1 !! ClientIP: 172.16.85.192, ServerName: traffic-seperate-deployment-565b945b98-pjbqw, ServerIP: 172.16.32.154!
iKubernetes demoapp v1.0 !! ClientIP: 192.168.40.111, ServerName: traffic-seperate-deployment-77bdbdcbc5-nd27c, ServerIP: 172.16.85.251!
iKubernetes demoapp v1.1 !! ClientIP: 192.168.40.111, ServerName: traffic-seperate-deployment-565b945b98-g7wwk, ServerIP: 172.16.85.250!

#查看你日志是否正常 
[root@k8s-master01 deployment]# kubectl logs -f traffic-seperate-deployment-77bdbdcbc5-nd27c
 * Running on http://0.0.0.0:80/ (Press CTRL+C to quit)
192.168.40.111 - - [11/Jan/2024 03:52:43] "GET / HTTP/1.1" 200 -
192.168.40.111 - - [11/Jan/2024 03:52:53] "GET / HTTP/1.1" 200 -
192.168.40.111 - - [11/Jan/2024 03:53:03] "GET / HTTP/1.1" 200 -
192.168.40.111 - - [11/Jan/2024 03:53:13] "GET / HTTP/1.1" 200 -
192.168.40.111 - - [11/Jan/2024 03:53:23] "GET / HTTP/1.1" 200 -

#日志正常可以 停止pasue 继续更新-rollout resume 此时服务没中断  流量比例慢慢的切换到1.0上 
[root@k8s-master01 deployment]# kubectl rollout resume deployment traffic-seperate-deployment
deployment.apps/traffic-seperate-deployment resumed
#此时在traffic-seperate-deployment-77bdbdcbc5 
[root@k8s-master01 deployment]# kubectl get rs
NAME                                     DESIRED   CURRENT   READY   AGE
traffic-seperate-deployment-565b945b98   0         0         0       20m
traffic-seperate-deployment-77bdbdcbc5   4         4         4       23m

[root@k8s-master01 deployment]# kubectl get pods
NAME                                           READY   STATUS             RESTARTS         AGE
traffic-seperate-deployment-77bdbdcbc5-6m49p   1/1     Running            0                67s
traffic-seperate-deployment-77bdbdcbc5-bzxh7   1/1     Running            0                65s
traffic-seperate-deployment-77bdbdcbc5-nd27c   1/1     Running            0                6m42s
traffic-seperate-deployment-77bdbdcbc5-rkl6r   1/1     Running            0                68s

#请求都到了v1.0
iKubernetes demoapp v1.0 !! ClientIP: 192.168.40.111, ServerName: traffic-seperate-deployment-77bdbdcbc5-nd27c, ServerIP: 172.16.85.251!
iKubernetes demoapp v1.0 !! ClientIP: 192.168.40.111, ServerName: traffic-seperate-deployment-77bdbdcbc5-bzxh7, ServerIP: 172.16.85.252!
iKubernetes demoapp v1.0 !! ClientIP: 172.16.85.192, ServerName: traffic-seperate-deployment-77bdbdcbc5-6m49p, ServerIP: 172.16.58.205!
iKubernetes demoapp v1.0 !! ClientIP: 172.16.85.192, ServerName: traffic-seperate-deployment-77bdbdcbc5-rkl6r, ServerIP: 172.16.32.155!
iKubernetes demoapp v1.0 !! ClientIP: 192.168.40.111, ServerName: traffic-seperate-deployment-77bdbdcbc5-nd27c, ServerIP: 172.16.85.251!
iKubernetes demoapp v1.0 !! ClientIP: 192.168.40.111, ServerName: traffic-seperate-deployment-77bdbdcbc5-bzxh7, ServerIP: 172.16.85.252!
iKubernetes demoapp v1.0 !! ClientIP: 172.16.85.192, ServerName: traffic-seperate-deployment-77bdbdcbc5-6m49p, ServerIP: 172.16.58.205!
iKubernetes demoapp v1.0 !! ClientIP: 172.16.85.192, ServerName: traffic-seperate-deployment-77bdbdcbc5-rkl6r, ServerIP: 172.16.32.155!

 

posted @ 2024-01-11 12:01  しみずよしだ  阅读(43)  评论(0)    收藏  举报