天天看點

【06】Kubernets:資源清單(控制器 - Deployment)

寫在前面的話

上一節主要簡單的提了一下控制器都有哪些常用的,并且簡單的功能是啥,最後一并提了 ReplicaSet 控制器。

但是 ReplicaSet 一般不需要我們直接配置,多以從本節開始,開始學習 K8S 預設的控制器 Deployment。

Deployment 資源清單

和 rs 一樣,deployment 我們也可以簡寫成 deploy,先簡單的看下其資源清單的結構,如下表:

deployment
apiVersion apps/v1 
kind Deployment
metadata 和其他 metadata 一樣,包括 name / labels 等
spec
minReadySeconds 最小準備時間
paused 暫停
replicas 副本數量
revisionHistoryLimit 曆史版本儲存數量,預設 10
rollbackTo
revision 復原到指定版本 
selector
matchExpressions 标簽選擇器
matchLabels 标簽選擇器(一般用這個)
strategy
rollingUpdate
maxSurge 能被同一時間更新允許的最大 Pod 數,可以是數字或百分比
maxUnavailable 同一時間不允許更新數,可以是數字或者百分比
type 選擇方式,可以是 RollingUpdate(預設)或者 Recreate
template
Pod 的 metadata
Pod 的 spec

Deployment 示例

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-demo
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: erp
      release: stable
  template:
    metadata:
      name: deploy-container
      namespace: default
      labels:
        app: erp
        release: stable
    spec:
      containers:
      - name: myapp
        image: ikubernetes/myapp:v1
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 80
        - name: https
          containerPort: 443      

運作:我們這裡将不再使用 create 根據配置檔案建立,而是使用 apply 建立:

# 建立
kubectl apply -f deploy-demo.yaml

# 檢視
kubectl get deploy
kubectl get rs
kubectl get pods      

結果如圖:

【06】Kubernets:資源清單(控制器 - Deployment)

我們說過 Deployment 屬于 ReplicaSet 的更上層,是以我們建立 Deploy 之後是可以檢視到 ReplicaSet 的,而且根據命名的特點我們也可以發現:

Deploy --> ReplicaSet --> Pod 指令屬于一級一級的增加。其中 rs 名字後面的随機數其實際是模闆名稱的 hash 值。

此時我們可以做個更新測試,修改 yaml 中的鏡像版本由 v1 改為 v2:

kubectl apply -f deploy-demo.yaml      

再度應用配置檢視:

kubectl get pods -l app=erp -w      

通過該方法我們可以看到整個過程,完成後檢視 rs:

kubectl get rs -o wide      
【06】Kubernets:資源清單(控制器 - Deployment)

可以看到原來 v1 版本的 rs 在運作變成了 0,而 v2 版本的變成了 2,但是 v1 版本的 rs 并未删除。

這是由于我們儲存曆史版本的原因,也就是:

kubectl rollout history deployment deploy-demo      
【06】Kubernets:資源清單(控制器 - Deployment)

使用打更新檔的方式直接修改 Pod 數量:

kubectl patch deployment deploy-demo -p '{"spec":{"replicas":3}}'      
【06】Kubernets:資源清單(控制器 - Deployment)

同樣,我們可以使用另外的方法更新,比如更新鏡像版本:

kubectl set image deployment deploy-demo myapp=ikubernetes/myapp:v3      

結果如圖: 

【06】Kubernets:資源清單(控制器 - Deployment)

在更新過程中,我們可以使用 pause 暫停實作金絲雀釋出: 

kubectl rollout pause deployment deploy-demo      

那麼他會根據更新政策進行一次更新後暫停,等待下次 resume 後完全更新:

kubectl rollout resume deployment deploy-demo      

這裡就不做過多示範了。

同樣,復原曆史版本:

kubectl rollout undo deployment deploy-demo --to-revision=2      
【06】Kubernets:資源清單(控制器 - Deployment)

小結

其實對于 Deployment,我們需要記憶的并不多,因為之前的 Pod 和 RS 中已經将底層的知識記了一遍,我們在這裡隻是相當于在他的外面繼續套了一層套子。