在DAY5中有稍微提過workload和使用Deployments示範創建一個Pod,這篇會詳細介紹Deployments 和ReplicaSet及他們之間的關係。
Deployment是透過創建和管理ReplicaSet來達到滾動式更新的效果的,Deployment更新版本後會產生另一個ReplicaSet,而ReplicaSet則是創建和管理Pod並在需要時創建新的Pod來維持需求數量。
我這裡創建一個ReplicaSet
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: google-sample
labels:
app: google-samples
spec:
replicas: 2
selector:
matchLabels:
app: google-samples
template:
metadata:
labels:
app: google-samples
spec:
containers:
- name: google-samples
image: gcr.io/google-samples/hello-app:1.0
imagePullPolicy: Always
ports:
- containerPort: 5000


現在改用Deployment
則可以看到ReplicaSet後方有出現自動創建的命名後綴
Deployment會自動建立ReplicaSet,而ReplicaSet的名稱會在Deployment名稱後面加入一組由Kubernetes產生的識別字串,以區分不同版本的ReplicaSet。

ReplicaSet在DAY5中有提過主要的特性是會讓Pod維持在指定的數量,如果Pod數量有少,則會補充Pod進去。
這裡我將Pod調整為5個
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: google-sample
labels:
app: google-samples
spec:
replicas: 5
selector:
matchLabels:
app: google-samples
template:
metadata:
labels:
app: google-samples
spec:
containers:
- name: google-samples
image: gcr.io/google-samples/hello-app:1.0
imagePullPolicy: Always
ports:
- containerPort: 5000


接著我們來刪掉一個Pod看看
這裡可以看到有一個新的Pod出現了,原本的也已經不見了。
但是當我們需要進行應用程式版本更新,或是在更新後發生問題需要回復到之前的版本時,ReplicaSet 本身並沒有 Deployment 所提供的 Rolling Update 與 Rollback 機制。
而Deployment則可以進行滾動式更新和回滾image到之前的版本。
這裡示範將nginx從1.16.1進行升級到1.20
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.16.1
ports:
- containerPort: 80

我們將套用的該deployment文件導出
我們將containers中image的部分從1.16.1改成1.20然後套用回去
這裡我們查看變更的歷史紀錄
kubectl rollout history deployment/nginx-deployment

註:有3次是因為在打指令調整時可能有不小心執行到。
我們可以使用回滾指令將版本往前移動
kubectl rollout undo deployment/nginx-deployment

如果要指定版本則可以使用--to-revision=[指定版本號]
輸入kubectl get replicaset -l app=nginx
則可以看到之前過往ReplicaSet。
Deployment會在接收到變更後建立新的ReplicaSet,並逐步調整新舊ReplicaSet所管理的Pod數量,讓新版本的Pod逐漸取代舊版本的Pod,直到更新完成。
更新完成後,舊的ReplicaSet通常不再管理運行中的Pod,但Deployment會保留這些ReplicaSet,讓我們之後可以透過Rollback回復到之前的版本,可以簡單理解為一種歷史紀錄。
這裡示範及展示了ReplicaSet和Deployment的特性,下一篇會開始講StatefulSet的特性。