2023-06-01|閱讀時間 ‧ 約 15 分鐘

Kubernetes Deployment:Overview

什麼是 Kubernetes Deployment?

一樣先來個官網解說
Deployment provides declarative updates for Pods and ReplicaSets.
You describe a desired state in a Deployment, and the Deployment Controller changes the actual state to the desired state at a controlled rate. You can define Deployments to create new ReplicaSets, or to remove existing Deployments and adopt all their resources with new Deployments.
跟ReplicaSet不同,Deployment的工作主要是為 pod & replicaset 提供了一個宣告式的設定 & 更新方式,透過定義 desired status,Deployment controller 會在所謂的 controlled rate 下達到使用者所期望的狀態,這些機制是由 k8s 自動化完成,因此官方建議應該透過 Deployment 來佈署 pod & replicaset。

為什麼需要Deployment

因為Pod無法實現自我更新,必須砍掉重建後才會是新的內容,這樣會導致服務中斷,有了Deployment的出現,對Pod進行管理與版本控制,而在Deployment的背後使用Replicaset來確保指定數量的Pod運行,在更新方面,可根據指定的更新策略來控制版本更新。

Deployment是如何運作的

在k8s中,Pod是最小的資源單位,Pod的副本管理是透過Replicaset實現,而Deployment則是控制Replicaset,並不是直接對Pod進行管理。

甚麼時候使用Deployment

Deployment 在以下情況下適合使用:
  1. 應用程式的部署和管理:Deployment 提供了一個方便且可靠的方式來部署和管理應用程式。它允許您定義應用程式的配置,包括容器映像、資源需求、環境變數等,並確保指定數量的 Pod 在運行。
  2. 滾動更新和回滾:當需要對應用程式進行更新時,Deployment 提供了滾動更新的能力。它可以逐步部署新版本的應用程式,同時確保舊版本的 Pod 在新版本完全運行之前持續提供服務。如果新版本出現問題,Deployment 還允許回滾到先前的版本。
  3. 應用程式的擴展性和負載均衡:Deployment 允許指定應用程式的副本數,以根據需求自動擴展或收縮應用程式的副本數。這使得應用程式能夠彈性地應對流量的變化,確保高效的資源利用和良好的用戶體驗。
  4. 高可用性和容錯能力:Deployment 通過管理多個 Pod 的運行,提供了高可用性和容錯能力。如果某個 Pod 發生故障或需要進行維護,Deployment 會自動替換它,確保應用程式持續運行並提供無中斷的服務。
  5. 多環境部署:如果需要在不同的環境中部署應用程式(如開發、測試、正式),Deployment 提供了一致的部署方式,確保在不同環境中的應用程式配置和版本的一致性,簡化了部署和管理的流程。

Deployment有哪些特性

  1. 產生並管理 ReplicaSet:Deployment 可以自動創建和管理與其關聯的 ReplicaSet 物件。ReplicaSet 確保指定數量的 Pod 實例正在運行,並根據 Deployment 物件的配置來維護所需的 Pod 數量。
  2. 滾動更新和回滾:Deployment 提供了滾動更新的能力,使您能夠逐步將新版本的應用程式部署到生產環境中,同時確保舊版本的 Pod 在新版本完全運行之前持續提供服務。如果新版本出現問題,Deployment 還允許您輕鬆地回滾到先前的版本。
  3. 健康檢查和自我修復:Deployment 可以定期檢查 Pod 的健康狀態,並根據定義的健康檢查條件進行自我修復。如果 Pod 遇到故障或不符合健康檢查條件,Deployment 會自動替換該 Pod,以確保應用程式的高可用性。
  4. 部署策略:Deployment 允許您指定部署策略,例如最大並行部署數量、最大不可用 Pod 數量等。這些策略可用於控制部署的速度和可靠性,並減少對應用程式的影響。
  5. 環境變數和資源配置:Deployment 允許您在運行中的應用程式上動態配置環境變數和資源需求。這使得在不中斷服務的情況下,可以調整應用程式的配置,例如修改連接字串、調整內存和CPU的資源分配等。
  6. 多環境部署:Deployment 可以用於在不同環境(如開發、測試、生產)中部署應用程式,並提供一致的部署方式和管理能力。這使得在不同環境中保持應用程式配置和版本的一致性變得更容易。

如何使用Deployment

創建deployment
apiVersion: apps/v1                     # 定義api版本
kind: Deployment                        # 定義資源類型  
metadata:                               # 定義元數據
 name: nginx-deployment
 labels:
   app: nginx
spec:
 strategy:                       
type: RollingUpdate             # 更新策略
rollingUpdate:                
 maxUnavailable: 25%           # 當更新時,無法使用的Pod佔整體Pod數量的比例
 maxSurge: 25%                 # 當更新時,Pod可以超過desired status數量的比例
 progressDeadlineSeconds: 600          # 部屬的最長等待時間,當超過則回報"failed progressing"
 minReadySeconds: 0                    # 服務部屬後準備到可接收流量的時間
 revisionHistoryLimit: 10              # 可rollback的版本數
 replicas: 3                           # 副本數
 selector:                             # 定義label selector
   matchLabels:
     app: nginx
 template:                             # pod template
   metadata:
     labels:
       app: nginx
   spec:
     containers:
     - name: nginx
       image: nginx:1.14.2
       ports:
       - containerPort: 80
       resources:
         requests:
           cpu: 200m
           memory: 512Mi

查看Deployment
> kubectl get deployments.apps
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           24m
> kubectl get deployments.apps -o wide
NAME               READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES      SELECTOR
nginx-deployment   3/3     3            3           24m   nginx        nginx:1.8   app=nginx

更新Deployment
  • 更新image版本
> kubectl set image deployment nginx-deployment nginx=nginx:1.9
deployment.apps/nginx-deployment image updated
> kubectl get deployments.apps -o wide
NAME               READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES      SELECTOR
nginx-deployment   3/3     1            3           37m   nginx        nginx:1.9   app=nginx
  • 查看更新狀態
> kubectl rollout status deployment nginx-deployment
deployment "nginx-deployment" successfully rolled out
  • 修改pod template
> kubectl edit deployment nginx-deployment

回退Deployment
  • 檢查Deployment的升級歷史紀錄
> kubectl rollout history deployment nginx-deployment
deployment.apps/nginx-deployment
REVISION  CHANGE-CAUSE
1         nginx:1.7.9
2         nginx:1.8
  • 查看特定版本的紀錄
> kubectl rollout history deployment nginx-deployment --revision=2
deployment.apps/nginx-deployment with revision #2
Pod Template:
 Labels:       app=nginx
       pod-template-hash=58f44756c
 Annotations:  kubernetes.io/change-cause: nginx:1.8
 Containers:
  nginx:
   Image:      nginx:1.8
   Port:       80/TCP
   Host Port:  0/TCP
   Environment:        <none>
   Mounts:     <none>
 Volumes:      <none>
  • 回退到指定版本
> kubectl rollout undo deployment nginx-deployment --to-revision 1
deployment.apps/nginx-deployment rolled back

擴縮Deployment
  • 指定數量
> kubectl scale deployment nginx-deployment --replicas 2
deployment.apps/nginx-deployment scaled
  • 水平自動擴縮,根據當前Pod的CPU利用率當作擴縮依據
kubectl autoscale deployment nginx-deployment --max 5 --min 3 --cpu-percent 70
如果是使用minikube,得啟用metrics-server的addonminikube addons list ## 查看minikube的addon minikube addons enable metrics-server ## 啟用metrics-server的addon

暫停和恢復Deployment
> kubectl rollout pause deployment nginx-deployment
deployment.apps/nginx-deployment paused

> kubectl rollout resume deployment nginx-deployment
deployment.apps/nginx-deployment resumed
在暫停期間任意修改deployment都不會更新,暫停前的狀態將繼續它的功能

Deployment cheat sheet

Reference

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.