往期精彩文章 :
- 提升CKA考試勝算:一文帶你全面了解RBAC權限控制!
- 揭秘高效運維:如何用kubectl top命令實時監控K8s資源使用情況?
- CKA認證必備:掌握k8s網絡策略的關鍵要點
- 提高CKA認證成功率,CKA真題中的節點維護全攻略!
- 數據無憂,一學就會:掌握CKA認證必備的etcd備份與還原秘籍!
- 提升你的云技能:深入了解CKA認證之k8s升級秘籍!
- 揭秘CKA認證:Service四層代理的神秘面紗
- 提升CKA認證成功率:Kubernetes Ingress七層代理全攻略!
什么是Deployment
在Kubernetes中,Deployment是一種API對象,用于定義和管理Pod的部署方式。它提供了一種聲明性的方法,允許您描述應用程序的期望狀態,而不必關心具體的部署細節。Deployment的主要目標是確保所定義的Pod副本數一直運行在集群中,并支持滾動更新和回滾操作。
以下是Deployment的關鍵特性和功能:
- 聲明式配置: 使用Deployment,您可以通過YAML文件描述應用程序的期望狀態,包括Pod的數量、所使用的鏡像、端口等。
- 自動化的滾動更新: 當您需要更新應用程序時,可以通過修改Deployment的配置來實現。Deployment將負責逐步更新Pod,確保在整個過程中保持應用程序的可用性。
- 副本集管理: Deployment使用副本集(ReplicaSet)來確保指定數量的Pod實例一直運行。如果有Pod失敗或被刪除,Deployment會啟動新的Pod來替代它們。
- 滾動回滾: 如果在更新中發現問題,您可以輕松地執行回滾操作,將Deployment回退到之前的版本,從而恢復到穩定狀態。
- 自動修復: Deployment會自動監測Pod的運行狀況,并在出現故障時嘗試自動修復。如果Pod失敗,Deployment將啟動新的Pod,以確保所需數量的副本一直在運行。
Deployment基本使用
創建Deployment
創建Deployment資源有兩種方式,一種是書寫資源清單方式,一種是通過kubectl命令行的方式創建。下面的 yaml 文件定義了一個 Deployment,該 Deployment 將創建一個有 3 個 nginx Pod 副本的 ReplicaSet(副本集):
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginx
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.7.9ports:- containerPort: 80
在這個例子中:
- 將創建一個名為
nginx-deployment
的 Deployment(部署),名稱由.metadata.name
字段指定- 該 Deployment 將創建 3 個 Pod 副本,副本數量由
.spec.replicas
字段指定.spec.selector
字段指定了 Deployment 如何找到由它管理的 Pod。此案例中,我們使用了 Pod template 中定義的一個標簽(app: nginx)。對于極少數的情況,這個字段也可以定義更加復雜的規則- .template 字段包含了如下字段:
.template.metadata.labels
字段,指定了 Pod 的標簽(app: nginx).template.spec.containers[].image
字段,表明該 Pod 運行一個容器 nginx:1.7.9.template.spec.containers[].name
字段,表明該容器的名字是 nginx執行命令以創建 Deployment執行命令以創建 Deployment
執行命令以創建 Deployment
kubectl apply -f nginx-deployment.yaml
或者通過下面的命令創建
kubectl create deploy nginx-deployment --image=nginx:1.7.9 --port=80 --replicas=3
創建成功,可以通過下面的命令查詢
controlplane $ kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 10s
controlplane $ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-867765c857-24rdz 1/1 Running 0 54s
nginx-deployment-867765c857-6r86m 1/1 Running 0 54s
nginx-deployment-867765c857-xj7c5 1/1 Running 0 54s
Deploy擴容
通過修改 Deployment 的 spec.replicas
字段來指定期望的副本數。例如,現在需要把上述的nginx-deployment
的副本數修改5。可以通過kubect edit deploy nginx-deployment
進行修改。
把spec.replicas
從原來的3修改成5。保存退出編輯。然后通過如下命令查看,nginx-deployment
就成功的從3個副本數變成了5個。
controlplane $ kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 5/5 5 5 5m17s
controlplane $ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-867765c857-24rdz 1/1 Running 0 6m13s
nginx-deployment-867765c857-6r86m 1/1 Running 0 6m13s
nginx-deployment-867765c857-vfr55 1/1 Running 0 62s
nginx-deployment-867765c857-vrj4f 1/1 Running 0 62s
nginx-deployment-867765c857-xj7c5 1/1 Running 0 6m13s
或者也可通過下面的命令進行擴容
controlplane $ kubectl scale deployment nginx-deployment --replicas=5
deployment.apps/nginx-deployment scaled
滾動更新
滾動更新介紹
滾動更新是一種自動化程度較高的發布方式,用戶體驗比較平滑,是目前成熟型技術組織所采用的主流發布方式,一次滾動發布一般由若干個發布批次組成,每批的數量一般是可以配置的(可以通過發布模板定義),例如第一批1臺,第二批10%,第三批50%,第四批100%。每個批次之間留觀察間隔,通過手工驗證或監控反饋確保沒有問題再發下一批次,所以總體上滾動式發布過程是比較緩慢的。
查看控制器策略
可以通過kubectl explain deploy.spec.strategy
查看控制器策略。如下圖:
deploy更新方式
支持兩種更新,**Recreate**
和**RollingUpdate**
- Recreate是重建式更新,刪除一個更新一個
- RollingUpdate 滾動更新,定義滾動更新的更新方式的,也就是pod能多幾個,少幾個,控制更新力度的。
RollingUpdate
通過kubectl explain deploy.spec.strategy.RollingUpdate
查看滾動更新幫助文檔。如下圖:
**maxSurge(最大擴展的值)和maxUnavailable(最大不可用)用來控制滾動更新的策略,**取值范圍分為數值和百分比
- 先來看百分比
maxUnavailable: [0%, 100%]
向下取整,比如10個副本,5%的話==0.5個,但計算按照0個maxSurge: [0%, 100%]
向上取整,比如10個副本,5%的話==0.5個,但計算按照1個
- 再來看數值
maxUnavailable
: [0, 副本數]maxSurge:
[0, 副本數]
Recreate
把deploy更新策略變成Recreate
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginx
spec:replicas: 3strategy:type: Recreate
...省略...
通過以下命令更新。
kubectl apply -f deploy-demo1.yaml#另一個窗口實時監控
kubectl get pods -w
輸出的結果如下:
詳細deployment的使用可以參考如下
介紹 Deployment
Deployments
CKA真題
- 真題截圖
- 中文解析
切換 k8s 集群環境:
kubectl config use-context k8s
Task
將loadbalancer
的 deployment 管理的 Pod 的副本數擴容成 6 個。
- 參考文檔
Deployments
- 解題作答
- 切換集群環境
kubectl config use-context k8s
- 檢查現有的Pod數量
kubectl get deploy loadbalancer -o wide
- 擴容
loadbalancer
的 deployment 管理的 Pod 的副本數擴容成 6 個
kubelct scale deploy loadbalancer --replicas=6
- 檢查Pod的數量
kubectl get pod