咱們有了 pod,那麼就須要對 pod 進行控制,就是同一個服務的 podv我須要啓動幾個?若是須要擴容了,怎麼辦?這裏就有個控制器,ReplicationController(簡稱rc)。node
不過咱們看官網:nginx
這裏告訴咱們,ReplicationController 如今已通過時了,如今建議使用 Deployment 配合ReplicaSet。ReplicationController的主要功能是保證Pod的數量、健康,彈性收縮等。可是Deployment除了有這些功能以外,還增長了回滾功能(當升級 pod 鏡像或者相關參數的時候,若是有錯誤,能夠回滾到上一個穩定版本),版本記錄(每一次對 Deployment 的操做都能保存下來)。暫停和啓動(升級的時候,能隨時暫停和啓動)。redis
估計不久的未來,ReplicationController 就不會有人用了。不過咱們仍是基本瞭解下 ReplicationController 的一些配置。api
下面是官方的一份ReplicationController的配置文件:app
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的配置全集在上一篇咱們看到了。frontend
其中.spec.replicas表示這個pod須要維持幾份。若是沒有配置的話,它就是爲1。好比上面那個例子,就保持3份nginx服務。學習
其中的selector咱們這裏能夠好好研究下,這個是咱們第一次見到。設計
標籤選擇器在不少概念都是會使用到的,好比pod在哪一個node上,ReplicationController做用在哪一個pod上,service做用在哪一個pod上,等等。tag標註的系統化也是k8s應用集羣必要的設計之一。3d
標籤選擇器理解起來卻是很簡單,就是一堆的key:value。好比我能夠給pod設置3個label:code
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日