最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

k8s之Pod控制器使用及說明

 更新時(shí)間:2025年11月28日 16:10:59   作者:劉艷芬_  
本文介紹了Kubernetes中的Pod控制器,包括Deployment、ReplicaSet、StatefulSet、DaemonSet、Job和CronJob等類型,詳細(xì)解釋了它們的工作原理、特點(diǎn)和應(yīng)用場景

k8s之Pod控制器

一、Pod控制器

  • Pod控制器,又稱之為工作負(fù)載(workload),是用于實(shí)現(xiàn)管理pod的中間層,確保pod資源符合預(yù)期的狀態(tài),pod的資源出現(xiàn)故障時(shí),會(huì)嘗試進(jìn)行重啟,當(dāng)根據(jù)重啟策略無效,則會(huì)重新新建pod的資源。

1、pod控制器類型

1.1 ReplicaSet
  • 代用戶創(chuàng)建指定數(shù)量的pod副本,確保pod副本數(shù)量符合預(yù)期狀態(tài),并且支持滾動(dòng)式自動(dòng)擴(kuò)容和縮容功能。

ReplicaSet主要三個(gè)組件組成

  • 用戶期望的pod副本數(shù)量
  • 標(biāo)簽選擇器,判斷哪個(gè)pod歸自己管理
  • 當(dāng)現(xiàn)存的pod數(shù)量不足,會(huì)根據(jù)pod資源模板進(jìn)行新建

幫助用戶管理無狀態(tài)的pod資源,精確反應(yīng)用戶定義的目標(biāo)數(shù)量,但是RelicaSet不是直接使用的控制器,而是使用Deployment。

1.2 Deployment
  • Deployment是最常用的Pod控制器之一,建立在ReplicaSet之上,它用于部署無狀態(tài)應(yīng)用程序。Deployment定義了Pod的期望副本數(shù),并通過滾動(dòng)更新和回滾機(jī)制來管理Pod的升級(jí)和降級(jí)。
  • 工作在ReplicaSet之上,用于管理無狀態(tài)應(yīng)用,目前來說最好的控制器。支持滾動(dòng)更新和回滾功能,還提供聲明式配置。
1.3 DaemonSet
  • 用于確保集群中的每一個(gè)節(jié)點(diǎn)運(yùn)行一個(gè)pod副本,通常用于實(shí)現(xiàn)系統(tǒng)級(jí)后臺(tái)任務(wù)。比如ELK服務(wù)。
1.4 StatefulSet
  • 部署有狀態(tài)的應(yīng)用,每個(gè)pod的名稱是唯一不變的,每個(gè)pod擁有自己專屬的持久化的存儲(chǔ)(pv/pvc)。
1.5 Job
  • Job用于運(yùn)行一次性任務(wù),如批處理作業(yè)或短生命周期的應(yīng)用程序。Job會(huì)創(chuàng)建Pod來執(zhí)行任務(wù),并在任務(wù)完成后刪除Pod。
  • 只要完成就立即退出,不需要重啟或重建。
1.6 Cronjob
  • 周期性任務(wù)控制,不需要持續(xù)后臺(tái)運(yùn)行

2、Pod與控制器之間的關(guān)系

  • controllers:在集群上管理和運(yùn)行容器的 pod 對(duì)象, pod 通過 label-selector 相關(guān)聯(lián)。
  • Pod 通過控制器實(shí)現(xiàn)應(yīng)用的運(yùn)維,如伸縮,升級(jí)等。

二、使用POD控制器

1、Deployment

  • 部署無狀態(tài)應(yīng)用
  • 管理Pod和ReplicaSet
  • 具有上線部署、副本設(shè)定、滾動(dòng)升級(jí)、回滾等
  • 提供聲明式更新,例如只更新一個(gè)新的image
  • 應(yīng)用場景:Web服務(wù)、微服務(wù)
1.1 創(chuàng)建控制器
kubectl create deployment deploy --image=nginx:1.18 --port=80 --replicas=1 --dry-run=client -oyaml > deploy.yaml
#生成yaml配置文件模板

#修改yaml配置文件
vim deploy.yaml
apiVersion: apps/v1
#指定API版本
kind: Deployment
#指定創(chuàng)建資源類型為Deployment
metadata:
#定義資源的元數(shù)據(jù)信息
  name: nginx-deploy
  #指定資源的名稱
  labels:
  #設(shè)置標(biāo)簽
    app: nginx
    #標(biāo)簽以鍵值表示,標(biāo)簽鍵為app,標(biāo)簽值為nginx
spec:
#定義資源的規(guī)格
  replicas: 1
  #指定創(chuàng)建pod數(shù)量為1個(gè)
  selector:
  #選擇由Deployment管理的Pod的標(biāo)簽選擇器
    matchLabels:
    #指定用于匹配的標(biāo)簽
      app: nginx
      #設(shè)置標(biāo)簽需要與模板標(biāo)簽一致
  template:
  #創(chuàng)建pod的模板,deployment管理的pod實(shí)例,都由此模板定義
    metadata:
    #模板的元數(shù)據(jù)信息
      labels:
      #定義pod的標(biāo)簽
        app: nginx
        #此處需要與deployment管理pod的標(biāo)簽選擇器一致
    spec:
    #pod的規(guī)格信息
      containers:
      #定義pod中運(yùn)行的容器列表
      - name: nginx
      #指定容器名稱
        image: nginx:1.18.0
        #指定鏡像版本
        ports:
        #定義端口
        - containerPort: 80
        #定義容器內(nèi)部的監(jiān)聽端口

kubectl apply -f deploy.yaml
#創(chuàng)建資源

kubectl get pods,deploy,rs
#查看pod資源信息

1.2 更新版本
curl 10.244.2.116 -I
#查看版本信息(nginx版本信息是1.80版本)

#修改yaml配置文件
vim deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx-deploy
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.20
      #修改版本號(hào)
        name: nginx
        ports:
        - containerPort: 80

kubectl apply -f deploy.yaml
#重新創(chuàng)建資源

1.3 查看更新的版本號(hào)
kubectl get pod -w
#另開一個(gè)終端,追蹤查看pod更新過程

curl -I 10.244.1.104
#查看版本信息(nginx版本更新為1.20版本)

2、SatefulSet

StatefulSet 是 Kubernetes 中的一個(gè)資源控制器,它用于管理有狀態(tài)的應(yīng)用。與 Deployment 和 ReplicaSet 這樣的無狀態(tài)工作負(fù)載不同,StatefulSet 為每個(gè) Pod 提供了一個(gè)穩(wěn)定的、唯一的標(biāo)識(shí)符,并且能夠保證 Pod 的部署順序和終止順序。

  • 穩(wěn)定的標(biāo)識(shí)符:每個(gè)Pod都有一個(gè)唯一的、持久的標(biāo)識(shí)符,這個(gè)標(biāo)識(shí)符在 Pod 的整個(gè)生命周期中都是不變的。這使得即使 Pod 被重新調(diào)度,其標(biāo)識(shí)符也會(huì)保持不變。這一功能常常基于Headless(無頭模式,即沒有Cluster IP的Service)實(shí)現(xiàn)
  • 有序的部署和擴(kuò)展:Pod 是按照特定的順序進(jìn)行創(chuàng)建和擴(kuò)展(0到N-1)的。這允許應(yīng)用程序在部署時(shí)按照特定的順序進(jìn)行初始化。
  • 有序的終止和縮容:當(dāng)縮容或刪除 StatefulSet 時(shí),Pod 會(huì)按照相反的順序(N-1到0)進(jìn)行終止。這允許應(yīng)用程序在關(guān)閉時(shí)按照特定的順序進(jìn)行清理。
  • 穩(wěn)定的持久化存儲(chǔ):StatefulSet 常常與 PersistentVolumeClaims(PVCs)一起使用,以提供穩(wěn)定的存儲(chǔ)。即使 Pod 被重新調(diào)度,其存儲(chǔ)卷也會(huì)被保留并重新附加到新的 Pod 上。
  • 常見的應(yīng)用場景:數(shù)據(jù)庫
https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/
#官方文檔
2.1 StatefulSet的三個(gè)關(guān)鍵組成部分以及其作用

StatefulSet 的設(shè)計(jì)是為了滿足有狀態(tài)應(yīng)用的需求,這些應(yīng)用通常需要持久化存儲(chǔ)和穩(wěn)定的網(wǎng)絡(luò)標(biāo)識(shí)。

2.1.1 Headless Service(無頭服務(wù))
  • 目的:Headless Service 用于為 StatefulSet 中的每個(gè) Pod 提供一個(gè)穩(wěn)定的 DNS 名稱。這樣,即使 Pod 被重新調(diào)度到其他節(jié)點(diǎn),它的 DNS 名稱也不會(huì)改變,從而保證了網(wǎng)絡(luò)標(biāo)識(shí)的穩(wěn)定性。
  • 實(shí)現(xiàn):Headless Service 不分配 Cluster IP,而是直接將 DNS 請(qǐng)求解析到對(duì)應(yīng)的 Pod IP。這樣,每個(gè) Pod 都有一個(gè)基于 StatefulSet 名稱和 Pod 序號(hào)的 DNS 子域,例如 web-0.nginx.default.svc.cluster.local。
2.1.2 VolumeClaimTemplates
  • 目的:VolumeClaimTemplates 用于為每個(gè) Pod 提供獨(dú)立的持久化存儲(chǔ)。這樣,每個(gè) Pod 都有自己的存儲(chǔ)空間,即使在 Pod 重新調(diào)度后,也能保持?jǐn)?shù)據(jù)的連續(xù)性和一致性。
  • 實(shí)現(xiàn):在 StatefulSet 的定義中,可以包含一個(gè)或多個(gè) VolumeClaimTemplates。當(dāng) StatefulSet 創(chuàng)建 Pod 時(shí),會(huì)為每個(gè) Pod 創(chuàng)建相應(yīng)的 PersistentVolumeClaim (PVC)。這些 PVC 會(huì)請(qǐng)求與 StatefulSet 關(guān)聯(lián)的 PersistentVolume (PV),從而為每個(gè) Pod 提供專用的存儲(chǔ)卷。
2.1.3 StatefulSet 控制器
  • 目的:StatefulSet 控制器負(fù)責(zé)管理 Pod 的生命周期,確保 Pod 的數(shù)量符合用戶的期望,并且按照順序進(jìn)行部署、擴(kuò)展和收縮。
  • 實(shí)現(xiàn):StatefulSet 控制器會(huì)監(jiān)控 Pod 的狀態(tài),確保每個(gè) Pod 都按照定義的順序運(yùn)行。在進(jìn)行滾動(dòng)更新時(shí),它會(huì)按照順序逐個(gè)更新 Pod,確保在更新下一個(gè) Pod 之前,所有先前的 Pod 都已經(jīng)就緒。同樣,在刪除 Pod 時(shí),也會(huì)按照相反的順序進(jìn)行,以確保服務(wù)的平滑過渡。

總結(jié)

  • Headless Service(無頭服務(wù)):用于為Pod資源標(biāo)識(shí)符生成可解析的DNS記錄
  • VolumeClaimTemplates(存儲(chǔ)卷申請(qǐng)模板):基于靜態(tài)或動(dòng)態(tài)PV供給方式為Pod資源提供專有的固定存儲(chǔ)
  • StatefulSet:用于管控Pod資源

這三個(gè)組件共同工作,使得 StatefulSet 能夠?yàn)橛袪顟B(tài)應(yīng)用提供所需的穩(wěn)定性和可靠性。Headless Service 解決了網(wǎng)絡(luò)標(biāo)識(shí)的穩(wěn)定性問題,VolumeClaimTemplates 解決了持久化存儲(chǔ)的需求,而 StatefulSet 控制器則確保了 Pod 的有序管理和更新。這種設(shè)計(jì)使得 StatefulSet 成為部署和管理有狀態(tài)應(yīng)用的理想選擇,如數(shù)據(jù)庫、消息隊(duì)列等。

為什么要有headless?

  • 在deployment中,每一個(gè)pod是沒有名稱,是隨機(jī)字符串,是無序的。而statefulset中是要求有序的,每一個(gè)pod的名稱必須是固定的。當(dāng)節(jié)點(diǎn)掛了,重建之后的標(biāo)識(shí)符是不變的,每一個(gè)節(jié)點(diǎn)的節(jié)點(diǎn)名稱是不能改變的。pod名稱是作為pod識(shí)別的唯一標(biāo)識(shí)符,必須保證其標(biāo)識(shí)符的穩(wěn)定并且唯一。
  • 為了實(shí)現(xiàn)標(biāo)識(shí)符的穩(wěn)定,這時(shí)候就需要一個(gè)headless service 解析直達(dá)到pod,還需要給pod配置一個(gè)唯一的名稱。

為什么要有volumeClainTemplate?

  • 大部分有狀態(tài)副本集都會(huì)用到持久存儲(chǔ),比如分布式系統(tǒng)來說,由于數(shù)據(jù)是不一樣的,每個(gè)節(jié)點(diǎn)都需要自己專用的存儲(chǔ)節(jié)點(diǎn)。而在 deployment中pod模板中創(chuàng)建的存儲(chǔ)卷是一個(gè)共享的存儲(chǔ)卷,多個(gè)pod使用同一個(gè)存儲(chǔ)卷,而statefulset定義中的每一個(gè)pod都不能使用同一個(gè)存儲(chǔ)卷,由此基于pod模板創(chuàng)建pod是不適應(yīng)的,這就需要引入volumeClainTemplate,當(dāng)在使用statefulset創(chuàng)建pod時(shí),會(huì)自動(dòng)生成一個(gè)PVC,從而請(qǐng)求綁定一個(gè)PV,從而有自己專用的存儲(chǔ)卷。

服務(wù)發(fā)現(xiàn):就是應(yīng)用服務(wù)之間相互定位的過程。

應(yīng)用場景

  • 動(dòng)態(tài)性強(qiáng):Pod會(huì)飄到別的node節(jié)點(diǎn)
  • 更新發(fā)布頻繁:互聯(lián)網(wǎng)思維小步快跑,先實(shí)現(xiàn)再優(yōu)化,老板永遠(yuǎn)是先上線再慢慢優(yōu)化,先把idea變成產(chǎn)品掙到錢然后再慢慢一點(diǎn)一點(diǎn)優(yōu)化
  • 支持自動(dòng)伸縮:一來大促,肯定是要擴(kuò)容多個(gè)副本

K8S里服務(wù)發(fā)現(xiàn)的方式—DNS,使K8S集群能夠自動(dòng)關(guān)聯(lián)Service資源的“名稱”和“CLUSTER-IP”,從而達(dá)到服務(wù)被集群自動(dòng)發(fā)現(xiàn)的目的。

實(shí)現(xiàn)K8S里DNS功能的插件

  • skyDNS:Kubernetes 1.3之前的版本
  • kubeDNS:Kubernetes 1.3至Kubernetes 1.11
  • CoreDNS:Kubernetes 1.11開始至今
2.2 創(chuàng)建控制器
  • 先清空之前創(chuàng)建的pod資源

  • 驗(yàn)證dns是否可以使用
kubectl run busybox --image=busybox:1.28 -- sleep 36000
#創(chuàng)建一個(gè)busybox的pod,該容器提供一些基本的命令,主要用于測試環(huán)境

kubectl get pod busybox
#查看pod資源

kubectl exec -it busybox sh
#進(jìn)入容器

/ # nslookup kubernetes
#測試svc能否正常解析,可以使用kubectl get svc查看有哪些svc(解析正常,解析kubernetes的地址為10.96.0.1)

kubectl get svc
#查看svc資源信息

2.2.1 創(chuàng)建svc資源
#編輯yaml配置文件
vim service.yaml
apiVersion: v1
#指定API版本
kind: Service
#創(chuàng)建資源類型為Service
metadata:
  name: headless-svc
  #指定service名稱
  labels:
    app: headless-svc
    #設(shè)置service標(biāo)簽
spec:
  ports:
  - port: 80
  #service端口
    name: web
    #端口名稱
    targetPort: 80
    #指定流量轉(zhuǎn)發(fā)的目標(biāo)端口,與pod暴露的端口一致
  clusterIP: None
  #將clusterIP地址的值設(shè)置為None,表示無IP地址,即無頭模式
  selector:
  #選擇管理的標(biāo)簽
    app: state
    #此標(biāo)簽需要與StatefulSet控制器管理的pod模板中定義的標(biāo)簽一致
  type: ClusterIP
  #設(shè)置類型為ClusterIP,此為默認(rèn)設(shè)置,可以省略

kubectl apply -f service.yaml
#創(chuàng)建資源

kubectl get svc headless-svc
#查看資源信息

2.2.2 創(chuàng)建StatefulSet
#編輯yaml配置文件
vim statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
#創(chuàng)建資源類型為StatefulSet
metadata:
  name: state
  #指定資源名稱
spec:
  serviceName: headless-svc
  #指定需要綁定的service名稱
  replicas: 3
  #創(chuàng)建pod數(shù)量為三個(gè)
  selector:
  #標(biāo)簽選擇器,指定StatefulSet要管理哪些pod
    matchLabels:
    #指定標(biāo)簽名稱
      app: state
      #必須與service中selector定義的標(biāo)簽一致。pod含有此標(biāo)簽的,都會(huì)去管理
  template:
  #指定pod創(chuàng)建模板
    metadata:
      labels:
        app: state
        #設(shè)置pod標(biāo)簽,與上面標(biāo)簽選擇器相同,StatefulSet才會(huì)管理
    spec:
      containers:
      #定義pod中運(yùn)行的容器
      - name: nginx-pod
      #應(yīng)當(dāng)設(shè)置有狀態(tài)的服務(wù),在此以nginx為例,官方文檔有MySQL示例
        image: nginx:1.18.0
        #定義鏡像
        ports:
        - containerPort: 80
        #定義容器監(jiān)聽端口
          name: web
          #端口名稱
        volumeMounts:
        #定義將存儲(chǔ)卷卷掛載到指定目錄
        - name: html
        #指定存儲(chǔ)卷名稱
          mountPath: /usr/share/nginx/html
          #掛載到此目錄,此目錄為nginx服務(wù)的站點(diǎn)目錄
  volumeClaimTemplates:
  #PVC的請(qǐng)求模板
  - metadata:
      name: html
      #定義PVC的名稱
      annotations:
        volume.beta.kubernetes.io/storage-class: nfs-client-storageclass
        #用于指定存儲(chǔ)類的注解。該存儲(chǔ)類定義了用于動(dòng)態(tài)卷供應(yīng)的后端存儲(chǔ)類型
    spec:
      accessModes: ["ReadWriteOnce"]
      #指定訪問模式為RWO
      resources:
        requests:
          storage: 2Gi
          #指定存儲(chǔ)卷的使用大小

kubectl apply -f statefulset.yaml 
#創(chuàng)建資源
長度、
kubectl get statefulsets.apps state
#查看資源信息

kubectl get pod -owide -w
#查看pod資源信息
#它會(huì)按照0到N-1的順序去指定pod名稱,一定建立,指定pod生命周期結(jié)束,否則IP地址改變,它的名稱也不會(huì)改變

kubectl get pv,pvc
#查看pv/pvc資源信息

  • 在nfs服務(wù)器上自定義web頁面
  • nfs服務(wù)器
cd /nfs/k8s
#切換目錄

echo "this is state-0" > default-html-state-0-pvc-5d4f3a8c-f5da-4aae-a244-1cfef9f328ec/index.html
#編輯state-0訪問頁面

echo "this is state-1" > default-html-state-1-pvc-23363402-a920-471e-9a1b-da43af18620d/index.html
#編輯state-1訪問頁面

echo "this is state-2" > default-html-state-2-pvc-754e992e-4573-408d-b78d-687f5dfd285f/index.html
#編輯state-2訪問頁面

  • 訪問驗(yàn)證

由于沒有ClusterIP地址,想要通過IP地址訪問,只能在k8s集群中直接訪問podIP

curl 10.244.2.120
curl 10.244.2.121
curl 10.244.1.109
#訪問驗(yàn)證

2.2.3 使用service訪問
  • 創(chuàng)建的svc是可以進(jìn)行解析的
kubectl exec -it busybox sh
#進(jìn)入容器

/ # nslookup headless-svc
#查看dns解析
#service會(huì)通過endpoint關(guān)聯(lián)到后端的pod

  • 訪問驗(yàn)證

由于pod的IP地址是k8s集群內(nèi)部的IP地址,且并沒有clusterIP去綁定podIP,只有域名管理,宿主機(jī)的DNS解析,無法解析k8s集群內(nèi)部的域名與地址,所以使用宿主機(jī)無法訪問pod。只能通過創(chuàng)建pod,在pod中進(jìn)行訪問

kubectl run centos --image=centos:7 -- sleep 36000
#創(chuàng)建一個(gè)centos容器,訪問service

kubectl exec -it centos sh
#進(jìn)入容器

curl headless-svc
#訪問驗(yàn)證

2.3 刪除與創(chuàng)建

  • 當(dāng)pod刪除時(shí),會(huì)按照N-1到0的順序,倒序刪除
kubectl delete -f statefulset.yaml
#刪除pod資源

kubectl get pod -w
#另開一個(gè)終端,跟蹤查看pod資源信息

  • 重新創(chuàng)建的時(shí)候,數(shù)據(jù)會(huì)持久化 ,而且創(chuàng)建的順序還是按照0到N-1的順序創(chuàng)建
kubectl apply -f statefulset.yaml 
#重新創(chuàng)建資源

kubectl exec -it centos sh
#進(jìn)入容器

curl headless-svc
#訪問驗(yàn)證(重新創(chuàng)建之后再次訪問,數(shù)據(jù)不會(huì)丟失)

  • 重新創(chuàng)建之后再次訪問,數(shù)據(jù)不會(huì)丟失
kubectl exec -it busybox sh
#進(jìn)入測試容器

/ # nslookup headless-svc
#測試svc解析,后端ip地址發(fā)生變化
#不論后端的IP地址如何變化,只通過DNS來解析service,從而綁定后端的IP地址,得到數(shù)據(jù)

2.4 deployment與statefulset的區(qū)別
2.4.1 應(yīng)用場景
  • Deployment:主要用于部署無狀態(tài)服務(wù),即服務(wù)實(shí)例之間可以相互替換且不需要保留特定的網(wǎng)絡(luò)標(biāo)識(shí)或存儲(chǔ)數(shù)據(jù)。它適用于那些不需要關(guān)心Pod具體身份且可任意替換的彈性 服務(wù)。

  • StatefulSet:適用于部署有狀態(tài)的服務(wù),比如數(shù)據(jù)庫集群、消息隊(duì)列等。這些服務(wù)需要穩(wěn)定的持久化存儲(chǔ)和唯一、有序的網(wǎng)絡(luò)標(biāo)識(shí)。StatefulSet為Pod分配的網(wǎng)絡(luò)標(biāo)識(shí)符和存儲(chǔ)都是穩(wěn)定的,使得應(yīng)用能夠維持跨重啟或再調(diào)度的持久狀態(tài)。

2.4.2 Pod管理
  • Deployment:通過ReplicaSet確保指定數(shù)量的Pod副本始終運(yùn)行,提供水平擴(kuò)展和滾動(dòng)更新能力。Pod由Deployment創(chuàng)建時(shí),雖然可以自定義名稱,但通常由系統(tǒng)生成,并在重建或擴(kuò)展時(shí)可能會(huì)發(fā)生變化。

  • StatefulSet:Pods在創(chuàng)建、更新和刪除時(shí)按照順序進(jìn)行,以滿足那些依賴于嚴(yán)格順序啟動(dòng)或停止的應(yīng)用場景需求。每個(gè)Pod都有一個(gè)固定的、唯一的網(wǎng)絡(luò)標(biāo)識(shí)符,并且其持久卷聲明(PVC)會(huì)綁定到持久化的存儲(chǔ),即使Pod被刪除后重新創(chuàng)建,存儲(chǔ)的數(shù)據(jù)也會(huì)保留。

2.4.3 存儲(chǔ)與網(wǎng)絡(luò)
  • Deployment:通常不直接管理Pod的存儲(chǔ)和網(wǎng)絡(luò),而是依賴于其他Kubernetes資源(如PersistentVolume和Service)來實(shí)現(xiàn)這些功能。

  • StatefulSet:為Pod提供穩(wěn)定的存儲(chǔ)和網(wǎng)絡(luò)標(biāo)識(shí),確保有狀態(tài)應(yīng)用能夠正常運(yùn)行。StatefulSet通常與Headless Service和volumeClaimTemplate一起使用,以提供可解析的DNS資源記錄和專有且固定的存儲(chǔ)。

2.4.4 升級(jí)與回滾
  • Deployment:支持多種升級(jí)策略,如滾動(dòng)更新和回滾,確保服務(wù)在整個(gè)升級(jí)過程中具有高可用性。通過更新Deployment的PodTemplateSpec字段來聲明Pod的新狀態(tài),并逐步替換舊的Pod。

  • StatefulSet:也支持有序而自動(dòng)的滾動(dòng)更新,但由于涉及到有狀態(tài)應(yīng)用,更新過程可能更加復(fù)雜和嚴(yán)格。同時(shí),StatefulSet也支持回滾到之前的版本。

2.4.5 擴(kuò)展性
  • Deployment:可以根據(jù)系統(tǒng)負(fù)載進(jìn)行水平擴(kuò)展和縮容,通過調(diào)整ReplicaSet的副本數(shù)來實(shí)現(xiàn)。

  • StatefulSet:雖然也支持?jǐn)U展和縮容操作,但由于涉及到有狀態(tài)應(yīng)用和數(shù)據(jù)一致性等問題,擴(kuò)展性可能相對(duì)較弱。

3、DaemonSet

  • DaemonSet 是 Kubernetes 中的一種工作負(fù)載控制器,它確保在集群中的所有(或指定的)節(jié)點(diǎn)上運(yùn)行一個(gè) Pod 的副本。這使得 DaemonSet 成為運(yùn)行集群級(jí)服務(wù)的理想選擇,如日志收集、監(jiān)控代理、存儲(chǔ)守護(hù)進(jìn)程等。
3.1 關(guān)鍵特性
  • 節(jié)點(diǎn)覆蓋:DaemonSet 確保在集群中的每個(gè)節(jié)點(diǎn)上都有一個(gè) Pod 副本運(yùn)行,或者根據(jù)需要在特定節(jié)點(diǎn)上運(yùn)行。
  • 自動(dòng)管理:當(dāng)新節(jié)點(diǎn)加入集群時(shí),DaemonSet 會(huì)自動(dòng)在這些節(jié)點(diǎn)上創(chuàng)建 Pod。當(dāng)節(jié)點(diǎn)被移除時(shí),相應(yīng)的 Pod 也會(huì)被清理。
  • 刪除行為:刪除 DaemonSet 會(huì)刪除它創(chuàng)建的所有 Pod,這有助于維護(hù)集群的整潔。
3.2 應(yīng)用場景
  • 集群存儲(chǔ)守護(hù)進(jìn)程:在每個(gè)節(jié)點(diǎn)上運(yùn)行如 GlusterFS 的 glusterd 或 Ceph 的守護(hù)進(jìn)程,以提供分布式存儲(chǔ)服務(wù)。
  • 日志收集:部署如 Fluentd、Logstash 等日志收集代理,以便在每個(gè)節(jié)點(diǎn)上收集日志并將其發(fā)送到中央日志存儲(chǔ)。
  • 監(jiān)控代理:在每個(gè)節(jié)點(diǎn)上運(yùn)行監(jiān)控代理,如 Prometheus 的 Node Exporter、Collectd、Datadog 代理、New Relic 代理或 Ganglia 的 gmond,以收集節(jié)點(diǎn)的監(jiān)控?cái)?shù)據(jù)。
  • 網(wǎng)絡(luò)插件:在每個(gè)節(jié)點(diǎn)上運(yùn)行如Calico、Cilium或Flannel等
https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/
#官方案例(監(jiān)控)
3.3 創(chuàng)建控制器
#編輯yaml配置文件
vim daemonset.yaml  
apiVersion: apps/v1
kind: DaemonSet
#創(chuàng)建資源類型為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.18.0
        ports:
        - containerPort: 80

kubectl apply -f daemonset.yaml
#創(chuàng)建資源

kubectl get pod -owide
#查看詳細(xì)信息(DaemonSet會(huì)在每個(gè)node節(jié)點(diǎn)都創(chuàng)建一個(gè)Pod)

4、Job

  • Job控制器是Kubernetes中的一個(gè)核心組件,主要用于在集群中運(yùn)行一次性或批處理任務(wù)。Job確保在集群中運(yùn)行獨(dú)立的任務(wù),并在任務(wù)成功完成后自動(dòng)終止,不會(huì)重啟。
4.1 主要特點(diǎn)
  • 任務(wù)執(zhí)行:Job控制器主要負(fù)責(zé)批量處理短暫的一次性任務(wù)。當(dāng)任務(wù)執(zhí)行完畢后,Job會(huì)自動(dòng)將Pod的可用數(shù)設(shè)置為0,并將Pod的狀態(tài)置為Complete。
  • 任務(wù)記錄:當(dāng)Job創(chuàng)建的Pod成功執(zhí)行完任務(wù)后,Job會(huì)記錄成功結(jié)束的Pod數(shù)量。當(dāng)成功結(jié)束的Pod數(shù)量達(dá)到指定的數(shù)量時(shí),Job完成執(zhí)行。
  • 任務(wù)重試:Job支持定義任務(wù)的重試策略,通過backoffLimit字段指定Job失敗后進(jìn)行重試的次數(shù)。
  • 并行任務(wù):Job允許定義多個(gè)并行執(zhí)行的任務(wù),通過parallelism字段指定在任一時(shí)刻應(yīng)該并發(fā)運(yùn)行的Pod數(shù)量
4.2 應(yīng)用場景
  • Job常用于運(yùn)行那些僅需要執(zhí)行一次的任務(wù)

批處理作業(yè)

  • Kubernetes Job主要被用于執(zhí)行一次性批處理作業(yè),如每日數(shù)據(jù)分析、事務(wù)處理等。

數(shù)據(jù)遷移和清理

  • Job可以用來定時(shí)遷移大量數(shù)據(jù),以及維護(hù)數(shù)據(jù)庫

后臺(tái)任務(wù)

  • Job可以用來執(zhí)行后臺(tái)任務(wù),如計(jì)算任務(wù)、日志采集等

日志打包和壓縮

  • 例如按時(shí)間段打包日志文件、將多個(gè)日志文件壓縮成一個(gè)文件等。

備份和恢復(fù)操作

  • 例如備份數(shù)據(jù)庫、配置文件等,并將其存儲(chǔ)到云存儲(chǔ)服務(wù)中以便后續(xù)恢復(fù)

其它應(yīng)用場景

  • kube-bench掃描、離線數(shù)據(jù)處理,視頻解碼等業(yè)務(wù)
4.3 創(chuàng)建控制器
#編輯yaml配置文件
vim job.yaml
apiVersion: batch/v1
#Batch API的第一個(gè)穩(wěn)定版
kind: Job
#指定創(chuàng)建的資源類型是Job
metadata:
  name: job
  #資源名稱
spec:
  template:
    spec:
    #spec.template.spec 定義了 Pod 的規(guī)格,包括容器的名稱、鏡像和執(zhí)行的命令
      containers:
      - name: busybox
      #容器名稱
        image: busybox:1.28
        #鏡像名稱
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
        #perl解釋器,-Mbignum=bpi模塊中的子進(jìn)程,使用計(jì)算功能,計(jì)算結(jié)果輸出圓周率2000位的結(jié)果
      restartPolicy: Never
      #表示 Pod 失敗后不會(huì)重啟。
  backoffLimit: 4
  #表示 Job 在失敗后最多重試 4 次

kubectl apply -f job.yaml 
#創(chuàng)建資源

kubectl get job
#查看job資源信息

kubectl get pod -w
#追蹤查看pod資源信息

4.4 清除job資源
kubectl get job
#查看job資源信息

kubectl delete -f job.yaml 
#刪除job資源

kubectl get job
#查看job資源信息

#編輯yaml配置文件
vim job-limit.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: busybox
spec:
  template:
    spec:
      containers:
        - name: busybox
          image: busybox
          imagePullPolicy: IfNotPresent
          command: ["/bin/sh", "-c", "sleep 10;date;exit 1"]
      restartPolicy: Never
  backoffLimit: 2
  
kubectl apply -f job-limit.yaml
#創(chuàng)建資源
 
kubectl get job,pods
#查看資源信息
 
kubectl get pod -w
#追蹤查看資源信息

5、CronJob

  • 在Kubernetes中,CronJob控制器用于運(yùn)行定時(shí)任務(wù),例如備份、生成報(bào)告等。這些任務(wù)在指定的時(shí)間周期上自動(dòng)執(zhí)行。一個(gè) CronJob 對(duì)象就像 linux 系統(tǒng)上的 crontab(cron table)文件中的一行,使用Cron格式進(jìn)行編寫, 并周期性地在給定的調(diào)度時(shí)間執(zhí)行Job。它在Kubernetes集群上運(yùn)行的,可以管理多個(gè)Pod。
5.1 創(chuàng)建控制器
  • 創(chuàng)建 CronJob 配置文件 (cronjob.yaml) 每分鐘打印hello
#編輯yaml配置文件
vim cronjob.yaml
apiVersion: batch/v1beta1
#指定 Kubernetes API 的版本
kind: CronJob
#指定資源類型為 CronJob
metadata:
#包含 CronJob 的名稱
  name: hello
spec:
#包含 CronJob 的規(guī)格
  schedule: "*/1 * * * *"
  #使用 Cron 表達(dá)式定義任務(wù)的執(zhí)行時(shí)間表。在這個(gè)例子中,"*/1 * * * *" 表示每分鐘執(zhí)行一次。
  jobTemplate:
  #定義了 Job 模板,它包含了執(zhí)行任務(wù)的 Pod 規(guī)格
    spec:
      template:
        spec:
          containers:
          #定義了容器的名稱、鏡像和其他參數(shù)
          - name: hello
            image: busybox
            imagePullPolicy: IfNotPresent
            args:
            #執(zhí)行的命令,這里使用 /bin/sh 打印當(dāng)前日期和 "Hello" 消息
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure
          #設(shè)置為 OnFailure,表示只在容器失敗時(shí)重啟
 
 
kubectl apply -f cronjob.yaml 
#創(chuàng)建資源
 
kubectl get cronjob
#查看cronjob資源
 
kubectl get pods
#查看pod資源
 
kubectl logs hello-1717340820-s8n4j
#我們查看了 hello-1717225740-8nlx7 Pod 的日志,可以看到打印的日期和 "Hello" 消息。

--------------------------------------------------------------------------------------------
#解決日志查看權(quán)限問題
kubectl create clusterrolebinding system:anonymous --clusterrole=cluster-admin --user=system:anonymous

#如果在查看日志時(shí)遇到權(quán)限問題,可以通過創(chuàng)建一個(gè) clusterrolebinding 來授予 system:anonymous 用戶 cluster-admin 權(quán)限。這通常不推薦,因?yàn)樗鼤?huì)降低集群的安全性。在生產(chǎn)環(huán)境中,應(yīng)該使用更細(xì)粒度的權(quán)限控制。
-------------------------------------------------------------------------------------------

Pod控制器

  • Deployment:部署無狀態(tài)應(yīng)用的管理RS和Pod,創(chuàng)建Pod,主要是維護(hù)Pod副本數(shù)量與期望狀態(tài)相同,創(chuàng)建和刪除Pod時(shí)并行執(zhí)行,升級(jí)時(shí)想創(chuàng)建一部分,再刪除一部分
  • StatefulSet:部署有狀態(tài)的應(yīng)用,每個(gè)Pod的唯一(名稱)且不變的,每個(gè)Pod擁有自己專屬的持久化的存儲(chǔ)(PVC和PV)在K8S集群內(nèi)部可以通過(Pod_name).(Service_name).{namespace}.svc.cluster.local 解析出Pod的IP(基于headless service 和CoreDNS)
  • ? 創(chuàng)建和刪除Pod時(shí)有順序的(串行執(zhí)行的),升級(jí)時(shí)串行執(zhí)行的,會(huì)刪除舊的Pod,再創(chuàng)建和新Pod刪除和升級(jí)時(shí)逆序執(zhí)行的(先從標(biāo)識(shí)符最大的n-1開始,一直到最小的0)
  • Daemonset:理論上在K8S集群的所有Node節(jié)點(diǎn)上創(chuàng)建相同的Pod(無論Node節(jié)點(diǎn)什么時(shí)候加入到K8S集群),但是會(huì)受到Node節(jié)點(diǎn)上污點(diǎn)影響
  • Job:部署一次性任務(wù),正常完成后容器立即退出并且不重啟容器(RestartPolicy不設(shè)置Always),也不會(huì)重建異常完成后重試任務(wù),重建次數(shù)根據(jù)backofflimit 配置指定(默認(rèn)為6次)
    用戶 cluster-admin 權(quán)限。這通常不推薦,因?yàn)樗鼤?huì)降低集群的安全性。在生產(chǎn)環(huán)境中,應(yīng)該使用更細(xì)粒度的權(quán)限控制。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Rainbond云原生部署SpringCloud應(yīng)用架構(gòu)實(shí)踐

    Rainbond云原生部署SpringCloud應(yīng)用架構(gòu)實(shí)踐

    這篇文章主要為大家介紹了Rainbond云原生部署SpringCloud應(yīng)用架構(gòu)實(shí)踐,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04
  • K8s搭建Jenkins的詳細(xì)教程(附源代碼)

    K8s搭建Jenkins的詳細(xì)教程(附源代碼)

    Jenkins 是一個(gè)開源的自動(dòng)化服務(wù)器,主要用于持續(xù)集成和持續(xù)交付,這篇文章主要來和大家介紹一下如何在K8s中搭建Jenkins,有需要的可以了解下
    2025-03-03
  • K8S Node異常問題排查過程

    K8S Node異常問題排查過程

    文章介紹了使用kubectl命令行對(duì)K8S集群中的Node異常進(jìn)行初步定位的方法,包括查看NotReady發(fā)生時(shí)間、異常event、NodeConditions以及kubelet日志,文章還詳細(xì)描述了常見問題的解決方法,如Kubelet停止匯報(bào)心跳、PLEG不可用和Node被驅(qū)逐等情況
    2026-01-01
  • K8s實(shí)戰(zhàn)教程之容器和?Pods資源分配問題

    K8s實(shí)戰(zhàn)教程之容器和?Pods資源分配問題

    這篇文章主要介紹了K8s實(shí)戰(zhàn)教程之容器和?Pods資源分配,本篇文章通過配置集群中運(yùn)行的容器的?CPU?請(qǐng)求和限制,你可以有效利用集群上可用的?CPU?資源,通過將?Pod?CPU?請(qǐng)求保持在較低水平,可以使?Pod?更有機(jī)會(huì)被調(diào)度,需要的朋友可以參考下
    2022-07-07
  • k8s配置文件用法詳解

    k8s配置文件用法詳解

    文章主要介紹了Kubernetes中的命名空間、資源操作、Deployment、Service、Ingress、Secret、PersistentVolumeClaim、StatefulSet等核心概念和配置文件的使用方法
    2025-10-10
  • k8s kubeadm部署實(shí)踐

    k8s kubeadm部署實(shí)踐

    文章總結(jié)了部署Kubernetes集群的準(zhǔn)備工作及關(guān)鍵步驟:關(guān)閉防火墻、禁用SELinux/swap、配置免密登陸、開啟iptables轉(zhuǎn)發(fā),部署Docker和K8s,解決cgroup驅(qū)動(dòng)問題,安裝Calico網(wǎng)絡(luò)插件,最終使集群節(jié)點(diǎn)狀態(tài)變?yōu)镽eady
    2025-09-09
  • k8s中pod不停重啟問題定位原因與解決方法

    k8s中pod不停重啟問題定位原因與解決方法

    這篇文章主要給大家介紹了關(guān)于k8s中pod不停重啟問題定位原因與解決方法的相關(guān)資料,Kubernetes是一款高度可擴(kuò)展、可靠的容器編排和管理系統(tǒng),它簡化了容器的部署、管理和自動(dòng)化操作,需要的朋友可以參考下
    2023-08-08
  • 云原生技術(shù)kubernetes之volumes容器的使用

    云原生技術(shù)kubernetes之volumes容器的使用

    這篇文章主要為大家介紹了云原生技術(shù)kubernetes之volumes容器使用方式,?有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • Centos?8.2?升級(jí)內(nèi)核通過elrepo源的方法

    Centos?8.2?升級(jí)內(nèi)核通過elrepo源的方法

    這篇文章主要介紹了Centos?8.2?升級(jí)內(nèi)核通過elrepo源,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-10-10
  • k8s解析kubeconfig的兩種常用方式最新推薦

    k8s解析kubeconfig的兩種常用方式最新推薦

    這篇文章主要介紹了k8s解析kubeconfig的兩種常用方式最新推薦,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-11-11

最新評(píng)論

德昌县| 佛教| 苍山县| 莒南县| 历史| 海伦市| 博白县| 泸西县| 双江| 房产| 洱源县| 仁怀市| 曲阜市| 山东省| 广饶县| 山阴县| 永川市| 泗水县| 遂溪县| 长子县| 淮阳县| 武山县| 兰溪市| 钦州市| 武胜县| 军事| 岐山县| 浦东新区| 元氏县| 嘉峪关市| 辉县市| 商洛市| 沧源| 延寿县| 满城县| 丰原市| 腾冲县| 灵台县| 洛川县| 文水县| 县级市|