k8s學習 - 概念 - ReplicationController
我們有了 pod,那麼就需要對 pod 進行控制,就是同一個服務的 podv我需要啟動幾個?如果需要擴容了,怎麼辦?這裡就有個控制器,ReplicationController(簡稱rc)。
不過我們看官網:
這裡告訴我們,ReplicationController 現在已經過時了,現在建議使用 Deployment 配合ReplicaSet。ReplicationController的主要功能是保證Pod的數量、健康,彈性收縮等。但是Deployment除了有這些功能之外,還增加了回滾功能(當升級 pod 映象或者相關引數的時候,如果有錯誤,可以回滾到上一個穩定版本),版本記錄(每一次對 Deployment 的操作都能儲存下來)。暫停和啟動(升級的時候,能隨時暫停和啟動)。
估計不久的將來,ReplicationController 就不會有人用了。不過我們還是基本瞭解下 ReplicationController 的一些配置。
下面是官方的一份ReplicationController的配置檔案:
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
其中spec.template是spec中必須填寫的,它就是一個pod的配置。pod的配置全集在上一篇我們看到了。
其中.spec.replicas表示這個pod需要維持幾份。如果沒有配置的話,它就是為1。比如上面那個例子,就保持3份nginx服務。
標籤選擇器
其中的selector我們這裡可以好好研究下,這個是我們第一次見到。
標籤選擇器在很多概念都是會使用到的,比如pod在哪個node上,ReplicationController作用在哪個pod上,service作用在哪個pod上,等等。tag標註的系統化也是k8s應用叢集必要的設計之一。
標籤選擇器理解起來倒是很簡單,就是一堆的key:value。比如我可以給pod設定3個label:
metadata:
labels:
key1: value1,
key2: value2,
key3: value3
key1=value1, key2=value2, key3=value3。
然後在ReplicationController的selector裡面,有兩種寫法,一種是簡單寫法,一種高階寫法。(好像網上沒有這種說法,但是我理解就是這樣的)
簡單寫法:
selector:
key1: value1
代表這個ReplicationController選擇labels有key1標籤,且標籤值為value1的pod進行控制。
高階寫法:(這個高階寫法裡面的matchExpressions其實ReplicationController是不支援的,ReplicaSet才開始支援。不知道後續會不會支援個正則匹配)
selector:
matchLabels:
key1: value1
matchExpressions:
- {key: key2, operator: In, values: [value2, value4]}
代表這個ReplicationController選擇labels有標籤和標籤值,key1:value1,且key2在value2和value4集合中的pod進行控制。
我們可以在檢視資源的時候帶上--show-labels
來獲取labels,比如:
kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
busybox 1/1 Running 26 3d <none>
busybox1 1/1 Running 26 3d name=busybox
busybox2 1/1 Running 26 3d name=busybox
frontend-5c548f4769-l9cts 1/1 Running 0 1h app=guestbook,pod-template-hash=1710490325,tier=frontend
frontend-5c548f4769-nnp2b 1/1 Running 0 1h app=guestbook,pod-template-hash=1710490325,tier=frontend
frontend-5c548f4769-zjwwm 1/1 Running 0 1h app=guestbook,pod-template-hash=1710490325,tier=frontend
redis-master-55db5f7567-929np 1/1 Running 0 1h app=redis,pod-template-hash=1186193123,role=master,tier=backend
redis-slave-584c66c5b5-dsbcc 1/1 Running 0 1h app=redis,pod-template-hash=1407227161,role=slave,tier=backend
redis-slave-584c66c5b5-kfhnq 1/1 Running 0 1h app=redis,pod-template-hash=1407227161,role=slave,tier=backend
task-pv-pod 1/1 Running 0 1d <none>
雖然官網有推薦了一些labels
"release" : "stable", "release" : "canary"
"environment" : "dev", "environment" : "qa", "environment" : "production"
"tier" : "frontend", "tier" : "backend", "tier" : "cache"
"partition" : "customerA", "partition" : "customerB"
"track" : "daily", "track" : "weekly"
但是我感覺大家寫叢集的時候也並沒有按照這些建議的labels。基本上一個叢集有自己的一套設計。
總結
最後在總結下,ReplicationController這個已經是被淘汰的了,連k8s官網的demo已經都切換到deployment+replicaset了,所以遇到有用ReplicationController的書和文章,可以棄讀了。
-- 當前日期:2019年7月9日