到目前為止,您已經利用直接建立Pod物件來部署工作負載。在生產叢集中,您可能需要部署同一個 Pod 的數十個甚至數百個副本,因此建立和管理這些 Pod 會很困難。 幸運的是,在k8s中,您可以使用ReplicaSet物件自動建立和管理Pod副本。

<aside> 💡 在引入 ReplicaSet 之前,ReplicationController物件類型提供了類似的功能,但現在已棄用。 ReplicationController 的行為與 ReplicaSet 完全相同,因此本章中解釋的所有內容也適用於 ReplicationController。

</aside>

在開始之前,請確保 Kiada 套件的 Pod、服務和其他物件存在於您的叢集中。 如果您遵循了上一章中的練習,它們應該已經存在。如果沒有,您可以建立kiada命名空間後使用以下指令apply Chapter13/SETUP/目錄中的所有yaml來建立它們:

$ kubectl apply -f SETUP -R

13.1 介紹ReplicaSet

ReplicaSet 表示一組 Pod 副本(Pod 的精確副本)。 您可以建立一個ReplicaSet物件,在ReplicaSet中指定一個Pod 模板(template)和期望的副本數,然後讓k8s建立Pod,而不是一個一個地建立 Pod,如下圖。

圖 13.1 ReplicaSets 簡而言之

圖 13.1 ReplicaSets 簡而言之

ReplicaSet允許您將 Pod 當作一個單位進行管理,但僅此而已。如果您想將這些Pod暴露為一個單位,您仍然需要一個Service物件。 如下圖,每組提供特定服務的 Pod 通常都需要一個ReplicaSet和一個Service物件。

圖 13.2 Services、ReplicaSet 和 Pod 之間的關係。

圖 13.2 Services、ReplicaSet 和 Pod 之間的關係。

就像Service一樣,ReplicaSet的標籤選擇器和Pod標籤決定了哪些 Pod 屬於ReplicaSet。  如下圖所示,一個ReplicaSet只關心與它標籤選擇器匹配的 Pod,而忽略其餘的。

圖 13.3 ReplicaSet只關心與它標籤選擇器匹配的 Pod

圖 13.3 ReplicaSet只關心與它標籤選擇器匹配的 Pod

根據目前的資訊,您可能認為如果要建立Pod的多個副本,才要使用ReplicaSet,但並非如此。 即使您只需要建立一個Pod,利用ReplicaSet來完成也比直接建立要好,因為ReplicaSet確保Pod始終在那裡完成它的工作。

想像一下,直接為一個重要的服務建立一個 Pod,然後運行 Pod 的節點在你不在的時候發生故障。 在您重新建立Pod之前,您的服務已關閉的。如果您利用ReplicaSet部署Pod,ReplicaSet將自動重新建立Pod。利用ReplicaSet建立Pod顯然比直接建立要好。

然而,儘管ReplicaSet很有用,但它們並不能提供長期運行工作負載所需的一切。在某些時候,您需要將工作負載升級到更新的版本,而這正是ReplicaSet的不足之處。 出於這個原因,應用程式通常不是利用ReplicaSet部署的,而是透過允許您以宣告方式(declaratively)更新它們的Deployment來部署的。 這就引出了一個問題,即如果您不打算使用ReplicaSet,為什麼需要了解它們。 原因是Deployment提供的大部分功能都是由k8s在Deployment下面去建立的ReplicaSet提供的。 Deployment負責更新,但其他一切都由底層ReplicaSet處理。因此,重要的是要了解ReplicaSet做什麼以及如何做。

讓我們首先為Kiada服務建立ReplicaSet物件。此服務目前是直接從三個pod yaml來建立三個pod運行的,現在您將使用一個ReplicaSet manifest來替換它們。 在建立yaml之前,讓我們看看您需要在spec區段中指定哪些字段。

ReplicaSet是一個相對簡單的物件。下表解釋了三個關鍵字段指定在ReplicaSet的spec區段中。

字段名稱 描述
replicas 期望的副本數。當您建立ReplicaSet物件時,k8s會從Pod模板來建立此數量的Pod。
ReplicaSet會保留此數量的Pod,直到您刪除ReplicaSet。
selector 標籤選擇器包含matchLabels子字段中的標籤map或matchExpressions子字段中的標籤選擇器要求列表。
與標籤選擇器匹配的Pod被視為此ReplicaSet的一部分。
template ReplicaSet的Pod的模板。當需要建立新的Pod時,將使用此模板建立物件。

selectortemplate字段是必需的,但您可以省略replicas字段。如果這樣做,則只會建立 1 個副本。

為 Kiada Pod 建立一個 ReplicaSet物件 yaml。以下yaml顯示了它的外觀。rs.kiada.yaml

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: kiada
spec:
  replicas: 5
  selector:
    matchLabels:
      app: kiada
      rel: stable
  template:
    metadata:
      labels:
        app: kiada
        rel: stable
    spec:
      containers:
      - name: kiada
        image: luksa/kiada:0.5
        ...
      volumes:
      - ...