在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格式的文件
[root@k8s-master-node1 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
[root@k8s-master-node1 pod-controller]# kubectl create -f kubia-rc.yaml
查看一下有沒有生成Pod
[root@k8s-master-node1 pod-controller]# kubectl get po --show-labels -o wide
會生成指定的副本數3個Pod,也會貼上app=kubia的標簽
查看我們已經創建的ReplicationController
[root@k8s-master-node1 pod-controller]# kubectl get replicationcontroller -o wide
Replicationcontroller的縮寫時rc
[root@k8s-master-node1 pod-controller]# kubectl get rc -o wide
上面的三列分別時所需的Pod數量,實際的Pod數量,已經准備就緒的Pod數量
查看rc kubia的相信信息
[root@k8s-master-node1 pod-controller]# kubectl describe rc kubia
現在我們嘗試刪除一個Pod,看下發生了什么
# 查看當前Pod
[root@k8s-master-node1 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
[root@k8s-master-node1 pod-controller]# kubectl delete po kubia-7x4dp
# 查看目前Pod 可以看到如果我們手動刪除一個Pod,RC會自動的根據Pod template創建出一個Pod
[root@k8s-master-node1 ~]# 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
[root@k8s-master-node1 pod-controller]# kubectl delete po -l app=kubia
# 再次查看Pod情況
[root@k8s-master-node1 ~]# 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狀態
[root@k8s-master-node1 ~]# 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狀態
[root@k8s-master-node1 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,實現了自愈
[root@k8s-master-node1 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的標簽
[root@k8s-master-node1 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的標簽
[root@k8s-master-node1 pod-controller]# kubectl label po kubia-dl9zv app=wangys --overwrite
# 現在看下Pod情況
[root@k8s-master-node1 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
[root@k8s-master-node1 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的標簽
[root@k8s-master-node1 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標簽
[root@k8s-master-node1 pod-controller]# kubectl edit rc kubia
# 再次查看 原Pod標簽沒有修改
[root@k8s-master-node1 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會根據修改后的模板創建
[root@k8s-master-node1 pod-controller]# kubectl delete po kubia-dpgp5
[root@k8s-master-node1 ~]# 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
[root@k8s-master-node1 ~]# 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 擴容
可以通過手動的方式
[root@k8s-master-node1 ~]# kubectl scale rc kubia --replicas=10
# 查看狀態
[root@k8s-master-node1 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
通過編輯定義來擴容
[root@k8s-master-node1 pod-controller]# kubectl edit rc kubia
[root@k8s-master-node1 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 縮容
命令行/編輯文件,這里演示命令行
[root@k8s-master-node1 pod-controller]# kubectl scale rc kubia --replicas=3