在 kubernetes 剛出來的時期,很早就有接觸和使用,但當時畢竟只是一個研究生
並沒有太多商業上的開發經驗,雖然覺得很 k8s 很酷,但經歷一段時間的磨練和理解想重溫 K8S 的懷抱

Kubernetes

啟動 docker 附帶 kubernetes,暫時先不進行架設

觀念學習

設定撰寫

Deployment

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
apiVersion: apps/v1
kind: Deployment
metadata:
  name:  test-staging-dep # deployment 名稱
  namespace: default
  labels: # deployment 標籤
    app:  test-app
spec:
  selector:
    matchLabels: # 選擇器會管理具備此標籤的 pod
      app: test-app
  replicas: 3 # 要啟動多少個 pod 副本
  strategy:
    rollingUpdate:
      maxSurge: 50%
      maxUnavailable: 50%
    type: RollingUpdate
  template:
    metadata:
      labels: # pod 的模版指定的標籤,會受到上面 deployment 的選擇器控管
        app: test-app 
    spec:
      containers:
      - name:  test # container 名稱
        image:  192.168.123.123/library/test:0.1 # container image
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
          limits:
            cpu: 100m
            memory: 100Mi
        ports:
        - containerPort:  5000 # container 的服務端口
          protocol: UDP
        volumeMounts:
        - mountPath: /dev/shm # 掛載的位置
          name: test-volume # 使用指定的儲存空間
      volumes:
        - name: test-volume # 儲存空間的名稱
          hostPath: # 本機空間
            path: /Users/cody/Documents/github/cody0704/radio/test/logs
            type: Directory
      restartPolicy: Always # Always、OnFailure、Never

Service

透過 service 來打通 pod 內外對應的服務端口

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
apiVersion: v1
kind: Service
metadata:
  name: test-staging-svc # service 的名稱
  namespace: default
spec:
  selector:
    app: test-app
  type: LoadBalancer # ClusterIP、LoadBalancer、NodePort、ExternalIP
  sessionAffinity: None
  sessionAffinityConfig:
    clientIP:
      timeoutSeconds: 10800
  ports:
  - name: "5000"
    protocol: UDP
    port: 5000
    targetPort: 5000

滾動升版/退版

升版有三種方式

replace

首先產生一個新的 deployment.yaml

基本上就是更新相關的設定,我這邊主要透過更動 image 來確認服務的版本更新來確認是否生版成功

1
2
3
4
5
6
...
    spec:
      containers:
      - name:  test # container 名稱
        image:  192.168.123.123/library/test:0.2
...

然後執行 replace 讓設定更動

1
2
# apply
kubectl replace -f deployment.yaml --record

set image

透過 set image 直接更動當前 deployment 的 image

1
2
3
4
5
# get deployment name
kubectl get deployment -l app=test-app

# set image
kubectl set image deployments/test-staging-dep test=192.168.123.123/library/test:0.2 --record

edit

1
kubectl edit deployment test-staging-dep --record

會出現以下設定檔,然後針對該設定檔進行編輯

1
2
3
4
5
6
7
8
9
spec:
    containers:
    - image: 192.168.123.123/library/test:0.1 

# 編輯成下方,這邊也只有更動 image

spec:
    containers:
    - image: 192.168.123.123/library/test:0.2

操作

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
kubectl get deployment -l app=test-app

# 確認部屬狀態
kubectl rollout status deployment test-staging-dep
> deployment "test-staging-dep" successfully rolled out

# 暫停部屬
kubectl rollout pause deployment test-staging-dep

# 繼續部屬
kubectl rollout resume deployment test-staging-dep

# 部屬歷史,用來確認版本
kubectl rollout history deployment aic-staging-
> REVISION  CHANGE-CAUSE
  1         <none>
  2         <none>

Rollback

1
2
3
4
5
# 回到上個版本
kubectl rollout undo deploy aic-staging-dep

# 回到指定版北
kubectl rollout undo deploy my-deployment --to-revision=2

Ref

  1. Rolling Updates with Kubernetes Deployments
  2. Kubernetes 基礎教學(二)實作範例:Pod、Service、Deployment、Ingress
  3. K8S教學筆記