iT邦幫忙

2022 iThome 鐵人賽

DAY 5
1
DevOps

30天準備CKA考試系列 第 5

Day 05:ReplicationController vs. ReplicaSet

  • 分享至 

  • xImage
  •  

Day 05:ReplicationController vs. ReplicaSet

昨天提到了如何建立Kubernetes的最小單位Pod,那如果我們今天想要建立多個相同的Pod,以重複執行相同的任務,亦,或是避免部分的Pods掛掉後,服務因此而終止,那該如何做到呢?

Replication Controller

在Kubernetes早期的版本中,如果我們想要讓系統自動地將相同的Pod維持在某個數量,需要用到ReplicationController,而在現在的主流的做法是Deployment,我們可以先來看看它的YAML是怎麼寫~

apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    app: nginx
  template:
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

我們從上面從官網找到的範例可以發現,也是有存在昨天提到的必要的四個欄位apiVersion, kind, metadata, spec,那我們接下來談談昨天沒提到的欄位~

  • replicas:這邊的值,代表這個ReplicationController要把這個Pod的數量維持在多少。
  • template:內容就和Pod的metadata與spec一樣。
    • labels:這邊的值是key-value形式,代表你給這個Pod貼上的標籤,如果其他的物件想要和這個Pod做互動,可以透過這個標籤來識別是不是這個Pod。
    • ports:定義你打算曝露給外界哪些Port。
      • containerPort:同上。
  • selector:代表這個ReplicationController會監控哪個label,像是這邊的範例就是”app: nginx”,剛好與template內的labels是相同的,所以template的Pod會被維持在3個。

此外,如果在YAML中看到"-"這個符號,這代表這邊的值是個Array,而有"-"的則是這個Array的第一行。

要是selector與template.labels的值不相同呢?

這樣ReplicationController就無法監控這個template所產生的container,進而無法管理其數量。

Replica Set

先來看看範例吧~

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: frontend
  labels: # labels A
    app: guestbook
    tier: frontend
spec:
  replicas: 3
  selector:
    matchLabels:
      tier: frontend
  template:
    metadata:
      labels: # labels B
        tier: frontend
    spec:
      containers:
      - name: php-redis
        image: gcr.io/google_samples/gb-frontend:v3

首先,我們可以看到有兩個地方都有labels,而我有加上labels A, B的註釋,labels A的作用是管理ReplicaSet本身,像是我們今天要用label來找出這個ReplicaSet,就可以用:

# 這邊的 -l 代表label,不確定的話可以用kubectl get --help來確認
kubectl get replicaset -l app=my-nginx

另外我們可以看到在selector中,變成matchLabels,這代表只要符合這些條件的Pod都會受到ReplicaSet所管理。

ReplicaSet和ReplicationController有什麼不同呢?

主要有2:

  • Selector:ReplicaSet是set-based與ReplicationController是equality-based,簡單來説set-based就是tier in (frontend, backend),equality-based就是tier=frontend,前者靈活了不少。
  • Update:ReplicationController只支援rolling-update指令更新,而ReplicaSet可以透過Deployment做出更靈活的更新方式,像是rollout。

資料

Labels in Deployment Spec & template

ReplicationController

ReplicaSet

Difference between ReplicaSet and ReplicationController?


上一篇
Day 04:Pods
下一篇
Day 06:Deployments
系列文
30天準備CKA考試30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言