k8s deployment控制器:滾動升級 平滑過渡 零停機


1. 滾動升級

  • 滾動升級架構圖
    image

  • 滾動升級注釋:

    ​ 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
    
    
    • 注釋
      1. maxSurge:滾動更新過程中最大Pod副本數,確保在更新時啟動的Pod數量比期望(replicas)Pod數量最大多出25%
      2. 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM