1. 滾動升級
-
滾動升級架構圖
-
滾動升級注釋:
K8s對Pod升級的默認策略,通過使用新版本Pod逐步更新舊版本Pod,實現零停機發布,用戶無感知。
-
滾動升級更新策略:
[root@k8s-master deployment]# vim web.yaml [root@k8s-master deployment]# cat web.yaml apiVersion: apps/v1 kind: Deployment metadata: name: web namespace: default annotations: # 記錄回滾參數 kubernetes.io/change-cause: "web.v1-nginx-1.19" #記錄到revision中的內容,記錄版本號 spec: replicas: 9 # Pod副本預期數量 revisionHistoryLimit: 10 # RS歷史版本保存數量 selector: matchLabels: app: web strategy: rollingUpdate: maxSurge: 25% # 滾動更新過程最大pod副本數 maxUnavailable: 25% # 滾動更新過程中最大不可用pod副本數, type: RollingUpdate template: metadata: labels: app: web # Pod副本的標簽 spec: containers: - name: web image: nginx:1.19 readinessProbe: # 存活檢查,如果失敗,將殺死容器,來重啟 httpGet: port: 80 path: /index.html initialDelaySeconds: 10 #啟動容器后多少秒健康檢查 periodSeconds: 10 #以后間隔多少秒檢查一次 livenessProbe: # 就緒檢查,失敗就會剔除 service httpGet: port: 80 path: /index.html
- 注釋
- maxSurge:滾動更新過程中最大Pod副本數,確保在更新時啟動的Pod數量比期望(replicas)Pod數量最大多出25%
- maxUnavailable:滾動更新過程中最大不可用Pod副本數,確保在更新時最大25%Pod數量不可用,即確保75%Pod數量是可用狀態。
- 注釋
2. 滾動升級操作
kubectl apply -f xxx.yaml
kubectl set image deployment/web nginx=nginx:1.16
kubectl edit deployment/web
3. 案例
3.1 編寫deployment的web.yaml文件
[root@k8s-master deployment]# vim web.yaml
[root@k8s-master deployment]# cat web.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
namespace: default
annotations: # 記錄回滾參數
kubernetes.io/change-cause: "web.v1-nginx-1.19" #記錄到revision中的內容,記錄版本號
spec:
replicas: 9 # Pod副本預期數量
revisionHistoryLimit: 10 # RS歷史版本保存數量
selector:
matchLabels:
app: web
strategy:
rollingUpdate:
maxSurge: 25% # 滾動更新過程最大pod副本數
maxUnavailable: 25% # 滾動更新過程中最大不可用pod副本數,
type: RollingUpdate
template:
metadata:
labels:
app: web # Pod副本的標簽
spec:
containers:
- name: web
image: nginx:1.16
readinessProbe: # 存活檢查,如果失敗,將殺死容器,來重啟
httpGet:
port: 80
path: /index.html
initialDelaySeconds: 10 #啟動容器后多少秒健康檢查
periodSeconds: 10 #以后間隔多少秒檢查一次
livenessProbe: # 就緒檢查,失敗就會剔除 service
httpGet:
port: 80
path: /index.html
3.2 啟動服務
[root@k8s-master deployment]# kubectl apply -f web.yaml
deployment.apps/web created
3.3 查看服務
[root@k8s-master deployment]# kubectl get pods
NAME READY STATUS RESTARTS AGE
web-548b65b8c6-4k8n7 1/1 Running 0 2m24s
web-548b65b8c6-7wvhj 1/1 Running 0 2m24s
web-548b65b8c6-vpmpg 1/1 Running 0 2m24s
[root@k8s-master deployment]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web-548b65b8c6-4k8n7 1/1 Running 0 2m56s 10.244.36.96 k8s-node1 <none> <none>
web-548b65b8c6-7wvhj 1/1 Running 0 2m56s 10.244.169.159 k8s-node2 <none> <none>
web-548b65b8c6-vpmpg 1/1 Running 0 2m56s 10.244.36.95 k8s-node1 <none> <none>
3.4 deployment端口暴露
[root@k8s-master deployment]# kubectl expose deployment web --port=80 --target-port=80 --type=NodePort
service/web exposed
3.5 查詢服務是否端口暴露
[root@k8s-master deployment]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6d
probe-demo ClusterIP 10.104.161.168 <none> 80/TCP 2d
web NodePort 10.98.32.199 <none> 80:30082/TCP 14s
3.6 curl請求測試
[root@k8s-master deployment]# curl -I http://192.168.0.202:30082
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Tue, 01 Dec 2020 08:28:06 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 13 Aug 2019 10:05:00 GMT
Connection: keep-alive
ETag: "5d528b4c-264"
Accept-Ranges: bytes
3.7 修改deployment的web.yaml文件實現滾動更新
[root@k8s-master deployment]# vim web.yaml [root@k8s-master deployment]# cat web.yaml apiVersion: apps/v1kind: Deploymentmetadata: name: web namespace: default annotations: # 記錄回滾參數 kubernetes.io/change-cause: "web.v1-nginx-1.19" #記錄到revision中的內容,記錄版本號spec: replicas: 9 # Pod副本預期數量 revisionHistoryLimit: 10 # RS歷史版本保存數量 selector: matchLabels: app: web strategy: rollingUpdate: maxSurge: 25% # 滾動更新過程最大pod副本數 maxUnavailable: 25% # 滾動更新過程中最大不可用pod副本數, type: RollingUpdate template: metadata: labels: app: web # Pod副本的標簽 spec: containers: - name: web image: nginx:1.18 readinessProbe: # 存活檢查,如果失敗,將殺死容器,來重啟 httpGet: port: 80 path: /index.html initialDelaySeconds: 10 #啟動容器后多少秒健康檢查 periodSeconds: 10 #以后間隔多少秒檢查一次 livenessProbe: # 就緒檢查,失敗就會剔除 service httpGet: port: 80 path: /index.html
3.8 執行配置文件更新
[root@k8s-master deployment]# kubectl apply -f web.yaml deployment.apps/web configured
3.9 查看pod服務
[root@k8s-master deployment]# kubectl get podsNAME READY STATUS RESTARTS AGEweb-65798c9f74-2r266 0/1 Terminating 0 39mweb-65798c9f74-5hl4p 1/1 Running 0 39mweb-65798c9f74-5qhgg 1/1 Running 0 39mweb-79c4bc4bd-9j4pw 0/1 ContainerCreating 0 3sweb-79c4bc4bd-pbz5m 1/1 Running 0 30s
3.10 curl 請求是否nginx是1.18版本
[root@k8s-master deployment]# curl -I http://192.168.0.202:30082HTTP/1.1 200 OKServer: nginx/1.18.0Date: Tue, 01 Dec 2020 08:31:09 GMTContent-Type: text/htmlContent-Length: 612Last-Modified: Tue, 21 Apr 2020 14:09:01 GMTConnection: keep-aliveETag: "5e9efe7d-264"Accept-Ranges: bytes