Pod 是 Kubernetes 集群中能夠被創(chuàng)建和管理的最小部署單元。所以需要有工具去操作和管理它們的生命周期,這里就需要用到控制器了。
Pod 控制器由 master 的 kube-controller-manager 組件提供,常見的此類控制器有 Replication Controller、ReplicaSet、Deployment、DaemonSet、StatefulSet、Job 和 CronJob 等,它們分別以不同的方式管理 Pod 資源對象。
一、pod控制器的相關(guān)知識
1.1 pod控制器的作用
?Pod控制器,又稱之為工作負載(workload),是用于實現(xiàn)管理pod的中間層,確保pod資源符合預(yù)期的狀態(tài),pod的資源出現(xiàn)故障時,會嘗試進行重啟,當根據(jù)重啟策略無效,則會重新新建pod的資源。
按照pod的創(chuàng)建安方式可以將其分為兩類:
- 自主式pod:kubernetes直接創(chuàng)建出來的pod,這種pod刪除后就沒有了,也不會重建
- 控制器創(chuàng)建的pod:通過控制器創(chuàng)建的pod,這種pod刪除了之后還會自動重建
?控制器和pod的關(guān)系:
controllers:在集群上管理和運行容器的 pod 對象, pod 通過 label-selector 相關(guān)聯(lián)。
Pod 通過控制器實現(xiàn)應(yīng)用的運維,如伸縮,升級等。
1.2?pod控制器的多種類型?
(1)ReplicaSet: 代用戶創(chuàng)建指定數(shù)量的pod副本,確保pod副本數(shù)量符合預(yù)期狀態(tài),并且支持滾動式自動擴容和縮容功能。
ReplicaSet主要三個組件組成:
? ?1)用戶期望的pod副本數(shù)量
? ?2)標簽選擇器,判斷哪個pod歸自己管理
? ?3)當現(xiàn)存的pod數(shù)量不足,會根據(jù)pod資源模板進行新建
幫助用戶管理無狀態(tài)的pod資源,精確反應(yīng)用戶定義的目標數(shù)量,但是RelicaSet不是直接使用的控制器,而是使用Deployment。
(2)Deployment:工作在ReplicaSet之上,用于管理無狀態(tài)應(yīng)用,目前來說最好的控制器。支持滾動更新和回滾功能,還提供聲明式配置。
ReplicaSet 與Deployment 這兩個資源對象逐步替換之前RC的作用。
(3)DaemonSet:用于確保集群中的每一個節(jié)點只運行特定的pod副本,通常用于實現(xiàn)系統(tǒng)級后臺任務(wù)。比如ELK服務(wù)
特性:服務(wù)是無狀態(tài)的
服務(wù)必須是守護進程
(4)StatefulSet:管理有狀態(tài)應(yīng)用
(5)Job:只要完成就立即退出,不需要重啟或重建
(6)Cronjob:周期性任務(wù)控制,不需要持續(xù)后臺運行
?
1.3 pod容器中的有狀態(tài)和無狀態(tài)的對比?
(1)有狀態(tài)實例?
- 實例之間有差別,每個實例都有自己的獨特性,元數(shù)據(jù)不同,例如etcd,zookeeper
- 實例之間不對等的關(guān)系,以及依靠外部存儲的應(yīng)用?
(2)無狀態(tài)實例?
- deployment認為所有的pod都是一樣的
- 不用考慮順序的要求
- 不用考慮在哪個node節(jié)點上運行
- 可以隨意擴容和縮容
二、SatefulSet控制器?
2.1 SatefulSet?控制器的運用?
?StatefulSet 是用來管理有狀態(tài)應(yīng)用的工作負載 API 對象。
StatefulSet 用來管理某?Pod?集合的部署和擴縮, 并為這些 Pod 提供持久存儲和持久標識符。
和?Deployment?類似, StatefulSet 管理基于相同容器規(guī)約的一組 Pod。但和 Deployment 不同的是, StatefulSet 為它們的每個 Pod 維護了一個有粘性的 ID。這些 Pod 是基于相同的規(guī)約來創(chuàng)建的, 但是不能相互替換:無論怎么調(diào)度,每個 Pod 都有一個永久不變的 ID。
如果希望使用存儲卷為工作負載提供持久存儲,可以使用 StatefulSet 作為解決方案的一部分。 盡管 StatefulSet 中的單個 Pod 仍可能出現(xiàn)故障, 但持久的 Pod 標識符使得將現(xiàn)有卷與替換已失敗 Pod 的新 Pod 相匹配變得更加容易。
?2.2?SatefulSet?控制器的案例演示
- 名為?
nginx-svc
?的 Headless Service 用來控制網(wǎng)絡(luò)域名。 - 名為 nginx-sts?的 StatefulSet 有一個 Spec,它表明將在獨立的 3 個 Pod 副本中啟動 nginx 容器。
volumeClaimTemplates
?將通過 PersistentVolume 制備程序所準備的??PersistentVolumes來提供穩(wěn)定的存儲
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
ports:
- port: 80
targetPort: 80
clusterIP: None
selector:
app: nginx-sts
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nginx-sts
spec:
replicas: 3
serviceName: "nginx-sts"
selector:
matchLabels:
app: nginx-sts
template:
metadata:
labels:
app: nginx-sts
spec:
containers:
- image: nginx:1.14
imagePullPolicy: IfNotPresent
name: nginx-test
ports:
- containerPort: 80
protocol: TCP
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "nfs-client-storageclass"
resources:
requests:
storage: 2Gi
案例的更行擴容與縮容演示??
kubectl edit sts
?
(1) 為什么要有headless?
在deployment中,每一個pod是沒有名稱,是隨機字符串,是無序的。而statefulset中是要求有序的,每一個pod的名稱必須是固定的。當節(jié)點掛了,重建之后的標識符是不變的,每一個節(jié)點的節(jié)點名稱是不能改變的。pod名稱是作為pod識別的唯一標識符,必須保證其標識符的穩(wěn)定并且唯一。
為了實現(xiàn)標識符的穩(wěn)定,這時候就需要一個headless service 解析直達到pod,還需要給pod配置一個唯一的名稱。
(2)為什么要有volumeClaimTemplate?
?大部分有狀態(tài)副本集都會用到持久存儲,比如分布式系統(tǒng)來說,由于數(shù)據(jù)是不一樣的,每個節(jié)點都需要自己專用的存儲節(jié)點。而在 deployment中pod模板中創(chuàng)建的存儲卷是一個共享的存儲卷,多個pod使用同一個存儲卷,而statefulset定義中的每一個pod都不能使用同一個存儲卷,由此基于pod模板創(chuàng)建pod是不適應(yīng)的,這就需要引入volumeClaimTemplate,當在使用statefulset創(chuàng)建pod時,會自動生成一個PVC,從而請求綁定一個PV,從而有自己專用的存儲卷。
服務(wù)發(fā)現(xiàn):就是應(yīng)用服務(wù)之間相互定位的過程。
應(yīng)用場景:
●動態(tài)性強:Pod會飄到別的node節(jié)點
●更新發(fā)布頻繁:互聯(lián)網(wǎng)思維小步快跑,先實現(xiàn)再優(yōu)化,老板永遠是先上線再慢慢優(yōu)化,先把idea變成產(chǎn)品掙到錢然后再慢慢一點一點優(yōu)化
●支持自動伸縮:一來大促,肯定是要擴容多個副本
K8S里服務(wù)發(fā)現(xiàn)的方式---DNS,使K8S集群能夠自動關(guān)聯(lián)Service資源的“名稱”和“CLUSTER-IP”,從而達到服務(wù)被集群自動發(fā)現(xiàn)的目的。
?
實現(xiàn)K8S里DNS功能的插件:
●skyDNS:Kubernetes 1.3之前的版本
●kubeDNS:Kubernetes 1.3至Kubernetes 1.11
●CoreDNS:Kubernetes 1.11開始至今?
?(3)對StatefulSet控制的總結(jié)
1、部署有狀態(tài)應(yīng)用的 ??
2、每個Pod的名稱是唯一且固定不變的,而且每個Pod應(yīng)該擁有自己專屬的持久化存儲(基于PVC模板volumeClaimTemplates綁定PV)
3、需要關(guān)聯(lián) Headless Service(ClusterIP為None),在K8S集群內(nèi)部可通過 <pod_name>.<svc.name>.<namespace_name>.svc.cluster.local 的格式解析出 PodIP (基于無頭服務(wù)和CoreDNS實現(xiàn))
4、創(chuàng)建、刪除、升級、擴縮容Pod都是有序進行的(默認為串行執(zhí)行的):
? ? 創(chuàng)建、升級,擴容是升序執(zhí)行的(順序為Pod標識序號0..n-1),刪除是逆序執(zhí)行的(順序為 n-1..0)
? 縮容和回滾都是逆序執(zhí)行的(順序為 n-1..0),會先刪除舊Pod,再創(chuàng)建新Pod?
?三、DaemonSet控制器
?3.1??DaemonSet控制器的運用
DaemonSet 確保全部(或者一些)Node 上運行一個 Pod 的副本。當有 Node 加入集群時,也會為他們新增一個 Pod 。當有 Node 從集群移除時,這些 Pod 也會被回收。刪除 DaemonSet 將會刪除它創(chuàng)建的所有 Pod。
使用 DaemonSet 的一些典型用法:
●運行集群存儲 daemon,例如在每個 Node 上運行 glusterd、ceph。
●在每個 Node 上運行日志收集 daemon,例如fluentd、logstash。
●在每個 Node 上運行監(jiān)控 daemon,例如 Prometheus Node Exporter、collectd、Datadog 代理、New Relic 代理,或 Ganglia gmond。
應(yīng)用場景:Agent
官方案例(監(jiān)控):
DaemonSet | Kubernetes
3.2?DaemonSet控制器的案例演示?
vim ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx-daemonSet
labels:
app: nginx
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14
ports:
- containerPort: 80
kubectl apply -f ds.yaml
?守護進程控制器會在每一個node節(jié)點上創(chuàng)建一個相同的pod
?DaemonSet
1、理論上可以在K8S集群的所有Node節(jié)點上創(chuàng)建同類型的Pod資源(無論Node節(jié)點什么加入到K8S集群)
2、會受到Node節(jié)點上的污點或者cordon不可調(diào)度設(shè)置的影響??梢栽赑od配置中設(shè)置容忍忽略污點,設(shè)置uncordon解除不可調(diào)度
3、不需要設(shè)置副本數(shù)replicas
總結(jié):
Pod控制器
1)Deployment + ReplicaSet
部署無狀態(tài)應(yīng)用(沒有實時的數(shù)據(jù)需要存儲)
負責創(chuàng)建和管理ReplicaSet,維護Pod副本數(shù)與預(yù)期值保持一致
負責創(chuàng)建和刪除控制器管理的Pod資源,有多個Pod副本時是并行創(chuàng)建啟動的,升級策略默認為滾動更新的方式2)StatefulSet
部署有狀態(tài)應(yīng)用(有實時的數(shù)據(jù)需要存儲)
每個Pod名稱標識都是唯一且固定不變的
每個Pod都可以有自己專屬的持久化存儲(基于PVC模板volumeClaimTemplates實現(xiàn)的)
需要提前創(chuàng)建一個Headless Service資源(無頭服務(wù),ClusterIP為Node的service資源),在StatefulSet資源配置中使用serviceName字段指定Headless Service資源名稱
K8S集群的Pod可以通過<Pod名稱>.<svc名稱>.<命名空間>格式解析出StatefulSet控制器管理的Pod資源的PodIP(基于Headless Service和CoreDNS實現(xiàn)的)
創(chuàng)建、滾動升級、擴容、縮容Pod副本時都是有序進行的(由spec.podManagementPolicy字段決定的,默認為OrderedReady,如果設(shè)置為Parallel則并行的管理Pod)
創(chuàng)建、擴容是升序進行的(順序為Pod標識號從0到n-1) ? 滾動升級、縮容是倒序進行的(順序為Pod標識號從n-1到0)Service資源的類型:4個常規(guī)類型(ClusterIP ?NodePort ?LoadBalancer ?ExternalName)+ 1個特殊類型(Headless Service)
3)DaemonSet
通常用于部署daemon(守護進程)級別的無狀態(tài)應(yīng)用
理論上可以在K8S集群所有node節(jié)點上都創(chuàng)建一個相同的Pod副本,無論node節(jié)點何時加入到K8S集群(需要考慮到污點taint和cordon不可調(diào)度的影響)
DaemonSet資源配置不需要設(shè)置Pod副本數(shù)字段replicas4)Job
一次性的部署短期任務(wù)的Pod資源,Pod不會持續(xù)運行,并要求任務(wù)執(zhí)行完畢后容器成功退出且不再重啟
Job資源配置的容器重啟策略要求不能設(shè)置為Always,一般推薦設(shè)置為Never
如果任務(wù)執(zhí)行失敗導致Pod容器異常退出,Job會根據(jù)backoffLimit字段的值決定重建Pod來重試任務(wù)的次數(shù)(默認為6)文章來源:http://www.zghlxwxcb.cn/news/detail-838367.html5)CronJob
周期性的部署短期任務(wù)的Pod資源,Pod不會持續(xù)運行,并要求任務(wù)執(zhí)行完畢后容器成功退出且不再重啟
Pod容器重啟策略要求不能設(shè)置為Always,一般推薦設(shè)置為Never
要配置schedule字段設(shè)置任務(wù)執(zhí)行的周期表,格式為"分 時 日 月 周"文章來源地址http://www.zghlxwxcb.cn/news/detail-838367.html
到了這里,關(guān)于[云原生] K8s之pod控制器詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!