Kubernetes 教學系列 - ReplicaSet 管理 Pods 的更彈性應用

上次介紹了 Replication Controller 如何去管理 Pods:Kubernetes 教學系列 - Replication-Controller 管理 Pods 的應用,但是現在根據官網的說法並不推薦使用 Replication Controller,原因在於它的功能有限無法支持滾動更新,再來對於 selector 的方式也不夠有彈性,因此官方更推薦使用 Replica Set 來進行管理。因此今天這篇文章來介紹如何透過 Replica Set 來對 Pods 來進行管理。

Replica Set 功能介紹

  • 與 Replication Controller 類似用來管理一群 Pods
  • 透過 selector 來識別要選擇哪些 Pod 進行管理
  • 每個 ReplicaSet 可以根據需求建立或刪除 Pod 使得副本數目達到期望值
  • ReplicaSet 透過 Pod 上的 metadata.ownerReferences 欄位來連接到 Pod

建立 Replica Set

使用 matchLabels 的方式建立

直接上設定檔範例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: web-app-replica-set
labels:
app: web-app-pod
spec:
replicas: 3
selector:
matchLabels:
app: web-app-pod
template:
metadata:
labels:
app: web-app-pod
spec:
containers:
- name: web-app
image: kennychenfight/web-app
ports:
- containerPort: 8080

這邊可以看出來與 Replication Controller 的差別在於說 selector 這邊多了 matchLabels,這個是代表可以多個 labels 這邊的 labels 的比對方式就是要一模一樣才可以。所以這邊可以發現底下 Pod template 的 labels 這邊定義跟上面 replica set 一樣。

建立看看:

1
kubectl create -f rs-label.yaml

接著查詢 rs 跟 pods

1
2
kubectl get rs
kubectl get pods

會看到:

1
2
3
4
5
6
7
NAME                  DESIRED   CURRENT   READY   AGE
web-app-replica-set 3 3 3 6m18s
-------------------------------------------------------------
NAME READY STATUS RESTARTS AGE
web-app-replica-set-mrxb7 1/1 Running 0 6m33s
web-app-replica-set-vx9x6 1/1 Running 0 6m33s
web-app-replica-set-w6ndl 1/1 Running 0 6m33s

一樣 Pod 名字會是 rs 的名字加後面隨機字串。

接著我們選其中一個 Pod 來看屬性會長怎樣:

1
kubectl get pods web-app-replica-set-mrxb7 -o yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: "2020-12-23T07:47:48Z"
generateName: web-app-replica-set-
labels:
app: web-app-pod
...
ownerReferences:
- apiVersion: apps/v1
blockOwnerDeletion: true
controller: true
kind: ReplicaSet
name: web-app-replica-set
uid: c1e1ba13-fec5-44ac-97fc-7e6cab503b65
...

可以裡面有一個屬性是 ownerReferences,代表參考到之前建立的 Replica Set。

使用 matchExpressions 的方式建立

matchLabels 方式就跟之前 Replication Controller 一樣,但是還有更方便的方式可以進行 select Pod,那就是 matchExpressions

直接上設定檔:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: web-app-replica-set
labels:
app: web-app-pod
spec:
replicas: 3
selector:
matchExpressions:
- key: app
operator: In
values:
- web-app-pod
template:
metadata:
labels:
app: web-app-pod
spec:
containers:
- name: web-app
image: kennychenfight/web-app
ports:
- containerPort: 8080

matchExpressions 總共有三個欄位可以使用:

  • key 意思就是 Pod 的 labels 的 key

  • operator:條件運算子,也是因為有這個才能更有彈性的 select 對應的 Pod,目前支援的 operator 有這些:

    In、NotIn、Exist 和 DoesNotExist

  • values:根據前面的 operator 來決定對這些 values 的運算

所以以上面的範例就是說 key 是 app 的話它的對應 value 必須在 web-app-pod 的值中

來建立看看:

1
kubectl create -f rs-expression.yaml

然後來測試手動新增一個 Pod 試試看:

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: v1
kind: Pod
metadata:
name: web-app-pod
labels:
app: web-app-pod
spec:
containers:
- name: web-app
image: kennychenfight/web-app
ports:
- containerPort: 8080

這邊注意 labels 這邊的 key value 符合上面 rs 的 matchExpressions。

但是建立之後我們馬上取得 pod 卻會出現這樣的訊息:

1
2
3
4
5
6
7
8
kubectl create -f pod-with-expressions.yaml
kubectl get pods
---
NAME READY STATUS RESTARTS AGE
web-app-pod 0/1 Terminating 0 1s
web-app-replica-set-8ph5s 1/1 Running 0 3m41s
web-app-replica-set-tmdss 1/1 Running 0 3m41s
web-app-replica-set-xvhb6 1/1 Running 0 3m41s

這是因為新建立的 Pod 被 RS 捕捉到了,但由於目前 Pod 數量已經符合需求了,所以就是新增一個新的 Pod,RS 也會快速將這個 Pod Terminate 掉。

所以另外一種做法是先將需要的 Pod 一一建立好之後,最後在建立 Replica Set,Replica Set 會自動先捕捉到現有符合的 Pod,不夠才會自動新增新的。

刪除 Replica Set

  • 刪除 Replica Set 預設會把牽連的 Pod 一併刪掉
  • 如果不想一併刪掉可以使用 kubectl delete rs web-app-replica-set --cascade=false

將 Pod 從 ReplicaSet 中隔離

可以使用 kubectl label pod web-app-replica-set-8ph5s app=xxx 來改變 pod 的 label 來脫離 Replica Set 的控制。

總結

這篇文章介紹了如何建立 Replica Set 以及它跟 Replication Controller 的差別。而 K8S 官方又更建議可以使用 Deployment 來操控 Replica Set,而不是直接建立 Replica Set,可以透過建立 Deployment 一併建立 Replica Set,講了這麼多卻還沒說到如何進行滾動更新,其實就是要透過 Deployment 來實現滾動更新並且搭配 Replica Set。因此下篇文章會講解如何建立 Deployment 及其應用。

最後最後!請聽我一言!

如果你還沒有註冊 Like Coin,你可以透過我的邀請註冊連結來免費註冊,註冊完後就可以在文章最下方幫我按下 Like 按鈕,而 Like 最多可以點五次,如此一來你不用付出任何一塊錢,就能給我寫這篇文章最大的回饋!