Kubernetes Daemonset 實操筆記

DeemonSet

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

典型用法

  • 在每個節點上運行集羣守護進程
  • 在每個節點上運行日誌收集守護進程
  • 在每個節點上運行監控守護進程

創建一個 Daemonset 示例

daemonset.yaml 文件

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.15.2
        imagePullPolicy: IfNotPresent
        name: nginx
        resources:
          limits:
            memory: 200Mi
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30

創建

[root@master01 daemoset]# kubectl create -f daemonset.yaml 
daemonset.apps/nginx created

[root@master01 daemoset]# kubectl get ds -owide
NAME    DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE    CONTAINERS   IMAGES         SELECTOR
nginx   5         5         5       5            5           <none>          101s   nginx        nginx:1.15.2   app=nginx


# 查看ds信息,所有節點都有一個
[root@master01 daemoset]# kubectl get po -owide
NAME          READY   STATUS    RESTARTS   AGE     IP               NODE       NOMINATED NODE   READINESS GATES
busybox       1/1     Running   1          4d22h   172.18.71.25     master03   <none>           <none>
nginx-4lskr   1/1     Running   0          18s     172.18.71.27     master03   <none>           <none>
nginx-7r7sq   1/1     Running   0          11s     172.20.59.215    master02   <none>           <none>
nginx-cn86m   1/1     Running   0          35s     172.29.55.24     node01     <none>           <none>
nginx-cwf6t   1/1     Running   0          24s     172.31.112.154   master01   <none>           <none>
nginx-hkwpw   1/1     Running   0          3s      172.21.231.153   node02     <none>           <none>


查看創建的 daemonset

[root@master01 daemoset]# kubectl  get ds -oyaml
apiVersion: v1
items:
- apiVersion: apps/v1
  kind: DaemonSet
  metadata:
    annotations:
      deprecated.daemonset.template.generation: "1"
    creationTimestamp: "2022-11-07T13:35:18Z"
    generation: 1
    labels:
      app: nginx
    managedFields:
    - apiVersion: apps/v1
      fieldsType: FieldsV1
      fieldsV1:
        f:metadata:
          f:annotations:
            .: {}
            f:deprecated.daemonset.template.generation: {}
          f:labels:
            .: {}
            f:app: {}
        f:spec:
          f:revisionHistoryLimit: {}
          f:selector: {}
          f:template:
            f:metadata:
              f:labels:
                .: {}
                f:app: {}
            f:spec:
              f:containers:
                k:{"name":"nginx"}:
                  .: {}
                  f:image: {}
                  f:imagePullPolicy: {}
                  f:name: {}
                  f:resources:
                    .: {}
                    f:limits:
                      .: {}
                      f:memory: {}
                  f:terminationMessagePath: {}
                  f:terminationMessagePolicy: {}
              f:dnsPolicy: {}
              f:restartPolicy: {}
              f:schedulerName: {}
              f:securityContext: {}
              f:terminationGracePeriodSeconds: {}
          f:updateStrategy:
            f:rollingUpdate:
              .: {}
              f:maxUnavailable: {}
            f:type: {}
      manager: kubectl-create
      operation: Update
      time: "2022-11-07T13:35:18Z"
    - apiVersion: apps/v1
      fieldsType: FieldsV1
      fieldsV1:
        f:status:
          f:currentNumberScheduled: {}
          f:desiredNumberScheduled: {}
          f:numberAvailable: {}
          f:numberReady: {}
          f:observedGeneration: {}
          f:updatedNumberScheduled: {}
      manager: kube-controller-manager
      operation: Update
      time: "2022-11-07T13:35:53Z"
    name: nginx
    namespace: default
    resourceVersion: "106533"
    uid: 91cc650b-d7f1-4746-b478-d4fce91bc675
  spec:
    revisionHistoryLimit: 10
    selector:
      matchLabels:
        app: nginx
    template:
      metadata:
        creationTimestamp: null
        labels:
          app: nginx
      spec:
        containers:
        - image: nginx:1.15.2
          imagePullPolicy: IfNotPresent
          name: nginx
          resources:
            limits:
              memory: 200Mi
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
        dnsPolicy: ClusterFirst
        restartPolicy: Always
        schedulerName: default-scheduler
        securityContext: {}
        terminationGracePeriodSeconds: 30
    updateStrategy:
      rollingUpdate:
        maxUnavailable: 1
      type: RollingUpdate
  status:
    currentNumberScheduled: 5
    desiredNumberScheduled: 5
    numberAvailable: 5
    numberMisscheduled: 0
    numberReady: 5
    observedGeneration: 1
    updatedNumberScheduled: 5
kind: List
metadata:
  resourceVersion: ""
  selfLink: ""

Daemonset 要求

  • DaemonSet 需要 apiVersion、kind 和 metadata 字段
  • DaemonSet 對象的名稱必須是一個合法的 DNS 子域名
  • DaemonSet 也需要 .spec

Pod 模板

  • .spec 中唯一必需的字段是 .spec.template
  • .spec.template 是一個 Pod 模板, 因爲它是嵌套的,因而不具有 apiVersion 或 kind 字段之外,與 Pod 具有相同的 schema
  • 除了 Pod 必需字段外,在 DaemonSet 中的 Pod 模板必須指定合理的標籤(查看 Pod 選擇算符)
  • 在 DaemonSet 中的 Pod 模板必須具有一個值爲 Always 的 RestartPolicy。 當該值未指定時,默認是 Always
Pod 選擇算符
  • .spec.selector 字段表示 Pod 選擇算符,它與 Job 的 .spec.selector 的作用是相同的。
  • 必須指定與 .spec.template 的標籤匹配的 Pod 選擇算符
  • 一旦創建了 DaemonSet,它的 .spec.selector 就不能修改。 修改 Pod 選擇算符可能導致 Pod 意外懸浮,並且這對用戶來說是費解的

spec.selector 是一個對象,如下兩個字段組成

  • matchLabels
  • matchExpressions
    允許構建更加複雜的選擇器,可以通過指定 key、value 列表以及將 key 和 value 列表關聯起來的 Operator。

當上述兩個字段都指定時,結果會按邏輯與(AND)操作處理
.spec.selector 必須與 .spec.template.metadata.labels 相匹配。 如果配置中這兩個字段不匹配,則會被 API 拒絕。

更新與回滾

1. 命令式更新
kubectl edit ds nginx

2. 更新鏡像
kubectl set image ds <daemonset-name> <container-name>=<container-new-image> --record=true
kubectl set image ds nginx nginx=nginx:1.16.1  --record=true

3. 查看更新狀態
kubectl rollout status ds <daemonset-name>

4. 列出所有修訂版本
kubectl rollout history daemonset <daemonset-name>

[root@master01 daemoset]# kubectl rollout history daemonset nginx 
daemonset.apps/nginx 
REVISION  CHANGE-CAUSE
1         <none>
2         <none>
3         kubectl set image ds nginx nginx=nginx:1.16.1 --record=true


5. 回滾到指定revision
kubectl rollout undo daemonset <daemonset-name> --to-revision=<revision>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章