K8S | Deployment應用編排

主打一手「Pod」管理。

一、背景

分佈式系統的一大優勢:可以針對不同的服務制定不同的管理策略,比如發佈、更新、下線,會根據服務自身的特點採取相應的措施;

如果服務的流量小,通常採取單服務部署即可,並且可以限定其資源分配;

如果服務的流量大並且是核心的能力,通常會採用集羣的方式管理,資源分配上也會更加的傾斜,從而保證核心應用的穩定性;

這種管理策略雖然很合理,但是從技術角度來看,其實現的複雜程度度也相對較高,在Kubenetes中可以使用Deployment組件簡化服務的編排難度;

二、Deployment組件

1、簡介

通過Deployment控制器,可以對應用進行快速的編排,比如聲明Pod的發佈方式,更新和回滾策略,維持Pod副本數量;

實際上控制器並不會直接管理Pod,而是通過管理ReplicaSet間接實現Pod管理,ReplicaSet是在後臺管理的Pod,在應用部署後可以查看相關的配置文件來驗證該流程;

2、語法說明

作爲K8S的工作負載(運行的應用程序)資源,Deployment爲Pod和ReplicaSet提供聲明式的管理能力;

這裏只是一個簡單的Deployment的yaml文件,作爲生產環境中最常用的部署方式,更多的細節可以參考K8S文檔;

三、基礎用例

1、創建操作

Deployment資源腳本,容器使用【auto-serve:latest】鏡像文件;

apiVersion: apps/v1
kind: Deployment
metadata:
  name: serve-deployment
  labels: 
    app: auto-serve
spec:
  replicas: 2
  selector:
    matchLabels:
      app: auto-serve
  template:
    metadata:
      labels:
        app: auto-serve
    spec:
      containers:
        - name: auto-serve
          image: auto-serve:latest
          imagePullPolicy: Never
          ports:
            - containerPort: 8082

執行創建,然後在命令行或者控制檯界面查看相關結果;

kubectl apply -f serve-deployment.yaml

2、查看信息

查看指定【serve-deployment】信息;

kubectl get deployment/serve-deployment

NAME               READY   UP-TO-DATE   AVAILABLE   AGE
serve-deployment   2/2     2            2           5s

查看指定【serve-deployment】描述信息;

kubectl describe deployment/serve-deployment

Name:                   serve-deployment
Labels:                 app=auto-serve
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               app=auto-serve
Replicas:               2 desired | 2 updated | 2 total | 2 available | 0 unavailable
StrategyType:           RollingUpdate

Pod Template:
  Labels:  app=auto-serve
  Containers:
   auto-serve:
    Image:        auto-serve:latest
    Port:         8082/TCP
    Host Port:    0/TCP

Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable

Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  10m   deployment-controller  Scaled up replica set serve-deployment-f6f6c5bbd to 2

可以在控制檯界面查看【ReplicaSet】,或者直接從腳本文件查看相關信息;

查看上線狀態

kubectl rollout status deployment/serve-deployment

deployment "serve-deployment" successfully rolled out

查看【ReplicaSet】

kubectl get rs

NAME                         DESIRED   CURRENT   READY   AGE
serve-deployment-f6f6c5bbd   2         2         2       12m

查看【Pod】

kubectl get pods

NAME                               READY   STATUS    RESTARTS   AGE
serve-deployment-f6f6c5bbd-d8k6v   1/1     Running   0          15m
serve-deployment-f6f6c5bbd-hs6h5   1/1     Running   0          15m

3、更新操作

提供【auto-serve】多個版本的鏡像文件,用來模擬最常見的鏡像更新動作;

更新爲【1.1.1】鏡像版本

kubectl set image deployment/serve-deployment auto-serve=auto-serve:1.1.1

查看描述信息

kubectl describe deployment/serve-deployment

Name:                   serve-deployment
Labels:                 app=auto-serve
Annotations:           【deployment.kubernetes.io/revision: 2】對比此處和初次發佈的描述
Selector:               app=auto-serve
Replicas:               2 desired | 2 updated | 2 total | 2 available | 0 unavailable
RollingUpdateStrategy:  25% max unavailable, 25% max surge

Pod Template:
  Labels:  app=auto-serve
  Containers:
   auto-serve:
    Image:        auto-serve:1.1.1 【鏡像已更新】
    Port:         8082/TCP

Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable

NewReplicaSet:   serve-deployment-6d9cd7f8c6 (2/2 replicas created)

4、刪除操作

kubectl delete -f serve-deployment.yaml

四、進階用例

1、回滾操作

再次執行鏡像更新,這樣【serve-deployment】會有3個版本

kubectl set image deployment/serve-deployment auto-serve=auto-serve:2.2.2

查看歷史版本

kubectl rollout history deployment/serve-deployment

deployment.apps/serve-deployment 
REVISION  CHANGE-CAUSE
1         <none>
2         <none>
3         <none>

查看歷史版本2信息,【auto-serve】對應的鏡像版本是【1.1.1】

kubectl rollout history deployment/serve-deployment --revision=2

deployment.apps/serve-deployment with revision #2
Pod Template:
  Labels:	app=auto-serve
	pod-template-hash=6d9cd7f8c6
  Containers:
   auto-serve:
    Image:	auto-serve:1.1.1
    Port:	8082/TCP
    Host Port:	0/TCP
    Environment:	<none>
    Mounts:	<none>
  Volumes:	<none>

回滾到上個版本,即鏡像【auto-serve:1.1.1】

kubectl rollout undo deployment/serve-deployment

deployment.apps/serve-deployment rolled back

回滾到指定版本,即鏡像【auto-serve:latest】

kubectl rollout undo deployment/serve-deployment --to-revision=1

2、伸縮操作

伸縮命令

kubectl scale deployment/serve-deployment --replicas=3

deployment.apps/serve-deployment scaled

查看【ReplicaSet】信息

kubectl get rs

NAME                          DESIRED   CURRENT   READY   AGE
serve-deployment-6b47bf4db7   0         0         0       7m3s
serve-deployment-6d9cd7f8c6   0         0         0       7m17s
serve-deployment-f6f6c5bbd    3         3         3       8m10s

查看【Pod】信息

kubectl get pods

NAME                               READY   STATUS    RESTARTS   AGE
serve-deployment-f6f6c5bbd-4rvhw   1/1     Running   0          4m13s
serve-deployment-f6f6c5bbd-bwg7s   1/1     Running   0          4m15s
serve-deployment-f6f6c5bbd-mv9wt   1/1     Running   0          2m21s

3、暫停與恢復

暫停發佈

kubectl rollout pause deployment/serve-deployment

deployment.apps/serve-deployment paused

查看信息描述

kubectl describe deployment/serve-deployment

Conditions:
  Type           Status   Reason
  ----           ------   ------
  Available      True     MinimumReplicasAvailable
  Progressing    Unknown  DeploymentPaused  【注意此處的狀態】

執行更新

kubectl set image deployment/serve-deployment auto-serve=auto-serve:1.1.1

查看Pod,未觸發上線

恢復發佈,會自動執行上面的更新動作

kubectl rollout resume deployment/serve-deployment

查看【ReplicaSet】信息

kubectl get rs -o wide

NAME                          DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES              
serve-deployment-6b47bf4db7   0         0         0       14m   auto-serve   auto-serve:2.2.2    
serve-deployment-6d9cd7f8c6   3         3         3       15m   auto-serve   auto-serve:1.1.1    
serve-deployment-f6f6c5bbd    0         0         0       16m   auto-serve   auto-serve:latest   

查看【Pod】信息

kubectl get pods -o wide

NAME                                READY   STATUS    RESTARTS   AGE     IP           NODE           
serve-deployment-6d9cd7f8c6-m66cv   1/1     Running   0          2m9s    10.1.0.125   docker-desktop 
serve-deployment-6d9cd7f8c6-sk2qv   1/1     Running   0          2m11s   10.1.0.124   docker-desktop 
serve-deployment-6d9cd7f8c6-zj6p2   1/1     Running   0          2m8s    10.1.0.126   docker-desktop 

五、狀態描述

Deployment有三個核心狀態來描述其生命週期的變化:「Progressing」進行中,「Complete」已完成,「Failed」失敗;

【Progressing】

Deployment處在部署或者伸縮過程中;

當Deployment執行這些任務期間:創建新的ReplicaSet;正在爲其最新的ReplicaSet擴容;正在爲其舊有的ReplicaSets縮容;新的Pod已經就緒或者可用;

【Complete】

具有以下特徵時會被標記爲已完成狀態;

Deployment關聯的所有副本都已更新到指定的最新版本,意味着此前請求的所有更新都已完成;Deployment關聯的所有副本都可用;未運行Deployment的舊副本;

【Failed】

Deployment可能會在嘗試部署其最新的ReplicaSet受挫,一直處於未完成狀態;

造成這種情況的因素很多,可能是:配額不足,就緒探測失敗,鏡像拉取錯誤,權限不足,限制範圍問題,應用程序運行時的配置錯誤;

六、參考源碼

文檔倉庫:
https://gitee.com/cicadasmile/butte-java-note

腳本倉庫:
https://gitee.com/cicadasmile/butte-auto-parent
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章