k8s概念-DaemonSet

 回到目录

 参考链接icon-default.png?t=N6B9https://v1-23.docs.kubernetes.io/zh/docs/concepts/workloads/controllers/daemonset/

  • DaemonSet 确保全部(或者某些)节点上运行一个 Pod 的副本

  • 当节点加入到K8S集群中,pod会被(DaemonSet)调度到该节点上运行,当节点从K8S集群中被移除,被DaemonSet调度的pod会被移除

  • 如果删除DaemonSet,所有跟这个DaemonSet相关的pods都会被删除。

  • 如果一个DaemonSet的Pod被杀死、停止、或者崩溃,那么DaemonSet将会重新创建一个新的副本在这台计算节点上。

  • DaemonSet一般应用于日志收集、监控采集、分布式存储守护进程等

 通俗的讲:DaemonSet在一个节点上只有一个pod,且集群内所有节点都部署【结合污点和容忍】

yaml文件

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd
spec:
	selector:
    matchLabels:
      name: fluentd-elasticsearch
  template:
    metadata:
      labels:
        app: logging
        id: fluentd
      name: fluentd
    spec:
    	tolerations:
      # 这些容忍度设置是为了让该守护进程集在控制平面节点上运行
      # 如果你不希望自己的控制平面节点运行 Pod,可以删除它们
      - key: node-role.kubernetes.io/control-plane
        operator: Exists
        effect: NoSchedule
      - key: node-role.kubernetes.io/master
        operator: Exists
        effect: NoSchedule
      containers:
      - name: fluentd-es
        image: agilestacks/fluentd-elasticsearch:v1.3.0
        env:
         - name: FLUENTD_ARGS
           value: -qq
        volumeMounts:
         - name: containers
           mountPath: /var/lib/docker/containers
         - name: varlog
           mountPath: /varlog
      volumes:
         - hostPath:
             path: /var/lib/docker/containers
           name: containers
         - hostPath:
             path: /var/log
           name: varlog

查看

kubectl get daemonset				# daemonset可简写为ds
NAME              DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
daemonset-nginx   4         4         4       4            4                     114s

再查看pod,发现每个node上都运行了一个守护进程

kubectl get pods -o wide # 每个node上都运行了一个守护进程
NAME                    READY   STATUS    RESTARTS   AGE   IP               NODE          NOMINATED NODE   READINESS GATES
daemonset-nginx-94z6d   1/1     Running   0          6s    10.244.194.104   k8s-worker1              
daemonset-nginx-hs9mk   1/1     Running   0          6s    10.244.135.206   k8s-master3              
daemonset-nginx-jrcf5   1/1     Running   0          6s    10.244.159.167   k8s-master1              
daemonset-nginx-sslpl   1/1     Running   0          6s    10.244.224.22    k8s-master2       

指定node部署

这里使用亲和性和反亲和性

参考文档:将 Pod 指派给节点 | Kubernetes

DaemonSet 会忽略 Node 的 unschedulable 状态,有三种方式来指定 Pod 只运行在指定的 Node 节点上

  • nodeSelector:只调度到匹配指定 label 的 Node 上

  • nodeAffinity:功能更丰富的 Node 选择器,比如支持集合操作

  • podAffinity:调度到满足条件的 Pod 所在的 Node 上

NodeSelector
#先为 Node 打上标签
kubectl label nodes k8s-node1 svc_type=microsvc

#然后再 daemonset 配置中pod模板期望中设置 nodeSelector
spec:
  template:
    spec:
      nodeSelector:
        svc_type: microsvc
NodeAffinity

nodeAffinity 目前支持两种:requiredDuringSchedulingIgnoredDuringExecution 和 preferredDuringSchedulingIgnoredDuringExecution,分别代表亲和性和反亲和性。

下面例子是选择Daemonset的metadata.name属性必须包含target-host-name属性

spec:
  template:
    spec:
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
          - matchFields:
            - key: metadata.name
              operator: In
              values:
              - target-host-name
PodAffinity

podAffinity 基于 Pod 的标签来选择 Node,仅调度到满足条件Pod 所在的 Node 上,支持 podAffinity 和 podAntiAffinity。这个功能比较绕,以下面的例子为例:

  • 如果一个 “Node 所在空间中包含至少一个带有 auth=oauth2 标签且运行中的 Pod”,那么可以调度到该 Node

  • 不调度到 “包含至少一个带有 auth=jwt 标签且运行中 Pod”的 Node 上

apiVersion: v1
kind: Pod
metadata:
  name: with-pod-affinity
spec:
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: auth
            operator: In
            values:
            - oauth2
        topologyKey: failure-domain.beta.kubernetes.io/zone
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: auth
              operator: In
              values:
              - jwt
          topologyKey: kubernetes.io/hostname
  containers:
  - name: with-pod-affinity
    image: pauseyyf/pause

 更新

不建议使用 RollingUpdate,建议使用 OnDelete 模式,这样避免频繁更新 ds,浪费资源

你可能感兴趣的:(kubernetes,kubernetes,容器,云原生)