1. 程式人生 > 其它 >k8s Pod控制器型別與部署例項

k8s Pod控制器型別與部署例項

1、控制器

Pod控制器是用於實現管理pod的中間層,確保pod資源符合預期的狀態,pod的資源出現故障時,會嘗試 進行重啟,當根據重啟策略無效,則會重新新建pod的資源。

pod分類和控制器型別
Pod的分類:

自主式Pod:Pod退出後不會被建立
控制器管理的Pod:在控制器的生命週期裡,始終要維持Pod的副本數目
控制器型別:

Replication Controller和ReplicaSet
Deployment
DaemonSet
StatefulSet
Job
CronJob
HPA全稱Horizontal Pod Autoscaler


replication、controller(複製控制器RC)和replicaset(副本集RS)控制器


Replica Set 是下一代的 Replication Controller,官方推薦使用ReplicaSet。
Replica Set 和 Replication Controller 的唯一區別是選擇器的支援,ReplicaSet支援新的基於集合的選擇器需求。
ReplicaSet 確保任何時間都有指定數量的 Pod 副本在執行。
雖然 ReplicaSets 可以獨立使用,但今天它主要被Deployments 用作協調 Pod 建立、刪除和更新的機制。

Deployment控制器(部署)
Deployment 為 Pod 和 ReplicaSet 提供了一個申明式的定義方法。
典型的應用場景:
用來建立Pod和ReplicaSet
滾動更新和回滾
擴容和縮容
暫停與恢復

DaemonSet控制器(後臺支援服務集)


DaemonSet確保全部(或者某些)節點上執行一個Pod的副本。當有節點加入叢集時,也會為他們新增一個Pod。當有節點從叢集移除時,這些Pod也會被回收。刪除 DaemonSet將會刪除它建立的所有Pod。

DaemonSet的典型用法:

在每個節點上執行叢集儲存DaemonSet, 例如glusterd、ceph
在每個節點上執行日誌收集DaemonSet,例如fluentd、logstash
在每個節點上執行監控DaemonSet,例如Prometheus Node Exporter、zabbix agent等
一個簡單的用法是在所有的節點上都啟動一個DaemonSet,將被作為每種型別的daemon使用。
一個稍微複雜的用法是單獨對每種daemon型別使用多個DaemonSet,但具有不同的標誌,並且對不同硬體型別具有不同的記憶體、CPU要求。

StatefulSet控制器(有狀態服務集)


StatefulSet是用來管理有狀態應用的工作負載API物件。例項之間有不對等關係,以及例項對外部資料有依賴關係的應用,稱為“有狀態應用"
StatefulSet用來管理Deployment和擴充套件一組Pod,井且能為這些Pod提供*序號和唯一性保證*。

StatefulSets 對於需要滿足以下一個或多個需求的應用程式很有價值:

穩定的、唯一的網路識別符號。
穩定的、持久的儲存。
有序的、優雅的部署和縮放。
有序的、自動的滾動更新。

job、cronjob和hpa控制器
Job:
執行批處理任務,僅執行一次任務,保證任務的一個或多個Pod成功結束

Cronjob:

Cron-Job 建立基於時間排程的Jobs。
一個CronJob物件就像crontab (crontable)檔案中的一行,它用Cron格式進行編寫,並週期性地在給定的排程時間執行Job。
HPA:
根據資源利用率自動調整service中Pod數量,實現Pod水平自動縮放。

2. 控制器的部署和例項
控制器,之前的pod都是自主式的pod,在刪除之後,pod就沒有了,沒有控制器去維護它

控制器管理的pod:在控制器的生命週期裡,始終維持pod的副本數目


ReplicaSet應用(副本集)

vim rs.yaml

apiVersion: apps/v1 #api版本定義
kind: ReplicaSet #定義資源型別為ReplicaSet
metadata: #元資料定義
name: replicaset-example
spec: #ReplicaSet的規格定義
replicas: 2 #定義副本數量為2個
selector: #標籤選擇器,定義匹配pod的標籤
matchLabels:
app: nginx
template: #pod的模板定義
metadata: #pod的元資料定義
labels: #定義pod的標籤,需要和上面定義的標籤一致,也可以多出其他標籤
app: nginx
spec: #pod的規範定義
containers: #容器定義
- name: nginx #容器名稱
image: nginx #容器映象

kubectl apply -f rs.yaml

每個容器起來之後,都會有app:nginx標籤 rs去匹配pod,標籤必須和底下的容器標籤一致

注意:在使用指定控制器時,儘量使用apply來建立pod,apply支援更新而create不支援

kubectl get pod
kubectl get rs

可以看到一次運行了2個pod

測試pod的拉伸,直接將yaml檔案中副本的個數修改就可

把副本數量修改至現在的3個,可以看到重新更改檔案時,直接成功

replicas: 3

縮減時,也直接更改副本個數就可以。

縮減時也可以直接在檔案中修改(又改為2個),可以看到副本數量又變回2個。

Deployment應用
一個Deployment控制器為Pods和ReplicaSets提供描述性的更新方式。
先刪除上面的實驗:kubectl delete -f rs.yaml

kubectl get pod
vi nginx_deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-nginx
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: reg.westos.org/k8s/myapp:v1
ports:
- containerPort: 80

kubectl apply -f de.yaml

kubectl get pod --show-labels

測試拉伸

測試做拉伸,和rs沒有什麼區別,因為拉伸本身就是由rs來維護的,副本的數量就是由rs來控制的
測試滾動更新,只需要在yaml檔案中將myapp的版本改為v2即可

[kubeadm@server1 manifest]$ vimnginx_deployment.yaml
[kubeadm@server1 manifest]$ kubectl apply -f de.yaml
deployment.apps/deployment-nginx configured
[kubeadm@server1 manifest]$ kubectl get rs
NAME DESIRED CURRENT READY AGE
deployment-nginx-69ccd78d6b 2 2 2 6s
deployment-nginx-84f7d65dcf 0 0 0 13m
[kubeadm@server1 manifest]$

原來的rs還存在,並沒有被刪除掉,這是為了便於回滾
叢集內部訪問,更新成功

可以看到更新成功 回滾:與更新的方法相同,只需要修改檔案內容的版本。回滾會直接使用原來的rs(更新時並沒有刪除)

回滾的時候,直接使用的是原來的rs,保留pod

DaemonSet應用
DaemonSet確保全部(或者某些)節點上執行一個Pod的副本。當有節點加入叢集時,也會為他們新增一個Pod。當有節點從叢集移除時,這些Pod也會被回收。刪除DaemonSet將會刪除它建立的所有Pod。

首先拉取zabbix映象並上傳到harbor倉庫

vi zabbix_daemon.yaml

apiVersion: apps/v1 #api版本定義
kind: DaemonSet #定義資源型別為ReplicaSet
metadata: #元資料定義
name: daemonset-example
labels:
k8s-app: zabbix-agent
spec: #DaemonSet的規格定義
selector: #標籤選擇器,定義匹配pod的標籤
matchLabels:
name: zabbix-agent
template: #pod的模板定義
metadata: #pod的元資料定義
labels: #定義pod的標籤,需要和上面定義的標籤一致,也可以多出其他標籤
name: zabbix-agent
spec: #pod的規範定義
containers: #容器定義
- name: zabbix-agent #容器名稱
image: zabbix/zabbix-agent #容器映象

測試:

DaemonSet控制器不需要rs來維護副本。DaemonSet確保每個節點執行一個pod副本。當有節點新加入叢集時,也會為他們新增一個pod。當節點從叢集刪除時,對應的pod會被回收。如果刪除DaemonSet會刪除它建立的所有pod

測試刪除一個pod

我們可以看到:刪除後,DaemonSet控制器會自動再啟動一個pod

job控制器
job比較適合做計算類的操作

kubectl api-resources |grep job

首先拉取per映象,上傳至私有倉庫

計算圓周率:

apiVersion: batch/v1 #api版本定義
kind: Job #定義資源型別為ReplicaSet
metadata: #元資料定義
name: job-example
labels:
k8s-app: job-example
spec: #DaemonSet的規格定義
template: #pod的模板定義
metadata: #pod的元資料定義
name: job-example
spec: #pod的規範定義
containers: #容器定義
- name: pi
image: perl
command: ["perl"]
args: ["-Mbignum=bpi","-wle","print bpi(2000)"]
restartPolicy: Never

kubectl apply -f job.yaml #計算的結果在日誌中

Cronjob應用
vim cronjob.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: cronjob-example
spec:
schedule: "* * * * *" #分時日月周
jobTemplate:
spec:
template:
spec:
containers:
- name: cronjob
image: busybox
args:
- /bin/sh
- -c
- date;echo Hello from k8s cluster
restartPolicy: OnFailure

kubectl get pod
kubectl get pod
kubectl logs cronjob-example-1587266520-g6ckb

從圖可以看出,一分鐘建立一個pod並執行echo Hello from k8s cluster