Kubernetes Deployment:Overview

閱讀時間約 14 分鐘

什麼是 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

為什麼會看到廣告
17會員
78內容數
golang
留言0
查看全部
發表第一個留言支持創作者!
wang alan的沙龍 的其他內容
Ansible K8s
閱讀時間約 2 分鐘
Kubernetes Pod:Overview
閱讀時間約 11 分鐘
Kubernetes Service:Overview
閱讀時間約 6 分鐘
使用Docker安裝GitLab
閱讀時間約 3 分鐘
vscode在wsl環境下連接ssh
閱讀時間約 2 分鐘