K8s-Pod控制器
在K8s-Pod文件中我們建立的Pod是非託管的Pod,因為Pod被設計為用後就棄的物件,如果Pod正常關閉,K8s會將該Pod清除,它沒有自愈的能力。Pod控制器是用來保持Pod狀態的一種物件資源,如下為Pod控制器的作用
Pod控制組成部分
更改標籤選擇器和Pod模板不會影響現有的Pod.更改標籤選擇器會使現有的Pod脫離控制,但不會影響現有Pod的執行,更改Pod模板也不會影響現有Pod的執行,只會影響由改控制器新生成的Pod.
作用:
1:確保Pod副本數保持一致
2:當節點故障時會在其他節點執行建立的Pod以替代舊的Pod
3:非常容器實現Pod的水平伸縮。
三: Pod控制器-ReplicationController
3.1 RC-組成部分
3.1.1 label selector
標籤選擇器,用於確定控制的Pod
3.1.2 replica count
副本個數,指定用行的Pod數量
3.1.3 pod template
Pod模板,用於建立新的Pod副本
3.2 RC-建立
我們可以通過yaml格式的檔案進行RC的建立
如下一個rc yaml格式的檔案
[[email protected] pod-controller]# cat kubia-rc.yaml
apiVersion: v1 # API的版本
kind: ReplicationController # Pod控制器 RC
metadata: # 元資料
name: kubia
spec: # 規格說明
replicas: 3 # 副本個數
selector: # 標籤選擇器
app: kubia
template: # 標籤的模板
metadata:
labels:
app: kubia # Pod標籤,這裡要確保跟RC的標籤選擇器一致
spec:
containers:
- name: kubia
image: luksa/kubia
ports:
- containerPort: 8080
建立RC
[[email protected] pod-controller]# kubectl create -f kubia-rc.yaml
檢視一下有沒有生成Pod
[[email protected] pod-controller]# kubectl get po --show-labels -o wide
會生成指定的副本數3個Pod,也會貼上app=kubia的標籤
檢視我們已經建立的ReplicationController
[[email protected] pod-controller]# kubectl get replicationcontroller -o wide
Replicationcontroller的縮寫時rc
[[email protected] pod-controller]# kubectl get rc -o wide
上面的三列分別時所需的Pod數量,實際的Pod數量,已經準備就緒的Pod數量
檢視rc kubia的相信資訊
[[email protected] pod-controller]# kubectl describe rc kubia
現在我們嘗試刪除一個Pod,看下發生了什麼
# 檢視當前Pod
[[email protected] pod-controller]# kubectl get po
NAME READY STATUS RESTARTS AGE
kubia-7x4dp 1/1 Running 0 32m
kubia-f4b5d 1/1 Running 0 28m
kubia-m7bv2 1/1 Running 0 32m
# 嘗試刪除一個Pod
[[email protected] pod-controller]# kubectl delete po kubia-7x4dp
# 檢視目前Pod 可以看到如果我們手動刪除一個Pod,RC會自動的根據Pod template創建出一個Pod
[[email protected] ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
kubia-59r66 0/1 ContainerCreating 0 2s
kubia-7x4dp 1/1 Terminating 0 34m
kubia-f4b5d 1/1 Running 0 31m
kubia-m7bv2 1/1 Running 0 34m
# 我們使用標籤選擇器刪除這三個Pod
[[email protected] pod-controller]# kubectl delete po -l app=kubia
# 再次檢視Pod情況
[[email protected] ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
kubia-59r66 1/1 Terminating 0 3m26s
kubia-dpgp5 0/1 ContainerCreating 0 3s
kubia-f4b5d 1/1 Terminating 0 34m
kubia-jlw9l 0/1 ContainerCreating 0 3s
kubia-m7bv2 1/1 Terminating 0 38m
kubia-m8n9p 0/1 ContainerCreating 0 3s
現在我們模擬一下節點故障
目前有兩個Pod執行在worker 節點2上,現在我們將節點2down掉
# 我們看到節點2成為了NotReady狀態
[[email protected] ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master-node1 Ready master 2d v1.13.1
k8s-worker-node1 Ready <none> 2d v1.13.1
k8s-worker-node2 NotReady <none> 4h4m v1.13.1
# 再檢視Pod狀態
[[email protected] pod-controller]# kubectl get pods
NAME READY STATUS RESTARTS AGE
kubia-dpgp5 1/1 Running 0 21m
kubia-jlw9l 0/1 Error 0 21m
kubia-m8n9p 0/1 Error 0 21m
# 等一會兒我們再次檢視,K8s新建立了兩個Pod,實現了自愈
[[email protected] pod-controller]# kubectl get po
NAME READY STATUS RESTARTS AGE
kubia-dl9zv 1/1 Running 0 5m47s
kubia-dpgp5 1/1 Running 0 29m
kubia-jlw9l 0/1 Terminating 0 29m
kubia-m8n9p 0/1 Terminating 0 29m
kubia-rjvnm 1/1 Running 0 5m47s
現在我們將節點2啟動
發現Pod不會在發生改變,會把之前的Erro狀態的Pod刪除掉。
3.3 RC-作用域
RC 負責管理與標籤選擇器匹配的Pod,而不是繫結關係,兩者沒有互相依賴的關係,我們可以通過修改Pod的標籤,從而脫離RC的管理,但該脫離Pod只是不受RC管理了,不會產生任何影響,所不同的是如果該Pod節點發生故障,Pod因為是非託管的Pod,該Pod會被刪除而不會重建。
這裡我們嘗試修改其中一個Pod的標籤
# 以下三個Pod有一個app=kubia的標籤
[[email protected] pod-controller]# kubectl get po --show-labels
NAME READY STATUS RESTARTS AGE LABELS
kubia-dl9zv 1/1 Running 0 35m app=kubia
kubia-dpgp5 1/1 Running 0 58m app=kubia
kubia-rjvnm 1/1 Running 0 35m app=kubia
# 現在我們修改其中一個Pod的標籤
[[email protected] pod-controller]# kubectl label po kubia-dl9zv app=wangys --overwrite
# 現在看下Pod情況
[[email protected] pod-controller]# kubectl get po --show-labels
NAME READY STATUS RESTARTS AGE LABELS
kubia-dl9zv 1/1 Running 0 35m app=wangys
kubia-dpgp5 1/1 Running 0 59m app=kubia
kubia-p5clz 0/1 ContainerCreating 0 3s app=kubia
kubia-rjvnm 1/1 Running 0 35m app=kubia
[[email protected] pod-controller]# kubectl get po --show-labels
NAME READY STATUS RESTARTS AGE LABELS
kubia-dl9zv 1/1 Running 0 35m app=wangys
kubia-dpgp5 1/1 Running 0 59m app=kubia
kubia-p5clz 1/1 Running 0 9s app=kubia
kubia-rjvnm 1/1 Running 0 35m app=kubia
說明:修改現有Pod的標籤可以將該Pod移除RC的作用域,不受管理,但是該Pod正常執行不受影響,區別在於這個Pod節點故障就會被刪除。
3.4 RC-Pod模板
對於Pod模板我們可能常常會更新,需要說明的是,如果Pod模板更新,並不會影響現有的Pod執行,影響的是新建的Pod,新建的Pod會根據這個Pod模板建立。
我們可以通過修改模板來驗證我們的結論
# 現在三個Pod都有app=kubia的標籤
[[email protected] pod-controller]# kubectl get po --show-labels
NAME READY STATUS RESTARTS AGE LABELS
kubia-dpgp5 1/1 Running 0 82m app=kubia
kubia-p5clz 1/1 Running 0 23m app=kubia
kubia-rjvnm 1/1 Running 0 59m app=kubia
# 修改rc檔案,新增rel:beta標籤
[[email protected] pod-controller]# kubectl edit rc kubia
# 再次檢視 原Pod標籤沒有修改
[[email protected] pod-controller]# kubectl get po --show-labels
NAME READY STATUS RESTARTS AGE LABELS
kubia-dpgp5 1/1 Running 0 86m app=kubia
kubia-p5clz 1/1 Running 0 27m app=kubia
kubia-rjvnm 1/1 Running 0 63m app=kubia
我們刪除一個Pod試試,新Pod會根據修改後的模板建立
[[email protected] pod-controller]# kubectl delete po kubia-dpgp5
[[email protected] ~]# kubectl get po --show-labels
NAME READY STATUS RESTARTS AGE LABELS
kubia-2r2qx 1/1 Running 0 15s app=kubia,rel=beta
kubia-dpgp5 1/1 Terminating 0 88m app=kubia
kubia-p5clz 1/1 Running 0 29m app=kubia
kubia-rjvnm 1/1 Running 0 65m app=kubia
[[email protected] ~]# kubectl get po --show-labels
NAME READY STATUS RESTARTS AGE LABELS
kubia-2r2qx 1/1 Running 0 38s app=kubia,rel=beta
kubia-p5clz 1/1 Running 0 30m app=kubia
kubia-rjvnm 1/1 Running 0 65m app=kubia
3.5 RC-Pod水平伸縮
3.5.1 擴容
可以通過手動的方式
[[email protected] ~]# kubectl scale rc kubia --replicas=10
# 檢視狀態
[[email protected] pod-controller]# kubectl get po
NAME READY STATUS RESTARTS AGE
kubia-2r2qx 1/1 Running 0 8m30s
kubia-5c47l 1/1 Running 0 3m33s
kubia-bfksb 1/1 Running 0 3m33s
kubia-ctkcm 1/1 Running 0 3m33s
kubia-d6zh9 1/1 Running 0 3m33s
kubia-g7296 1/1 Running 0 3m33s
kubia-p5clz 1/1 Running 0 37m
kubia-rjvnm 1/1 Running 0 73m
kubia-rtg4q 1/1 Running 0 3m33s
kubia-s9n8k 1/1 Running 0 3m33s
通過編輯定義來擴容
[[email protected] pod-controller]# kubectl edit rc kubia
[[email protected] pod-controller]# kubectl get po
NAME READY STATUS RESTARTS AGE
kubia-2ctxt 1/1 Running 0 59s
kubia-2r2qx 1/1 Running 0 16m
kubia-5c47l 1/1 Running 0 11m
kubia-7hmm6 1/1 Running 0 59s
kubia-b5kxm 1/1 Running 0 59s
kubia-bfksb 1/1 Running 0 11m
kubia-ctkcm 1/1 Running 0 11m
kubia-d6zh9 1/1 Running 0 11m
kubia-g7296 1/1 Running 0 11m
kubia-jvmt6 1/1 Running 0 59s
kubia-k7kc4 1/1 Running 0 59s
kubia-krbj6 1/1 Running 0 59s
kubia-kw66f 1/1 Running 0 59s
kubia-mktbp 1/1 Running 0 59s
kubia-p5clz 1/1 Running 0 45m
kubia-rjvnm 1/1 Running 0 81m
kubia-rtg4q 1/1 Running 0 11m
kubia-s9n8k 1/1 Running 0 11m
kubia-w9jx6 1/1 Running 0 59s
kubia-zr5s6 1/1 Running 0 59s
3.5.2 縮容
命令列/編輯檔案,這裡演示命令列
[[email protected] pod-controller]# kubectl scale rc kubia --replicas=3