1. 程式人生 > >K8s-Pod控制器

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