Deployment控制器通常用來部署無狀態的應用,這樣可以在任意的節點上擴容或者刪除,而不用考慮資料的問題,它可以管理pod物件。
一、多副本
1.使用命令列方式建立Deployment
在dev名稱空間下建立3個副本的nginx pod
kubectl create deployment nginx --image=nginx --replicas=3 -n dev
監控建立進度
kubectl get deploy -n dev -w
可以看到副本可用數量從0變到3
2.檢視Deployment的描述
kubectl describe deploy nginx -n dev
可以看到NewReplicaSet的名稱為nginx-6799fc88d8
3.檢視Deployment管理的pod
kubectl get pod -n dev -owide --show-labels
可以看到Name列是ReplicaSet的名稱加上一串6位的隨機字串,每個pod都有自己獨立的IP。由於只有2臺worker節點,其中2個pod被排程到了同一臺節點worker02,另一個pod被排程到了worker01。
4.刪除Deployment
kubectl delete deploy nginx -n dev
刪除Deployment,會把其管理的pod一起刪除
5.使用yaml檔案建立Deployment
(1)新建dp-nginx.yaml檔案,並輸入以下內容
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
namespace: dev
spec:
replicas: 3
selector:
# Deployment會匹配與這裡設定的相同標籤內容的pod
matchLabels:
app: nginx
# pod的模板描述
template:
metadata:
#定義pod的標籤
labels:
app: nginx
spec:
containers:
- image: nginx
name: nginx
(2)建立Deployment物件
kubectl apply -f dp-nginx.yaml
檢視建立的結果
二、擴縮容
1.通過命令列擴容
先通過命令自動監聽pod的變化
kubectl get pod -n dev -owide -w
再開啟一個新的bash會話,通過以下命令擴容(增加副本數量:由3個變成5個)
kubectl scale --replicas=5 deploy/nginx -n dev
在監聽bash視窗可以看到擴容過程
2.通過命令列縮容
先通過命令自動監聽pod的變化
kubectl get pod -n dev -owide -w
再開啟一個新的bash會話,通過命令縮容(減少副本數量:由5個變成2個)
kubectl scale --replicas=2 deploy/nginx -n dev
在監聽bash視窗可以看到縮容過程
3.通過yaml檔案擴縮容
kubectl edit deployment nginx -n dev
定位到replicase引數所在行,然後修改它的值
三、自愈&故障轉移
1.自愈
手動刪除某個pod,或者某個pod異常掛掉,k8s會自動建立一個新的pod。
先通過命令自動監聽pod的變化
kubectl get pod -n dev -owide -w
再開啟一個新的bash會話,手動刪除一個pod
kubectl scale --replicas=2 deploy/nginx -n dev
在監聽bash視窗可以看到建立過程
2.故障轉移
對worker02關機,k8s需要5分鐘(可配置)才能感知從而啟動自愈功能。
通過命令自動監聽pod的變化
kubectl get pod -n dev -owide -w
大概等了5分鐘左右的時間,可以看到worker01上啟動了2個新的pod。
這個時候如果重新啟動worker02,部署在它上面的2箇舊pod會立馬刪除。
四、滾動更新
1.更改映象版本
把nginx的映象版本改為1.20
kubectl edit deploy nginx -n dev
# image: nginx:1.20
檢視滾動更新狀態
kubectl rollout status deploy nginx -n dev
監聽pod的建立過程
kubectl get pod -n dev -owide -w
檢視新建立的pod描述,確實更新成了新的映象版本
2.回滾
(1)檢視更新歷史記錄
kubectl rollout history deploy nginx -n dev
(2)檢視某個指定版本的歷史記錄詳情
kubectl rollout history deploy nginx -n dev --revision=2
(3)回滾到上次的版本
kubectl rollout undo deploy nginx -n dev
回滾完成之後,檢視新pod的描述,發現nginx映象的版本是最新的
(4)回滾到指定的版本
kubectl rollout undo deploy nginx -n dev --to-revision=2
五、總結
類似 Deployment 這樣的一個控制器,實際上都是由上半部分的控制器定義(包括期望狀態),加上下半部分的被控制物件的模板組成的