主頁 >  其他 > (六)Kubernetes Pod控制器-ReplicaSet和Deployment和DaemonSet

(六)Kubernetes Pod控制器-ReplicaSet和Deployment和DaemonSet

2020-09-11 09:13:40 其他

 Pod控制器相關知識

控制器的必要性

自主式Pod物件由調度器調度到目標作業節點后即由相應節點上的kubelet負責監控其容器的存活狀態,容器主行程崩潰后,kubelet能夠自動重啟相應的容器,但對出現非主行程崩潰類的容器錯誤卻無從感知,這便依賴于pod資源物件定義的存活探測,以便kubelet能夠探知到此類故障,但若pod被洗掉或者作業節點自身發生故障(作業節點上都有kubeletkubelet不可用,因此其健康狀態便無法保證),則便需要控制器來處理相應的容器重啟和配置,

常見的作業負載控制器

Pod控制器由masterkube-controller-manager組件提供,常見的此類控制器有:

ReplicationController

ReplicaSet:代用戶創建指定數量的pod副本數量,確保pod副本數量符合預期狀態,并且支持滾動式自動擴容和縮容功能

Deployment:作業在ReplicaSet之上,用于管理無狀態應用,目前來說最好的控制器,支持滾動更新和回滾功能,還提供宣告式配置,

DaemonSet:用于確保集群中的每一個節點只運行特定的pod副本,常用于實作系統級**后臺任務,比如ELK服務

StatefulSet:管理有狀態應用

Job:只要完成就立即退出,不需要重啟或重建

CronJob:周期性任務控制,不需要持續后臺運行

Pod控制器概述

Kubernetes的核心功能之一還在于要確保各資源物件的當前狀態(status)以匹配用戶期望的狀態(spec),使當前狀態不斷地向期望狀態“和解”(reconciliation)來完成容器應用管理,而這些則是kube-controller-manager的任務,

創建為具體的控制器物件之后,每個控制器均通過API Server提供的介面持續監控相關資源物件的當前狀態,并在因故障、更新或其他原因導致系統狀態發生變化時,嘗試讓資源的當前狀態想期望狀態遷移和逼近,

List-Watchkubernetes實作的核心機制之一,在資源物件的狀態發生變動時,由API Server負責寫入etcd并通過水平觸發(level-triggered)機制主動通知給相關的客戶端程式以確保其不會錯過任何一個事件,控制器通過API Serverwatch介面實時監控目標資源物件的變動并執行和解操作,但并不會與其他控制器進行任何互動,

Pod和Pod控制器

Pod控制器資源通過持續性地監控集群中運行著的Pod資源物件來確保受其管控的資源嚴格符合用戶期望的狀態,例如資源副本的數量要精確符合期望等,通常,一個Pod控制器資源至少應該包含三個基本的組成部分:

標簽選擇器:匹配并關聯Pod資源物件,并據此完成受其管控的Pod資源計數,

期望的副本數:期望在集群中精確運行著的Pod資源的物件數量,

Pod模板:用于新建Pod資源物件的Pod模板資源,

ReplicaSet控制器

ReplicaSet概述

ReplicaSet是取代早期版本中的ReplicationController控制器,其功能基本上與ReplicationController相同

ReplicaSet(簡稱RS)是Pod控制器型別的一種實作,用于確保由其管控的Pod物件副本數在任意時刻都能精確滿足期望的數量,ReplicaSet控制器資源啟動后會查找集群中匹配器標簽選擇器的Pod資源物件,當前活動物件的數量與期望的數量不吻合時,多則洗掉,少則通過Pod模板創建以補足,

ReplicaSet能夠實作以下功能:

  • 確保Pod資源物件的數量精確反映期望值:ReplicaSet需要確保由其控制運行的Pod副本數量精確吻合配置中定義的期望值,否則就會自動補足所缺或終止所余,

  • 確保Pod健康運行:探測到由其管控的Pod物件因其所在的作業節點故障而不可用時,自動請求由調度器于其他作業節點創建缺失的Pod副本,

  • 彈性伸縮:可通過ReplicaSet控制器動態擴容或者縮容Pod資源物件的數量,必要時還可以通過HPA控制器實作Pod資源規模的自動伸縮,

創建ReplicaSet

核心欄位

spec欄位一般嵌套使用以下幾個屬性欄位:

replicas    <integer>:指定期望的Pod物件副本數量
selector    <Object>:當前控制器匹配Pod物件副本的標簽選擇器,支持matchLabels和matchExpressions兩種匹配機制
template    <Object>:用于定義Pod時的Pod資源資訊
minReadySeconds    <integer>:用于定義Pod啟動后多長時間為可用狀態,默認為0秒

ReplicaSet示例

#(1)命令列查看ReplicaSet清單定義規則
[root@k8s-master ~]# kubectl explain rs
[root@k8s-master ~]# kubectl explain rs.spec
[root@k8s-master ~]# kubectl explain rs.spec.template


#(2)創建ReplicaSet示例
[root@k8s-master ~]# vim manfests/rs-demo.yaml
apiVersion: apps/v1  #api版本定義
kind: ReplicaSet  #定義資源型別為ReplicaSet
metadata:  #元資料定義
  name: myapp
  namespace: default
spec:  #ReplicaSet的規格定義
  replicas: 2  #定義副本數量為2個
  selector:  #標簽選擇器,定義匹配Pod的標簽
    matchLabels:
      app: myapp
      release: canary
  template:  #Pod的模板定義
    metadata:  #Pod的元資料定義
      name: myapp-pod  #自定義Pod的名稱
      labels:  #定義Pod的標簽,需要和上面的標簽選擇器內匹配規則中定義的標簽一致,可以多出其他標簽
        app: myapp
        release: canary
    spec:  #Pod的規格定義
      containers:  #容器定義
      - name: myapp-containers  #容器名稱
        image: ikubernetes/myapp:v1  #容器鏡像
        imagePullPolicy: IfNotPresent  #拉取鏡像的規則
        ports:  #暴露埠
        - name: http  #埠名稱
          containerPort: 80
 

#(3)創建ReplicaSet定義的Pod
[root@k8s-master ~]# kubectl apply -f manfests/rs-demo.yaml
replicaset.apps/myapp created
[root@k8s-master ~]# kubectl get rs    #查看創建的ReplicaSet控制器
NAME    DESIRED   CURRENT   READY   AGE
myapp   4         4         4       3m23s
[root@k8s-master ~]# kubectl get pods   #通過查看pod可以看出pod命令是規則是前面是replicaset控制器的名稱加隨機生成的字串
NAME          READY   STATUS    RESTARTS   AGE
myapp-bln4v   1/1     Running   0          6s
myapp-bxpzt   1/1     Running   0          6s


#(4)修改Pod的副本數量
[root@k8s-master ~]# kubectl edit rs myapp
  replicas: 4
[root@k8s-master ~]# kubectl get rs -o wide 
NAME    DESIRED   CURRENT   READY   AGE    CONTAINERS         IMAGES                 SELECTOR
myapp   4         4         4       2m50s   myapp-containers   ikubernetes/myapp:v2   app=myapp,release=canary
[root@k8s-master ~]# kubectl get pods --show-labels
NAME          READY   STATUS    RESTARTS   AGE     LABELS
myapp-8hkcr   1/1     Running   0          2m2s    app=myapp,release=canary
myapp-bln4v   1/1     Running   0          3m40s   app=myapp,release=canary
myapp-bxpzt   1/1     Running   0          3m40s   app=myapp,release=canary
myapp-ql2wk   1/1     Running   0          2m2s    app=myapp,release=canary

更新ReplicaSet控制器

修改Pod模板:升級應用

修改上面創建的replicaset示例檔案,將鏡像ikubernetes/myapp:v1改為v2版本

[root@k8s-master ~]# vim manfests/rs-demo.yaml
    spec:  #Pod的規格定義
      containers:  #容器定義
      - name: myapp-containers  #容器名稱
        image: ikubernetes/myapp:v2  #容器鏡像
        imagePullPolicy: IfNotPresent  #拉取鏡像的規則
        ports:  #暴露埠
        - name: http  #埠名稱
          containerPort: 80
[root@k8s-master ~]# kubectl apply -f manfests/rs-demo.yaml  #執行apply讓其多載
[root@k8s-master ~]# kubectl get pods -o custom-columns=Name:metadata.name,Image:spec.containers[0].image
Name          Image
myapp-bln4v   ikubernetes/myapp:v1
myapp-bxpzt   ikubernetes/myapp:v1

#說明:這里雖然多載了,但是已有的pod所使用的鏡像仍然是v1版本的,只是新建pod時才會使用v2版本,這里測驗先手動洗掉已有的pod,
[root@k8s-master ~]# kubectl delete pods -l app=myapp  #洗掉標簽app=myapp的pod資源
pod "myapp-bln4v" deleted
pod "myapp-bxpzt" deleted
[root@k8s-master ~]# kubectl get pods -o custom-columns=Name:metadata.name,Image:spec.containers[0].image   #再次查看通過ReplicaSet新建的pod資源物件,鏡像已使用v2版本
Name          Image
myapp-mdn8j   ikubernetes/myapp:v2
myapp-v5bgr   ikubernetes/myapp:v2

擴容和縮容

可以直接通過vim 編輯清單檔案修改replicas欄位,也可以通過kubect edit 命令去編輯,kubectl還提供了一個專用的子命令scale用于實作應用規模的伸縮,支持從資源清單檔案中獲取新的目標副本數量,也可以直接在命令列通過“--replicas”選項進行讀取,

[root@k8s-master ~]# kubectl get rs    #查看ReplicaSet
NAME    DESIRED   CURRENT   READY   AGE
myapp   2         2         2       154m
[root@k8s-master ~]# kubectl get pods    #查看Pod
NAME          READY   STATUS    RESTARTS   AGE
myapp-mdn8j   1/1     Running   0          5m26s
myapp-v5bgr   1/1     Running   0          5m26s

#擴容
[root@k8s-master ~]# kubectl scale replicasets myapp --replicas=5    #將上面的Deployments控制器myapp的Pod副本數量提升為5個
replicaset.extensions/myapp scaled
[root@k8s-master ~]# kubectl get rs    #查看ReplicaSet
NAME    DESIRED   CURRENT   READY   AGE
myapp   5         5         5       156m
[root@k8s-master ~]# kubectl get pods    #查看Pod
NAME          READY   STATUS    RESTARTS   AGE
myapp-lrrp8   1/1     Running   0          8s
myapp-mbqf8   1/1     Running   0          8s
myapp-mdn8j   1/1     Running   0          6m48s
myapp-ttmf5   1/1     Running   0          8s
myapp-v5bgr   1/1     Running   0          6m48s

#收縮
[root@k8s-master ~]# kubectl scale replicasets myapp --replicas=3
replicaset.extensions/myapp scaled
[root@k8s-master ~]# kubectl get rs
NAME    DESIRED   CURRENT   READY   AGE
myapp   3         3         3       159m
[root@k8s-master ~]# kubectl get pods 
NAME          READY   STATUS    RESTARTS   AGE
myapp-mdn8j   1/1     Running   0          10m
myapp-ttmf5   1/1     Running   0          3m48s
myapp-v5bgr   1/1     Running   0          10m

洗掉ReplicaSet控制器資源

使用Kubectl delete命令洗掉ReplicaSet物件時默認會一并洗掉其管控的各Pod物件,有時,考慮到這些Pod資源未必由其創建,或者即便由其創建也并非自身的組成部分,這時候可以添加“--cascade=false”選項,取消級聯關系,

[root@k8s-master ~]# kubectl get rs
NAME    DESIRED   CURRENT   READY   AGE
myapp   3         3         3       162m
[root@k8s-master ~]# kubectl get pods 
NAME          READY   STATUS    RESTARTS   AGE
myapp-mdn8j   1/1     Running   0          12m
myapp-ttmf5   1/1     Running   0          6m18s
myapp-v5bgr   1/1     Running   0          12m
[root@k8s-master ~]# kubectl delete replicasets myapp --cascade=false
replicaset.extensions "myapp" deleted
[root@k8s-master ~]# kubectl get rs
No resources found.
[root@k8s-master ~]# kubectl get pods 
NAME          READY   STATUS    RESTARTS   AGE
myapp-mdn8j   1/1     Running   0          13m
myapp-ttmf5   1/1     Running   0          7m
myapp-v5bgr   1/1     Running   0          13m

#通過上面的示例可以看出,添加--cascade=false引數后再洗掉ReplicaSet資源物件時并沒有將其管控的Pod資源物件一并洗掉,

Deployment控制器

Deployment概述

Deployment(簡寫為deploy)是kubernetes控制器的又一種實作,它構建于ReplicaSet控制器之上,可為PodReplicaSet資源提供宣告式更新,

Deployment控制器資源的主要職責是為了保證Pod資源的健康運行,其大部分功能均可通過呼叫ReplicaSet實作,同時還增添部分特性,

  • 事件和狀態查看:必要時可以查看Deployment物件升級的詳細進度和狀態,

  • 回滾:升級操作完成后發現問題時,支持使用回滾機制將應用回傳到前一個或由用戶指定的歷史記錄中的版本上,

  • 版本記錄:對Deployment物件的每一個操作都予以保存,以供后續可能執行的回滾操作使用,

  • 暫停和啟動:對于每一次升級,都能夠隨時暫停和啟動,

  • 多種自動更新方案:一是Recreate,即重建更新機制,全面停止、洗掉舊有的Pod后用新版本替代;另一個是RollingUpdate,即滾動升級機制,逐步替換舊有的Pod至新的版本,

創建Deployment

Deployment其核心資源和ReplicaSet相似

#(1)命令列查看ReplicaSet清單定義規則
[root@k8s-master ~]# kubectl explain deployment
[root@k8s-master ~]# kubectl explain deployment.spec
[root@k8s-master ~]# kubectl explain deployment.spec.template


#(2)創建Deployment示例
[root@k8s-master ~]# vim manfests/deploy-demo.yaml
apiVersion: apps/v1  #api版本定義
kind: Deployment  #定義資源型別為Deploymant
metadata:  #元資料定義
  name: deploy-demo  #deployment控制器名稱
  namespace: default  #名稱空間
spec:  #deployment控制器的規格定義
  replicas: 2  #定義副本數量為2個
  selector:  #標簽選擇器,定義匹配Pod的標簽
    matchLabels:
      app: deploy-app
      release: canary
  template:  #Pod的模板定義
    metadata:  #Pod的元資料定義
      labels:  #定義Pod的標簽,需要和上面的標簽選擇器內匹配規則中定義的標簽一致,可以多出其他標簽
        app: deploy-app
        release: canary
    spec:  #Pod的規格定義
      containers:  #容器定義
      - name: myapp  #容器名稱
        image: ikubernetes/myapp:v1  #容器鏡像
        ports:  #暴露埠
        - name: http  #埠名稱
          containerPort: 80



#(3)創建Deployment物件
[root@k8s-master ~]# kubectl apply -f manfests/deploy-demo.yaml 
deployment.apps/deploy-demo created



#(4)查看資源物件
[root@k8s-master ~]# kubectl get deployment    #查看Deployment資源物件
NAME          READY   UP-TO-DATE   AVAILABLE   AGE
deploy-demo   2/2     2            2           10s
[root@k8s-master ~]# kubectl get replicaset    #查看ReplicaSet資源物件
NAME                     DESIRED   CURRENT   READY   AGE
deploy-demo-78c84d4449   2         2         2       20s
[root@k8s-master ~]# kubectl get pods    #查看Pod資源物件
NAME                           READY   STATUS    RESTARTS   AGE
deploy-demo-78c84d4449-22btc   1/1     Running   0          23s
deploy-demo-78c84d4449-5fn2k   1/1     Running   0          23s
---
說明:
通過查看資源物件可以看出,Deployment會自動創建相關的ReplicaSet控制器資源,并以"[DEPLOYMENT-name]-[POD-TEMPLATE-HASH-VALUE]"格式為其命名,其中的hash值由Deployment自動生成,而Pod名則是以ReplicaSet控制器的名稱為前綴,后跟5位隨機字符,

更新策略

ReplicaSet控制器的應用更新需要手動分成多步并以特定的次序進行,程序繁雜且容易出錯,而Deployment卻只需要由用戶指定在Pod模板中要改動的內容,(如鏡像檔案的版本),余下的步驟便會由其自動完成,Pod副本數量也是一樣,

Deployment控制器支持兩種更新策略:滾動更新(rollingUpdate)和重建創新(Recreate),默認為滾動更新

  • 滾動更新(rollingUpdate):即在洗掉一部分舊版本Pod資源的同時,補充創建一部分新版本的Pod物件進行應用升級,其優勢是升級期間,容器中應用提供的服務不會中斷,但更新期間,不同客戶端得到的相應內容可能會來自不同版本的應用,

  • 重新創建(Recreate):即首先洗掉現有的Pod物件,而后由控制器基于新模板重行創建出新版本的資源物件,

Deployment控制器的滾動更新操作并非在同一個ReplicaSet控制器物件下洗掉并創建Pod資源,新控制器的Pod物件數量不斷增加,直到舊控制器不再擁有Pod物件,而新控制器的副本數量變得完全符合期望值為止,如圖所示

滾動更新時,應用還要確保可用的Pod物件數量不低于某閥值以確保可以持續處理客戶端的服務請求,變動的方式和Pod物件的數量范圍將通過kubectl explain deployment.spec.strategy.rollingUpdate.maxSurgekubectl explain deployment.spec.strategy.rollingUpdate.maxUnavailable兩個屬性同時進行定義,其功能如下:

  • maxSurge:指定升級期間存在的總Pod物件數量最多可超出期望值的個數,其值可以是0或正整數,也可以是一個期望值的百分比;例如,如果期望值為3,當前的屬性值為1,則表示Pod物件的總數不能超過4個,

  • maxUnavailable:升級期間正常可用的Pod副本數(包括新舊版本)最多不能低于期望值的個數,其值可以是0或正整數,也可以是期望值的百分比;默認值為1,該值意味著如果期望值是3,則升級期間至少要有兩個Pod物件處于正常提供服務的狀態,

maxSurgemaxUnavailable屬性的值不可同時為0,否則Pod物件的副本數量在符合用戶期望的數量后無法做出合理變動以進行滾動更新操作,

Deployment控制器可以保留其更新歷史中的舊ReplicaSet物件版本,所保存的歷史版本數量由kubectl explain deployment.spec.revisionHistoryLimit引數指定,只有保存于revision歷史中的ReplicaSet版本可用于回滾,

注:為了保存版本升級的歷史,需要在創建Deployment物件時于命令中使用“--record”選項,

Deployment更新升級

修改Pod模板相關的配置引數便能完成Deployment控制器資源的更新,由于是宣告式配置,因此對Deployment控制器資源的修改尤其適合使用applypatch命令來進行;如果僅只是修改容器鏡像,“set image”命令更為易用,

1)首先通過set image命令將上面創建的Deployment物件的鏡像版本改為v2版本

#打開1個終端進行升級
[root@k8s-master ~]# kubectl set image deployment/deploy-demo myapp=ikubernetes/myapp:v2 
deployment.extensions/deploy-demo image updated

#同時打開終端2進行查看pod資源物件升級程序
[root@k8s-master ~]# kubectl get pods -l app=deploy-app -w
NAME                           READY   STATUS    RESTARTS   AGE
deploy-demo-78c84d4449-2rvxr   1/1     Running   0          33s
deploy-demo-78c84d4449-nd7rr   1/1     Running   0          33s
deploy-demo-7c66dbf45b-7k4xz   0/1     Pending   0          0s
deploy-demo-7c66dbf45b-7k4xz   0/1     Pending   0          0s
deploy-demo-7c66dbf45b-7k4xz   0/1     ContainerCreating   0          0s
deploy-demo-7c66dbf45b-7k4xz   1/1     Running             0          2s
deploy-demo-78c84d4449-2rvxr   1/1     Terminating         0          49s
deploy-demo-7c66dbf45b-r88qr   0/1     Pending             0          0s
deploy-demo-7c66dbf45b-r88qr   0/1     Pending             0          0s
deploy-demo-7c66dbf45b-r88qr   0/1     ContainerCreating   0          0s
deploy-demo-7c66dbf45b-r88qr   1/1     Running             0          1s
deploy-demo-78c84d4449-2rvxr   0/1     Terminating         0          50s
deploy-demo-78c84d4449-nd7rr   1/1     Terminating         0          51s
deploy-demo-78c84d4449-nd7rr   0/1     Terminating         0          51s
deploy-demo-78c84d4449-nd7rr   0/1     Terminating         0          57s
deploy-demo-78c84d4449-nd7rr   0/1     Terminating         0          57s
deploy-demo-78c84d4449-2rvxr   0/1     Terminating         0          60s
deploy-demo-78c84d4449-2rvxr   0/1     Terminating         0          60s


#同時打開終端3進行查看pod資源物件變更程序
[root@k8s-master ~]# kubectl get deployment deploy-demo -w 
NAME          READY   UP-TO-DATE   AVAILABLE   AGE
deploy-demo   2/2     2            2           37s
deploy-demo   2/2     2            2           47s
deploy-demo   2/2     2            2           47s
deploy-demo   2/2     0            2           47s
deploy-demo   2/2     1            2           47s
deploy-demo   3/2     1            3           49s
deploy-demo   2/2     1            2           49s
deploy-demo   2/2     2            2           49s
deploy-demo   3/2     2            3           50s
deploy-demo   2/2     2            2           51s


# 升級完成再次查看rs的情況,以下可以看到原的rs作為備份,而現在啟動的是新的rs
[root@k8s-master ~]# kubectl get rs 
NAME                     DESIRED   CURRENT   READY   AGE
deploy-demo-78c84d4449   0         0         0       4m41s
deploy-demo-7c66dbf45b   2         2         2       3m54s

2)Deployment擴容

#1、使用kubectl scale命令擴容
[root@k8s-master ~]# kubectl scale deployment deploy-demo --replicas=3
deployment.extensions/deploy-demo scaled
[root@k8s-master ~]# kubectl get pods 
NAME                           READY   STATUS    RESTARTS   AGE
deploy-demo-7c66dbf45b-7k4xz   1/1     Running   0          10m
deploy-demo-7c66dbf45b-gq2tw   1/1     Running   0          3s
deploy-demo-7c66dbf45b-r88qr   1/1     Running   0          10m

#2、使用直接修改配置清單方式進行擴容
[root@k8s-master ~]# vim manfests/deploy-demo.yaml 
spec:  #deployment控制器的規格定義
  replicas: 4  #定義副本數量為2個
[root@k8s-master ~]# kubectl apply -f manfests/deploy-demo.yaml 
deployment.apps/deploy-demo configured
[root@k8s-master ~]# kubectl get pods 
NAME                           READY   STATUS    RESTARTS   AGE
deploy-demo-78c84d4449-6rmnm   1/1     Running   0          61s
deploy-demo-78c84d4449-9xfp9   1/1     Running   0          58s
deploy-demo-78c84d4449-c2m6h   1/1     Running   0          61s
deploy-demo-78c84d4449-sfxps   1/1     Running   0          57s

#3、使用kubectl patch打補丁的方式進行擴容
[root@k8s-master ~]# kubectl patch deployment deploy-demo -p '{"spec":{"replicas":5}}'
deployment.extensions/deploy-demo patched
[root@k8s-master ~]# 
[root@k8s-master ~]# kubectl get pods 
NAME                           READY   STATUS    RESTARTS   AGE
deploy-demo-78c84d4449-6rmnm   1/1     Running   0          3m44s
deploy-demo-78c84d4449-9xfp9   1/1     Running   0          3m41s
deploy-demo-78c84d4449-c2m6h   1/1     Running   0          3m44s
deploy-demo-78c84d4449-sfxps   1/1     Running   0          3m40s
deploy-demo-78c84d4449-t7jxb   1/1     Running   0          3s

金絲雀發布

采用先添加再洗掉的方式,且可用Pod資源物件總數不低于期望值的方式進行,配置如下:

1)添加其總數多余期望值一個

[root@k8s-master ~]# kubectl patch deployment deploy-demo -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge":1,"maxUnavailable":0}}}}'
deployment.extensions/deploy-demo patched

2)啟動更新程序,在修改相應容器的鏡像版本后立即暫停更新進度,

[root@k8s-master ~]# kubectl set image deployment/deploy-demo myapp=ikubernetes/myapp:v3 && kubectl rollout pause deployment deploy-demo 
deployment.extensions/deploy-demo image updated
deployment.extensions/deploy-demo paused


#查看
[root@k8s-master ~]# kubectl get deployment    #查看deployment資源物件
NAME          READY   UP-TO-DATE   AVAILABLE   AGE
deploy-demo   6/5     1            6           37m
[root@k8s-master ~]# kubectl get pods -o custom-columns=Name:metadata.name,Image:spec.containers[0].image    #查看pod資源物件的name和image
Name                           Image
deploy-demo-6bf8dbdc9f-fjnzn   ikubernetes/myapp:v3
deploy-demo-78c84d4449-6rmnm   ikubernetes/myapp:v1
deploy-demo-78c84d4449-9xfp9   ikubernetes/myapp:v1
deploy-demo-78c84d4449-c2m6h   ikubernetes/myapp:v1
deploy-demo-78c84d4449-sfxps   ikubernetes/myapp:v1
deploy-demo-78c84d4449-t7jxb   ikubernetes/myapp:v1
[root@k8s-master ~]# kubectl rollout status deployment/deploy-demo    #查看更新情況
Waiting for deployment "deploy-demo" rollout to finish: 1 out of 5 new replicas have been updated...
---
#通過上面查看可以看出,當前的pod數量為6個,因為此前我們定義的期望值為5個,這里多出了一個,且這個鏡像版本為v3版本,



#全部更新
[root@k8s-master ~]# kubectl rollout resume deployment deploy-demo
deployment.extensions/deploy-demo resumed
#再次查看
[root@k8s-master ~]# kubectl get deployment     #查看deployment資源物件
NAME          READY   UP-TO-DATE   AVAILABLE   AGE
deploy-demo   5/5     5            5           43m
[root@k8s-master ~]# kubectl get pods -o custom-columns=Name:metadata.name,Image:spec.containers[0].image    #查看pod資源物件的name和image
Name                           Image
deploy-demo-6bf8dbdc9f-2z6gt   ikubernetes/myapp:v3
deploy-demo-6bf8dbdc9f-f79q2   ikubernetes/myapp:v3
deploy-demo-6bf8dbdc9f-fjnzn   ikubernetes/myapp:v3
deploy-demo-6bf8dbdc9f-pjf4z   ikubernetes/myapp:v3
deploy-demo-6bf8dbdc9f-x7fnk   ikubernetes/myapp:v3
[root@k8s-master ~]# kubectl rollout status deployment/deploy-demo     #查看更新情況
Waiting for deployment "deploy-demo" rollout to finish: 1 out of 5 new replicas have been updated...
Waiting for deployment "deploy-demo" rollout to finish: 1 out of 5 new replicas have been updated...
Waiting for deployment spec update to be observed...
Waiting for deployment spec update to be observed...
Waiting for deployment "deploy-demo" rollout to finish: 1 out of 5 new replicas have been updated...
Waiting for deployment "deploy-demo" rollout to finish: 1 out of 5 new replicas have been updated...
Waiting for deployment "deploy-demo" rollout to finish: 2 out of 5 new replicas have been updated...
Waiting for deployment "deploy-demo" rollout to finish: 2 out of 5 new replicas have been updated...
Waiting for deployment "deploy-demo" rollout to finish: 2 out of 5 new replicas have been updated...
Waiting for deployment "deploy-demo" rollout to finish: 3 out of 5 new replicas have been updated...
Waiting for deployment "deploy-demo" rollout to finish: 3 out of 5 new replicas have been updated...
Waiting for deployment "deploy-demo" rollout to finish: 3 out of 5 new replicas have been updated...
Waiting for deployment "deploy-demo" rollout to finish: 4 out of 5 new replicas have been updated...
Waiting for deployment "deploy-demo" rollout to finish: 4 out of 5 new replicas have been updated...
Waiting for deployment "deploy-demo" rollout to finish: 4 out of 5 new replicas have been updated...
Waiting for deployment "deploy-demo" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "deploy-demo" rollout to finish: 1 old replicas are pending termination...
deployment "deploy-demo" successfully rolled out

回滾Deployment控制器下的應用發布

若因各種原因導致滾動更新無法正常進行,如鏡像檔案獲取失敗,等等;則應該將應用回滾到之前的版本,或者回滾到指定的歷史記錄中的版本,則通過kubectl rollout undo命令完成,如果回滾到指定版本則需要添加--to-revision選項

1)回到上一個版本

[root@k8s-master ~]# kubectl rollout undo deployment/deploy-demo
deployment.extensions/deploy-demo rolled back
[root@k8s-master ~]# kubectl get pods -o custom-columns=Name:metadata.name,Image:spec.containers[0].image
Name                           Image
deploy-demo-78c84d4449-2xspz   ikubernetes/myapp:v1
deploy-demo-78c84d4449-f8p46   ikubernetes/myapp:v1
deploy-demo-78c84d4449-mnmvc   ikubernetes/myapp:v1
deploy-demo-78c84d4449-tsl7r   ikubernetes/myapp:v1
deploy-demo-78c84d4449-xdt8j   ikubernetes/myapp:v1

2)回滾到指定版本

#通過該命令查看更新歷史記錄
[root@k8s-master ~]# kubectl rollout history deployment/deploy-demo
deployment.extensions/deploy-demo 
REVISION  CHANGE-CAUSE
2         <none>
4         <none>
5         <none>

#回滾到版本2
[root@k8s-master ~]# kubectl rollout undo deployment/deploy-demo --to-revision=2
deployment.extensions/deploy-demo rolled back
[root@k8s-master ~]# kubectl get pods -o custom-columns=Name:metadata.name,Image:spec.containers[0].image
Name                           Image
deploy-demo-7c66dbf45b-42nj4   ikubernetes/myapp:v2
deploy-demo-7c66dbf45b-8zhf5   ikubernetes/myapp:v2
deploy-demo-7c66dbf45b-bxw7x   ikubernetes/myapp:v2
deploy-demo-7c66dbf45b-gmq8x   ikubernetes/myapp:v2
deploy-demo-7c66dbf45b-mrfdb   ikubernetes/myapp:v2

DaemonSet控制器

DaemonSet概述

DaemonSet用于在集群中的全部節點上同時運行一份指定Pod資源副本,后續新加入集群的作業節點也會自動創建一個相關的Pod物件,當從集群移除借點時,此類Pod物件也將被自動回收而無需重建,管理員也可以使用節點選擇器及節點標簽指定僅在具有特定特征的節點上運行指定的Pod物件,

應用場景

  • 運行集群存盤的守護行程,如在各個節點上運行glusterdceph

  • 在各個節點上運行日志收集守護行程,如fluentdlogstash

  • 在各個節點上運行監控系統的代理守護行程,如Prometheus Node ExportercollectdDatadog agentNew Relic agentGanglia gmond等,

創建DaemonSet

DaemonSet控制器的spec欄位中嵌套使用的相同欄位selectortemplateminReadySeconds,并且功能和用法基本相同,但它不支持replicas,因為畢竟不能通過期望值來確定Pod資源的數量,而是基于節點數量,

這里使用nginx來示例,生產環境就比如使用上面提到的logstash等,

#(1) 定義清單檔案
[root@k8s-master ~]# vim manfests/daemonset-demo.yaml
apiVersion: apps/v1    #api版本定義
kind: DaemonSet    #定義資源型別為DaemonSet
metadata:    #元資料定義
  name: daemset-nginx    #daemonset控制器名稱
  namespace: default    #名稱空間
  labels:    #設定daemonset的標簽
    app: daem-nginx    
spec:    #DaemonSet控制器的規格定義
  selector:    #指定匹配pod的標簽
    matchLabels:    #指定匹配pod的標簽
      app: daem-nginx    #注意:這里需要和template中定義的標簽一樣
  template:    #Pod的模板定義
    metadata:    #Pod的元資料定義
      name: nginx  
      labels:    #定義Pod的標簽,需要和上面的標簽選擇器內匹配規則中定義的標簽一致,可以多出其他標簽
        app: daem-nginx
    spec:    #Pod的規格定義
      containers:    #容器定義
      - name: nginx-pod    #容器名字
        image: nginx:1.12    #容器鏡像
        ports:    #暴露埠
        - name: http    #埠名稱
          containerPort: 80    #暴露的埠



#(2)創建上面定義的daemonset控制器
[root@k8s-master ~]# kubectl apply -f manfests/daemonset-demo.yaml 
daemonset.apps/daemset-nginx created



#(3)查看驗證
[root@k8s-master ~]# kubectl get pods -o wide 
NAME                  READY   STATUS    RESTARTS   AGE   IP            NODE        NOMINATED NODE   READINESS GATES
daemset-nginx-7s474   1/1     Running   0          80s   10.244.1.61   k8s-node1   <none>           <none>
daemset-nginx-kxpl2   1/1     Running   0          94s   10.244.2.58   k8s-node2   <none>           <none>
[root@k8s-master ~]# kubectl describe daemonset/daemset-nginx
......
Name:           daemset-nginx
Selector:       app=daem-nginx
Node-Selector:  <none>
......
Desired Number of Nodes Scheduled: 2
Current Number of Nodes Scheduled: 2
Number of Nodes Scheduled with Up-to-date Pods: 2
Number of Nodes Scheduled with Available Pods: 2
Number of Nodes Misscheduled: 0
Pods Status:  2 Running / 0 Waiting / 0 Succeeded / 0 Failed
......

通過上面驗證查看,Node-Selector欄位的值為空,表示它需要運行在集群中的每個節點之上,而當前的節點數是2個,所以其期望的Pod副本數(Desired Number of Nodes Scheduled)為2,而當前也已經創建了2個相關的Pod物件,

注意

對于特殊的硬體的節點來說,可能有的運行程式只需要在某一些節點上運行,那么通過Pod模板的spec欄位中嵌套使用nodeSelector欄位,并確保其值定義的標簽選擇器與部分特定作業節點的標簽匹配即可,

更新DaemonSet物件

DaemonSet自Kubernetes1.6版本起也開始支持更新機制,相關配置嵌套在kubectl explain daemonset.spec.updateStrategy欄位中,其支持RollingUpdate(滾動更新)和OnDelete(洗掉時更新)兩種策略,滾動更新為默認的更新策略,
#(1)查看鏡像版本
[root@k8s-master ~]# kubectl get pods -l app=daem-nginx -o custom-columns=NAME:metadata.name,NODE:spec.nodeName,Image:spec.containers[0].image
NAME                  NODE        Image
daemset-nginx-7s474   k8s-node1   nginx:1.12
daemset-nginx-kxpl2   k8s-node2   nginx:1.12


#(2)更新
[root@k8s-master ~]# kubectl set image daemonset/daemset-nginx nginx-pod=nginx:1.14
[root@k8s-master ~]# kubectl get pods -l app=daem-nginx -o custom-columns=NAME:metadata.name,NODE:spec.nodeName,Image:spec.containers[0].image    #再次查看
NAME                  NODE        Image
daemset-nginx-74c95   k8s-node2   nginx:1.14
daemset-nginx-nz6n9   k8s-node1   nginx:1.14

#(3)查坎詳細資訊
[root@k8s-master ~]# kubectl describe daemonset daemset-nginx
......
Events:
  Type    Reason            Age   From                  Message
  ----    ------            ----  ----                  -------
  Normal  SuccessfulCreate  49m   daemonset-controller  Created pod: daemset-nginx-6kzg6
  Normal  SuccessfulCreate  49m   daemonset-controller  Created pod: daemset-nginx-jjnc2
  Normal  SuccessfulDelete  40m   daemonset-controller  Deleted pod: daemset-nginx-jjnc2
  Normal  SuccessfulCreate  40m   daemonset-controller  Created pod: daemset-nginx-kxpl2
  Normal  SuccessfulDelete  40m   daemonset-controller  Deleted pod: daemset-nginx-6kzg6
  Normal  SuccessfulCreate  40m   daemonset-controller  Created pod: daemset-nginx-7s474
  Normal  SuccessfulDelete  15s   daemonset-controller  Deleted pod: daemset-nginx-7s474
  Normal  SuccessfulCreate  8s    daemonset-controller  Created pod: daemset-nginx-nz6n9
  Normal  SuccessfulDelete  5s    daemonset-controller  Deleted pod: daemset-nginx-kxpl2

通過上面查看可以看出,默認的滾動更新策略是一次洗掉一個作業節點上的Pod資源,待其最新版本Pod重建完成后再開始操作另一個作業節點上的Pod資源,

DaemonSet控制器的滾動更新機制也可以借助于minReadySeconds欄位控制滾動節奏;必要時也可以執行暫停和繼續操作,其也可以進行回滾操作,

 

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/5137.html

標籤:其他

上一篇:《Docker Deep Dive》Note - Docker 引擎

下一篇:(九)Kubernetes 存盤卷

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more