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!