Kubernetes 復(fù)制控制器如何工作
復(fù)制控制器負(fù)責(zé)管理吊艙的生命周期并確保在任何時(shí)候運(yùn)行著所需的指定數(shù)量的吊艙。
你有沒有想過,誰負(fù)責(zé)監(jiān)督和管理 Kubernetes 集群內(nèi)運(yùn)行的“吊艙”的確切數(shù)量?Kubernetes 可以通過多種方式做到這一點(diǎn),但一個(gè)常見的方法是使用 “復(fù)制控制器(RC)”。RC 負(fù)責(zé)管理吊艙的生命周期,并確保在任何時(shí)候運(yùn)行著所需的指定數(shù)量的吊艙。但另一方面,它不負(fù)責(zé)高級的集群能力,如執(zhí)行自動擴(kuò)展、準(zhǔn)備度和活躍探測以及其他高級的復(fù)制能力。Kubernetes 集群中的其他組件可以更好地執(zhí)行這些功能。
簡而言之,RC 的職責(zé)有限,通常用于不需要復(fù)雜邏輯就能達(dá)到某些要求的具體實(shí)現(xiàn)(例如,確保所需的吊艙數(shù)量總是與指定的數(shù)量相符)。如果超過了所需的數(shù)量,RC 會刪除多余的,并確保即使在節(jié)點(diǎn)故障或吊艙終止的情況下,也有相同數(shù)量的存在。
簡單的事情不需要復(fù)雜的解決方案,對我來說,這就是 RC 如何被使用的一個(gè)完美的比喻。
如何創(chuàng)建一個(gè) RC
像大多數(shù) Kubernetes 資源一樣,你可以使用 YAML 或 JSON 格式創(chuàng)建一個(gè) RC,然后將其發(fā)布到 Kubernetes API 端點(diǎn)。
$ kubectl create -f rcexample.yaml
replicationcontroller/rcexample created
現(xiàn)在,我將深入一下 rcexample.yaml
的樣子。
apiVersion: v1
kind: ReplicationController → RC 描述符
metadata:
name: rcexample → 復(fù)制控制器名字
spec:
replicas: 3 → 預(yù)期的吊艙數(shù)量
selector: → 這個(gè) RC 的吊艙選擇器
app: nginx
template: → 用于創(chuàng)建新吊艙的模板
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
進(jìn)一步解釋,這個(gè)文件在執(zhí)行時(shí)創(chuàng)建了一個(gè)名為 rcexample
的 RC,確保三個(gè)名為 nginx
的吊艙實(shí)例一直在運(yùn)行。如果一個(gè)或所有的 app=nginx
吊艙沒有運(yùn)行,新的吊艙將根據(jù)定義的吊艙模板創(chuàng)建。
一個(gè) RC 有三個(gè)部分:
- 復(fù)制品:
3
- 吊艙模板:
app=nginx
- 吊艙選擇器:
app=nginx
注意,吊艙模板要與吊艙選擇器相匹配,以防止 RC 一直創(chuàng)建吊艙。如果你創(chuàng)建的 RC 的吊艙選擇器與模板不匹配,Kubernetes API 服務(wù)器會給你一個(gè)錯(cuò)誤。
為了驗(yàn)證 RC rcexample
是否被創(chuàng)建:
$ kubectl get po
NAME READY STATUS RESTARTS AGE
rcexample-53thy 0/1 Running 0 10s
rcexample-k0xz6 0/1 Running 0 10s
rcexample-q3vkg 0/1 Running 0 10s
要?jiǎng)h除 RC:
$ kubectl delete rc rcexample
replicationcontroller "rcexample" deleted
注意,你可以對 RC 中的服務(wù)使用 滾動更新 策略,逐個(gè)替換吊艙。
其他復(fù)制容器的方法
在 Kubernetes 部署中,有多種方法可以實(shí)現(xiàn)容器的復(fù)制。Kubernetes 成為容器平臺的主要選擇的主要原因之一是復(fù)制容器以獲得可靠性、負(fù)載平衡和擴(kuò)展的原生能力。
我在上面展示了你如何輕松地創(chuàng)建一個(gè) RC,以確保在任何時(shí)候都有一定數(shù)量的吊艙可用。你可以通過更新副本的數(shù)量來手動擴(kuò)展吊艙。
另一種可能的方法是通過使用 “復(fù)制集(RS)”來達(dá)到復(fù)制的目的。
(kind: ReplicaSet)
RS 的功能幾乎與 RC 相同。主要區(qū)別在于,RS 不允許滾動更新策略。
另一種實(shí)現(xiàn)復(fù)制的方法是通過使用 “部署”。
(kind: Deployment)
部署是一種更高級的容器復(fù)制方法。從功能上講,部署提供了相同的功能,但在需要時(shí)可以推出和回滾變化。這種功能之所以能夠?qū)崿F(xiàn),是因?yàn)椴渴鹩?“策略類型” 規(guī)范來用新的吊艙替換舊的吊艙。你可以定義兩種類型的部署策略:“重新創(chuàng)建” 和 “滾動更新”。你可以如下指定部署策略:
StrategyType: RollingUpdate
總結(jié)
容器的復(fù)制功能是大多數(shù)企業(yè)考慮采用 Kubernetes 的主要原因之一。復(fù)制可以讓你達(dá)到大多數(shù)關(guān)鍵應(yīng)用程序需要的可靠性和可擴(kuò)展性,作為生產(chǎn)的最低要求。
了解在 Kubernetes 集群中使用哪些方法來實(shí)現(xiàn)復(fù)制,對于決定哪種方法最適合你的應(yīng)用架構(gòu)考慮非常重要。