Skip to content

antony@notes:~/kubernetes$ cat "Kubernetes-Deployment-1.md"

Kubernetes Deployment

2023-02-08· kubernetes

Kubernetes Deployment

前言

透過 Kubernetes Deployment ,將一個網站服務進行進版或退版,且服務不中斷。

操作步驟

[TOC]

建立與檢視 Depolyment Object

編輯 nginx 網站的 yaml 檔

$ echo '
apiVersion: apps/v1
kind: Deployment
metadata:
  name: depng
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: quay.io/cloudwalker/nginx:1.20
        ports:
        - containerPort: 80 '> ~/wulin/yaml/depng.yaml

建立與檢視部屬狀態

建立網站命令

$ kubectl apply -f ~/wulin/yaml/depng.yaml

螢幕輸出 :

deployment.apps/depng created

檢視網站部屬後的狀態

$ kg all --selector app=nginx
NAME                         READY   STATUS    RESTARTS   AGE
pod/depng-6d7cd45868-5mnmv   1/1     Running   0          6s
pod/depng-6d7cd45868-bzdlg   1/1     Running   0          6s

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/depng   2/2     2            2           6s

NAME                               DESIRED   CURRENT   READY   AGE
replicaset.apps/depng-6d7cd45868   2         2         2       6s

檢查事件

kubectl describe deployments depng

螢幕輸出

...以上忽略
OldReplicaSets:  <none>
NewReplicaSet:   depng-6d7cd45868 (2/2 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  25s   deployment-controller  Scaled up replica set depng-6d7cd45868 to 2

網站進版

$ kubectl set image deployment.v1.apps/depng nginx=quay.io/cloudwalker/nginx:1.21 --record 
deployment.apps/depng image updated
  • 將 image 換裝成新版 1.21
  • --record ,記錄
$ kubectl rollout status deployment.v1.apps/depng
Waiting for deployment "depng" rollout to finish: 1 out of 2 new replicas have been updated...
Waiting for deployment "depng" rollout to finish: 1 out of 2 new replicas have been updated...
Waiting for deployment "depng" rollout to finish: 1 out of 2 new replicas have been updated...
Waiting for deployment "depng" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "depng" rollout to finish: 1 old replicas are pending termination...
deployment "depng" successfully rolled out
  • 這命令要再上一個命令做完後趕快執行,不然只會看到最後一行
  • Deplyment 進版時,會先把新的 pod 建立起來,再把舊版本的 pod 刪除

檢查 image 是不是真的換裝城新版的

$ kubectl describe deployments depng
Name:                   dep1
............
Pod Template:
  Labels:  app=nginx
  Containers:
   nginx:
    Image:        quay.io/cloudwalker/nginx:1.21
    Port:         80/TCP
    Host Port:    0/TCP

進版流程驗證


OldReplicaSets:  
NewReplicaSet:   depng-59475496dc (2/2 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  71s   deployment-controller  Scaled up replica set depng-6d7cd45868 to 2
  Normal  ScalingReplicaSet  23s   deployment-controller  Scaled up replica set depng-59475496dc to 1
  Normal  ScalingReplicaSet  19s   deployment-controller  Scaled down replica set depng-6d7cd45868 to 1 from 2
  Normal  ScalingReplicaSet  19s   deployment-controller  Scaled up replica set depng-59475496dc to 2 from 1
  Normal  ScalingReplicaSet  18s   deployment-controller  Scaled down replica set depng-6d7cd45868 to 0 from 1
  • 可以看到先把新版的網站部屬一個以後,再將舊版的服務停掉一個,再把新版的網站擴充到設定的 2 個,最後舊版的全部退掉。

網站退版

將 Deployment 退回上一個版本

$ kubectl rollout undo deployment.v1.apps/depng --to-revision=1

檢查是否符合預期

$ kubectl describe deployment depng
........
  Containers:
   nginx:
    Image:        quay.io/cloudwalker/nginx:1.20
    Port:         80/TCP
    Host Port:    0/TCP
.........
OldReplicaSets:  
NewReplicaSet:   depng-6d7cd45868 (2/2 replicas created)
Events:
  Type    Reason             Age    From                   Message
  ----    ------             ----   ----                   -------
  Normal  ScalingReplicaSet  2m23s  deployment-controller  Scaled up replica set depng-6d7cd45868 to 2
  Normal  ScalingReplicaSet  95s    deployment-controller  Scaled up replica set depng-59475496dc to 1
  Normal  ScalingReplicaSet  91s    deployment-controller  Scaled down replica set depng-6d7cd45868 to 1 from 2
  Normal  ScalingReplicaSet  91s    deployment-controller  Scaled up replica set depng-59475496dc to 2 from 1
  Normal  ScalingReplicaSet  90s    deployment-controller  Scaled down replica set depng-6d7cd45868 to 0 from 1
  Normal  ScalingReplicaSet  9s     deployment-controller  Scaled up replica set depng-6d7cd45868 to 1 from 0
  Normal  ScalingReplicaSet  8s     deployment-controller  Scaled down replica set depng-59475496dc to 1 from 2
  Normal  ScalingReplicaSet  8s     deployment-controller  Scaled up replica set depng-6d7cd45868 to 2 from 1
  Normal  ScalingReplicaSet  6s     deployment-controller  Scaled down replica set depng-59475496dc to 0 from 1
  • 看倒數四筆的事件,要建立的版本會先建立,等要建立的版本會先建立好後,之前的版本才會刪除

橫向擴充服務

將 Deployment 的 pod 擴充為 3 個

$ kubectl scale deployment.v1.apps/depng --replicas=3

檢查是否符合預期

$ kubectl get deployment depng
NAME   DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
dep1   3         3         3            3           46m

$ kubectl get pods | grep depng
dep1-66f7f56f56-2rf8p   1/1     Running   0          39s
dep1-66f7f56f56-bggcn   1/1     Running   0          71s
dep1-66f7f56f56-mn589   1/1     Running   0          69s

$ kubectl delete deployment depng