Loading

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>
posted @ 2022-11-07 21:56  平凡键客  阅读(68)  评论(0编辑  收藏  举报