什麼是 Kubernetes Deployment?
一樣先來個官網解說
A 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 在以下情況下適合使用:
應用程式的部署和管理:Deployment 提供了一個方便且可靠的方式來部署和管理應用程式。它允許您定義應用程式的配置,包括容器映像、資源需求、環境變數等,並確保指定數量的 Pod 在運行。 滾動更新和回滾:當需要對應用程式進行更新時,Deployment 提供了滾動更新的能力。它可以逐步部署新版本的應用程式,同時確保舊版本的 Pod 在新版本完全運行之前持續提供服務。如果新版本出現問題,Deployment 還允許回滾到先前的版本。 應用程式的擴展性和負載均衡:Deployment 允許指定應用程式的副本數,以根據需求自動擴展或收縮應用程式的副本數。這使得應用程式能夠彈性地應對流量的變化,確保高效的資源利用和良好的用戶體驗。 高可用性和容錯能力:Deployment 通過管理多個 Pod 的運行,提供了高可用性和容錯能力。如果某個 Pod 發生故障或需要進行維護,Deployment 會自動替換它,確保應用程式持續運行並提供無中斷的服務。 多環境部署:如果需要在不同的環境中部署應用程式(如開發、測試、正式),Deployment 提供了一致的部署方式,確保在不同環境中的應用程式配置和版本的一致性,簡化了部署和管理的流程。
Deployment有哪些特性
產生並管理 ReplicaSet:Deployment 可以自動創建和管理與其關聯的 ReplicaSet 物件。ReplicaSet 確保指定數量的 Pod 實例正在運行,並根據 Deployment 物件的配置來維護所需的 Pod 數量。 滾動更新和回滾:Deployment 提供了滾動更新的能力,使您能夠逐步將新版本的應用程式部署到生產環境中,同時確保舊版本的 Pod 在新版本完全運行之前持續提供服務。如果新版本出現問題,Deployment 還允許您輕鬆地回滾到先前的版本。 健康檢查和自我修復:Deployment 可以定期檢查 Pod 的健康狀態,並根據定義的健康檢查條件進行自我修復。如果 Pod 遇到故障或不符合健康檢查條件,Deployment 會自動替換該 Pod,以確保應用程式的高可用性。 部署策略:Deployment 允許您指定部署策略,例如最大並行部署數量、最大不可用 Pod 數量等。這些策略可用於控制部署的速度和可靠性,並減少對應用程式的影響。 環境變數和資源配置:Deployment 允許您在運行中的應用程式上動態配置環境變數和資源需求。這使得在不中斷服務的情況下,可以調整應用程式的配置,例如修改連接字串、調整內存和CPU的資源分配等。 多環境部署: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
> 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
> kubectl edit deployment nginx-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