kubernetes 的pod控制器


pod是kubernetes的最小單元,自主式創建的pod刪除就沒有了,但是通過資源控制器創建的pod如果刪除還會重建。pod控制器就是用於實現代替我們去管理pod的中間層,並幫我們確保每一個pod資源處於我們所定義或者所期望的目標狀態,pod資源出現故障首先要重啟容器,如果一直重啟有問題的話會基於某種策略重新編排。自動適應期望pod數量

pod控制器類型簡介:

  1.ReplicaSet:

    代用戶創建指定數量的pod副本數量,確保pod副本數量符合用戶期望的數量狀態,如果少了多退少補,並且支持滾動式自動擴容和縮容機制。

    ReplicaSet主要三個組件組成:  

      (1)用戶期望的pod副本數量   

      (2)標簽選擇器,判斷哪個pod歸自己管理   

      (3)pod資源模板(當現存的pod數量不足,會根據pod資源模板進行新建幫助用戶管理無狀態的pod資源,精確反應用戶定義的目標數量。不直接使用)


  Deployment:
(無狀態,守護進程類,只關注群體不關注個體)

    工作在ReplicaSet之上,用於管理無狀態應用,目前來說最好的控制器。支持滾動更新和回滾功能,還提供聲明式配置。(pod數量和node沒有精確的配比,沒有一對一的關系)


  DaemonSet:(無狀態,守護進程類,只關注群體不關注個體)

    確保集群中的每一個節點上只運行一個特定的pod副本,系統級的后台任務。新增節點他都會自動添加pod。也可以是滿足條件的節點上運行特定的副本。比如ELK服務特性:服務是無狀態的服務必須是守護進程(pod資源模板,標簽選擇器)

  Job:(有狀態,一次性任務)

    只要完成就立即退出,不需要重啟或重建,沒有完成重構job。只能執行一次性任務  

  Cronjob:(有狀態,周期性任務)

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

  StatefulSet:(管理有狀態應用)

    管理有狀態應用(redis cluster)針對管理的應用器配置管理是不一樣的,沒有什么共通的規律,需要人為的封裝在腳本中實行,相當之大的邏輯處理。(運維技能封裝到運維腳本中)

  TPR:(third party resource)1.7以后就不支持了

    第三方資源

  CDR:(custom defined resource) 1.8+以后

    用戶自定義資源

控制器ReplicaSet應用:

    獲取replica的字段命令===>kubectl explain rs

實例yaml:

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: web-server
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels: app: web-nginx release: canary
  template:
    metadata:
      name: web-nginx-pod
      labels:
        app: web-nginx release: canary environment: qa
    spec:
      containers:
      - name: web-nginx-container
        image: ikubernetes/myapp:v1
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 80
~template中創建的container必須包含控制器中標簽選擇器中要選擇的標簽,如果不包含控制器就發現不了他已經存在pod,會一直創建下去                                    

 

動態修改replicaset的副本數量   1. kubectl edit rs web-server     或者 kubectl edit -f replicaSet_demo.yaml 

               2.kubectl scale --replicas=5 rs/web-server 或者 kubectl scale -f replicaSet_demo.yaml 

通過kubectl edit可以修改pod資源的鏡像,但是只有是重建的pod才會使用修改過得鏡像

 

 

控制器deployment應用:

deployment是建構在rs之上的,可以控制多個rs滾動式自定義,自控制的更新。

同時在實現自動更新時還能實現控制更新節奏和更新邏輯     

                 

 

    獲取deployment的字段命令===>kubectl explain deploy

實例deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deploy
  namespace: default
spec:
  replicas: 5
  selector:
    matchLabels:
      app: myapp
      release: canary
  strategy:
    rollingUpdate: maxSurge: 1 maxUnavailable: 0
  template:
    metadata:
      labels:
        app: myapp
        release: canary
    spec:
      containers:
      - name: myapp-container
        image: ikubernetes/myapp:v2
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 80
紅色部分是更新策略,可以多出一個,不能少於replica定義的5個

deployment啟動可以用kubectl apply -f deploy_demo.yaml

可以用打補丁的方式進行修改:kubectl patch deployment myapp-deploy -p '{"spec":{"replicas":5}}'   相對來說要對文件的嵌套關系了解清楚

kubectl rollout pause deployment myapp-deploy   暫停一個deployment

kubectl rollout resume deployment myapp-deploy  重新啟動一個暫停的deployment

kubectl rollout history deployment myapp-deploy   查看歷史版本

kubectl rollout undo deployment myapp-deploy --to-revision=1   回滾到以前版本

控制器daemonset應用:

    獲取daemonset的字段:kubectl explain ds

實例daemonset

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis
      role: logstor
  template:
    metadata:
      labels:
        app: redis
        role: logstor
    spec:
      containers:
      - name: redis
        image: redis:4.0-alpine
        ports:
        - name: redis
          containerPort: 6379
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: filebeta-ds
  namespace: default
spec:
  selector:
    matchLabels:
      app: filebeat
      release: stable
  template:
    metadata:
      labels:
        app: filebeat
        release: stable
    spec:
      containers:
      - name:  filebeat
        image: ikubernetes/filebeat:5.6.5-alpine
        imagePullPolicy: IfNotPresent
        env:
        - name: REDIS_HOST
          value: redis.default.svc.cluster.local
        - name: REDIS_LOG_LEVEL
          value: info

通過kubectl get pod -o wide 可以看出一個節點上只有一個filebeat的pod

 

 

daemonset也支持滾動式更新,有兩個選項1.OnDelete  在刪除時更新

                   2.RollingUpdate 只有做多不可用,最多有幾個不工作,根據節點數量

通過修改containers的image鏡像來測試滾動更新  ,先刪除一個pod,再新建一個,滾動式更新。一次滾動幾個根據maxUnavailable的值是多大(kubectl explain ds.spec.updateStrategy.rollingUpdate)

kubectl set image ds filebeta-ds filebeta=ikubernetes/filebeta:5.6.6-alpine

kubectl get pod -w 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM