在 kubernetes 剛出來的時期,很早就有接觸和使用,但當時畢竟只是一個研究生
並沒有太多商業上的開發經驗,雖然覺得很 k8s 很酷,但經歷一段時間的磨練和理解想重溫 K8S 的懷抱
Kubernetes
啟動 docker 附帶 kubernetes,暫時先不進行架設
觀念學習
pod
是最小單位,擺放 container 的位置,可以啟動單個或多個 container
replic
deployment
是一個
設定撰寫
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
- Rolling Updates with Kubernetes Deployments
- Kubernetes 基礎教學(二)實作範例:Pod、Service、Deployment、Ingress
- K8S教學筆記