iT邦幫忙

2026 iThome 鐵人賽

DAY 7
0
Kubernetes

從零開始的 Kubernetes 基礎觀念與實作系列 第 7

從零開始的 Kubernetes 基礎觀念與實作 DAY7

  • 分享至 

  • xImage
  •  

在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

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

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

image
image
接著我們來刪掉一個Pod看看
image
這裡可以看到有一個新的Pod出現了,原本的也已經不見了。
image
但是當我們需要進行應用程式版本更新,或是在更新後發生問題需要回復到之前的版本時,ReplicaSet 本身並沒有 Deployment 所提供的 Rolling Update 與 Rollback 機制。
而Deployment則可以進行滾動式更新和回滾image到之前的版本。

Deployment特性

這裡示範將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

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

 kubectl rollout history deployment/nginx-deployment

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

kubectl rollout undo deployment/nginx-deployment

image
如果要指定版本則可以使用--to-revision=[指定版本號]

輸入kubectl get replicaset -l app=nginx
image
則可以看到之前過往ReplicaSet。
Deployment會在接收到變更後建立新的ReplicaSet,並逐步調整新舊ReplicaSet所管理的Pod數量,讓新版本的Pod逐漸取代舊版本的Pod,直到更新完成。
更新完成後,舊的ReplicaSet通常不再管理運行中的Pod,但Deployment會保留這些ReplicaSet,讓我們之後可以透過Rollback回復到之前的版本,可以簡單理解為一種歷史紀錄。

小結

這裡示範及展示了ReplicaSet和Deployment的特性,下一篇會開始講StatefulSet的特性。


上一篇
從零開始的 Kubernetes 基礎觀念與實作 DAY6
下一篇
# 從零開始的 Kubernetes 基礎觀念與實作 DAY8
系列文
從零開始的 Kubernetes 基礎觀念與實作9
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言