寫在前面的話
上一節主要簡單的提了一下控制器都有哪些常用的,并且簡單的功能是啥,最後一并提了 ReplicaSet 控制器。
但是 ReplicaSet 一般不需要我們直接配置,多以從本節開始,開始學習 K8S 預設的控制器 Deployment。
Deployment 資源清單
和 rs 一樣,deployment 我們也可以簡寫成 deploy,先簡單的看下其資源清單的結構,如下表:
deployment | |
---|---|
apiVersion | apps/v1 |
kind | Deployment |
metadata | 和其他 metadata 一樣,包括 name / labels 等 |
spec | |
minReadySeconds | 最小準備時間 |
paused | 暫停 |
replicas | 副本數量 |
revisionHistoryLimit | 曆史版本儲存數量,預設 10 |
rollbackTo | |
revision | 復原到指定版本 |
selector | |
matchExpressions | 标簽選擇器 |
matchLabels | 标簽選擇器(一般用這個) |
strategy | |
rollingUpdate | |
maxSurge | 能被同一時間更新允許的最大 Pod 數,可以是數字或百分比 |
maxUnavailable | 同一時間不允許更新數,可以是數字或者百分比 |
type | 選擇方式,可以是 RollingUpdate(預設)或者 Recreate |
template | |
Pod 的 metadata | |
Pod 的 spec |
Deployment 示例
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-demo
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: erp
release: stable
template:
metadata:
name: deploy-container
namespace: default
labels:
app: erp
release: stable
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
- name: https
containerPort: 443
運作:我們這裡将不再使用 create 根據配置檔案建立,而是使用 apply 建立:
# 建立
kubectl apply -f deploy-demo.yaml
# 檢視
kubectl get deploy
kubectl get rs
kubectl get pods
結果如圖:

我們說過 Deployment 屬于 ReplicaSet 的更上層,是以我們建立 Deploy 之後是可以檢視到 ReplicaSet 的,而且根據命名的特點我們也可以發現:
Deploy --> ReplicaSet --> Pod 指令屬于一級一級的增加。其中 rs 名字後面的随機數其實際是模闆名稱的 hash 值。
此時我們可以做個更新測試,修改 yaml 中的鏡像版本由 v1 改為 v2:
kubectl apply -f deploy-demo.yaml
再度應用配置檢視:
kubectl get pods -l app=erp -w
通過該方法我們可以看到整個過程,完成後檢視 rs:
kubectl get rs -o wide
可以看到原來 v1 版本的 rs 在運作變成了 0,而 v2 版本的變成了 2,但是 v1 版本的 rs 并未删除。
這是由于我們儲存曆史版本的原因,也就是:
kubectl rollout history deployment deploy-demo
使用打更新檔的方式直接修改 Pod 數量:
kubectl patch deployment deploy-demo -p '{"spec":{"replicas":3}}'
同樣,我們可以使用另外的方法更新,比如更新鏡像版本:
kubectl set image deployment deploy-demo myapp=ikubernetes/myapp:v3
結果如圖:
在更新過程中,我們可以使用 pause 暫停實作金絲雀釋出:
kubectl rollout pause deployment deploy-demo
那麼他會根據更新政策進行一次更新後暫停,等待下次 resume 後完全更新:
kubectl rollout resume deployment deploy-demo
這裡就不做過多示範了。
同樣,復原曆史版本:
kubectl rollout undo deployment deploy-demo --to-revision=2
小結
其實對于 Deployment,我們需要記憶的并不多,因為之前的 Pod 和 RS 中已經将底層的知識記了一遍,我們在這裡隻是相當于在他的外面繼續套了一層套子。