共計 2073 個字符,預計需要花費 6 分鐘才能閱讀完成。
如何理解 ReplicationController 及其配置,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
在介紹 ReplicationController 之前,我們先思考一下下圖所示的場景,Kubernetes 集群包含 2 個 Node,每個 Node 上均運行一個同類型的 Pod 來做負載均衡,如果其中某個 Node 被管理員強制關機或者 Node 意外宕機時,會發生什么呢?
由于 Pod 被調度到某個 Node 后就與 Node 綁定,當 Node 宕機后,Node 中的所有 Pod 也都停止運行。上圖所示場景中,Node2 被關閉后,相應的 Pod- 2 也會停止,Pod- 2 并不會重新被調度到 Node1。
實際應用場景中,維持穩定的 Pod 副本數是非常必要的,因此 Kubernetes 引入了 ReplicationController。
工作機制
ReplicationController 用于定義指定 Pod 的副本數,與創建多個 Pod 相比,它可以保證 Pod 意外終止后,集群中仍會有指定個數的 Pod 副本在運行。運行于 kube-controller-manager 組件中的 ReplicationController 控制器(控制器和資源名相同)會監控集群中 Pod 的副本數:
如果 Pod 數量已經超出預期,那么 ReplicationController 將會刪除部分 Pod,使 Pod 數量符合預期。
如果 Pod 數量低于預期,那么 ReplicationController 將會創建新的 Pod,使用 Pod 數量符合預期。
ReplicationController 控制器會時刻監控 Pod 的副本數量,一旦發現 Pod 數量不符合預期(Pod 數量過多或過少),均會通過增加或刪除 Pod 的手段來讓 Pod 維持在預期數量。
ReplicationController 控制器更像是一個 Pod 監管者,它監管的是整個集群范圍的 Pod。在本節開頭中所引用的場景中,如果使用 ReplicationController 創建兩個 Pod 的副本,當其中一個 Pod 意外終止后,新的 Pod 會被創建出來,從而保證集群中仍有兩個副本在運行,整體工作機制如下圖所示:
通過示意圖可以看到,通過 ReplicationController 創建兩個 Pod 情況下,當 Node2 被關閉后,運行于其上的 Pod 被重新調度到 Node1 中運行,集群中總的 Pod 數始終保持在 2 個。
ReplicationController 配置
一個簡單的 ReplicationController 資源配置如下所示:
apiVersion: v1
kind: ReplicationController
metadata:
name: replication-controller-runs-pod
spec:
replicas: 3
selector:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.19.0
其中有三個關鍵的項:
spec.replicas 指定了期望的 Pod 副本數;
spec.selector 指定了 Selector,ReplicationController 正是通過該 Selector 來查找 Pod 對象;
spec.template 指定了 Pod 的模版,當 ReplicationController 發現 Pod 數量低于預期時將使用該模版創建新的 Pod。
Pod 模板
Pod 模版用于 Kubernetes 內部動態地創建 Pod,它廣泛應用于各種控制器中,包括本節中介紹的 ReplicationController,以及后續將要介紹的 Deployments、Jobs 和 DaemonSets 等等。
從數據結構上看,Pod 模版(PodTemplateSpec)可以理解為簡化版的 Pod,它只保留了 Pod 的 Metadata 和 Spec,如下所示:
type PodTemplateSpec struct {
// Metadata of the pods created from this template.
// +optional
metav1.ObjectMeta
// Spec defines the behavior of a pod.
// +optional
Spec PodSpec
}
ReplicationController 設計初衷是維持集群中指定類型 Pod 的副本數,但它只支持等值 Selector,不支持基于集合的 Selector。為了不違背 API 兼容性原則,Kubernetes 不得已提供了另一種制器 ReplicaSet 來替換它。
所以,實際場景中幾乎不會用到 ReplicationController,雖然它是一個穩定的 API。
看完上述內容,你們掌握如何理解 ReplicationController 及其配置的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注丸趣 TV 行業資訊頻道,感謝各位的閱讀!