從上篇中,認識到最小的部署單位為Pod,Pod的數量則是由ReplicaSet管理,而平時說到的Application,則是指最外層的Deployment,管理服務持續運作
[DEPLOYMENT-NAME]-[HASH]
[DEPLOYMENT-NAME]-[REPLICASET_HASH]-[HASH]
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3 # 預設為1, 指定數量, 會新建ReplicaSet管理
selector: # 必填: 使用標籤標記要管理哪些Pods, 對應container的label(immutable), 要自己注意別跟其它deployment的設定打架(無默契,會造成混亂)
matchLabels:
app: nginx
template: # 必填: 此Deploy Pod模板(目標狀態)
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
strategy: # optional: 更新策略
type: RollingUpdate # 預設逐步更新, 也可以是Recreate(先砍後建)
rollingUpdate:
maxSurge: 1 # 預設25% 或是 確切數值也可, 最多可超過多少目標數量(無條件進位)
maxUnavailable: 1 # 預設25% 或是 確切數值也可, 最大不可用數量(無條件捨去)
過渡期間,也就是處於關閉中的Pod不算是可用Pod,所以總和Pod數會 > 表面設定(replicas+ maxSurge),此情況延續到Pod優雅的退場完畢為止(terminationGracePeriodSeconeds)
Deployment的操作指令
# 建立Deployment(imperative),下指令必須放在最後面, 任何`--`後面的內容都被視為指令
kubectl create deployment <NAME> --image=<image> --replicas=x --port=xxx -- <command>
# 用create建立的話,需用replace更新
kubectl replace -f <檔案名稱>
kubectl replace --force -f <檔案名稱>
# 建立Deployment(declarative),更新時重apply即可
kubectl apply -f <檔案名稱>
# 取得Deployment資訊
kubectl get deployment <optional: 名稱> # 或簡稱deploy
# 查看由Deployment加給Pod的label`pod-template-hash`
kubectl get pods --show-labels
# 查看生成的ReplicaSet
kubectl get replicaset #或簡稱rs, -w 可以持續監控數量變化
# 取得Deployment詳細資訊
kubectl describe deployments <optional:deployment名稱>
# 取得Deployment換版情況
kubectl rollout status deployment/<deployment名稱>
# 更新Deployment
# 設定image
kubectl set image deployment/<deployment名稱> <container名稱>=<image名稱>
# 設定resource
kubectl set resource deployment/<deployment名稱> -c=<container名稱> --limits=cpu=200m, memory=512Mi
# 設定replicas
kubectl scale deployment/<deployment名稱> replicas=x
# 設定autoScale(建議)
kubectl autoscale deployment/<deployment名稱> --min=10 --max=5 --cpu-percent=80
# 直接修改既存的deployment(原始文件不同步異動)
kubectl edit deployment/<deployment名稱>
# 還原
kubectl rollout undo deployment/<deployment名稱> # 上一版
kubectl rollout undo deployment/<deployment名稱> --to-revision=2 # 特定版本
# 暫停/繼續版本更新
kubectl rollout pause deployment/<deployment名稱>
kubectl rollout resume deployment/<deployment名稱>
# 查看版本紀錄
kubectl rollout history deployment/<deployment名稱>
kubectl rollout history deployment/<deployment名稱> --revision=2
🎰 在前些文章提到了命名空間「namespace」,這是K8s提供的機制,將叢集分割為不同群組,依照需求將資源隔離於限定範圍,常見使用情況有,區分不同階段的環境開發和正式環境,或是說不同的專案團隊,並能進一步設定資源使用量,以日常生活比喻的話,像是線上遊戲有不同的伺服器
大多數的Object隸屬於特定namespace,部分底層的Object則否,想看詳細的內容,可下指令
# In a namespace
kubectl api-resources --namespaced=true
# Not in a namespace
kubectl api-resources --namespaced=false
K8s有幾個初始的namespace
Lease
Object,這些Lease與各node相繫,用來傳送heatbeat(刷存在感)給控制平台,用以偵測節點是否正常運行Namespace的操作指令
# 取得namespace
kubectl get namespace
# 建立namespace
kubectl create namespace <名稱XXX>
# 查詢特定namespace的pod資訊
kubectl get pods --namespace=<名稱XXX>
# 切換namespace
kubectl config set-context --current --namespace=<名稱XXX>
kubectl config view --minify | grep namespace:
REF.