IT评测·应用市场-qidao123.com

标题: k8s工作负载控制器--DaemonSet [打印本页]

作者: 麻花痒    时间: 2024-8-4 22:49
标题: k8s工作负载控制器--DaemonSet
目录

一、概述

DaemonSet 确保全部(或者某些)节点上运行一个 Pod 的副本。 当有节点加入集群时, 也会为他们新增一个 Pod 。 当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。
DaemonSet 的重要作用,是在 Kubernetes 集群里,运行一个 Daemon Pod。 DaemonSet 只管理 Pod 对象,然后通过 nodeAffinity 和 Toleration 这两个调度器参数的功能,包管了每个节点上有且只有一个 Pod

二、适用场景

DaemonSet适用于每个node节点均必要部署一个保卫进程的场景

三、基本操纵

1、官网的DaemonSet资源清单
  1. apiVersion: apps/v1
  2. kind: DaemonSet
  3. metadata:
  4.   name: fluentd-elasticsearch
  5.   namespace: kube-system
  6.   labels:
  7.     k8s-app: fluentd-logging
  8. spec:
  9.   selector:
  10.     matchLabels:
  11.       name: fluentd-elasticsearch
  12.   template:
  13.     metadata:
  14.       labels:
  15.         name: fluentd-elasticsearch
  16.     spec:
  17.       tolerations:
  18.       # 这些容忍度设置是为了让该守护进程集在控制平面节点上运行
  19.       # 如果你不希望自己的控制平面节点运行 Pod,可以删除它们
  20.       - key: node-role.kubernetes.io/control-plane
  21.         operator: Exists
  22.         effect: NoSchedule
  23.       - key: node-role.kubernetes.io/master
  24.         operator: Exists
  25.         effect: NoSchedule
  26.       containers:
  27.       - name: fluentd-elasticsearch
  28.         image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
  29.         resources:
  30.           limits:
  31.             memory: 200Mi
  32.           requests:
  33.             cpu: 100m
  34.             memory: 200Mi
  35.         volumeMounts:
  36.         - name: varlog
  37.           mountPath: /var/log
  38.       # 可能需要设置较高的优先级类以确保 DaemonSet Pod 可以抢占正在运行的 Pod
  39.       # priorityClassName: important
  40.       terminationGracePeriodSeconds: 30
  41.       volumes:
  42.       - name: varlog
  43.         hostPath:
  44.           path: /var/log
复制代码
2、字段解释
  1. apiVersion: apps/v1    #指定YAML文件的API版本,这里是apps/v1
  2. kind: DaemonSet    #定义资源类型,这里是DaemonSet
  3. metadata:    #包含DaemonSet的元数据
  4.   name: fluentd-elasticsearch     #此DaemonSet的名称
  5.   namespace: kube-system    #定义DaemonSet所属的命名空间
  6.   labels:    #定义标签
  7.     k8s-app: fluentd-logging    #此标签表示该DaemonSet与日志处理有关
  8. spec:    #DaemonSet的规约,包含了DaemonSet的规格和行为的详细配置
  9.   selector:    #定义了DaemonSet所管理的Pods的标签选择器,即哪些Pods应该被这个DaemonSet管理。这里matchLabels必须与template.metadata.labels相匹配。
  10.     matchLabels:
  11.       name: fluentd-elasticsearch
  12.   template:    #Pod的模板,用于创建和管理DaemonSet下的Pods
  13.     metadata:    #Pod的元数据,这里包含了与spec.selector.matchLabels相匹配的标签。
  14.       labels:
  15.         name: fluentd-elasticsearch
  16.     spec:    #Pod的规约
  17.       tolerations:     #定义了Pod可以容忍的节点污点,允许Pod在带有特定污点的节点上运行。这里配置了两个容忍度,分别针对控制平面节点和标记为master的节点,确保日志采集容器可以在这些特殊节点上运行。
  18.       # 这些容忍度设置是为了让该守护进程集在控制平面节点上运行
  19.       # 如果你不希望自己的控制平面节点运行 Pod,可以删除它们
  20.       - key: node-role.kubernetes.io/control-plane    #污点的键,通常表示控制平面节点的标签。
  21.         operator: Exists    #Exists,表示只要节点上有与key匹配的污点,无论其值是什么,都将被视为匹配
  22.         effect: NoSchedule    #NoSchedule,表示如果节点上存在与key匹配的污点,则默认情况下不允许Pod被调度到该节点。但是,由于这个Pod声明了对该污点的容忍度,所以Pod可以被调度到带有node-role.kubernetes.io/control-plane污点的节点上。
  23.       - key: node-role.kubernetes.io/master    #指向标记为master的节点的污点键。
  24.         operator: Exists    #只要节点上有与key匹配的污点,无论其值是什么,都将被视为匹配。
  25.         effect: NoSchedule    #表明默认情况下,没有相应容忍度的Pod将不能被调度到带有node-role.kubernetes.io/master污点的节点上。但是,由于这个Pod声明了对该污点的容忍度,所以Pod可以被调度到带有node-role.kubernetes.io/master污点的节点上。
  26.       containers:    #Pod的容器配置
  27.       - name: fluentd-elasticsearch    #容器的名称
  28.         image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2    #指定容器的镜像来源
  29.         resources:    #定义了容器的资源限制和请求
  30.           limits:    #容器的最大资源限制
  31.             memory: 200Mi
  32.           requests:    #容器启动时请求的最小资源量
  33.             cpu: 100m
  34.             memory: 200Mi
  35.         volumeMounts:    #容器如何挂载卷
  36.         - name: varlog    #指定了要挂载的卷的名称
  37.           mountPath: /var/log    #定义了容器内部挂载卷的路径
  38.       # 可能需要设置较高的优先级类以确保 DaemonSet Pod 可以抢占正在运行的 Pod
  39.       # priorityClassName: important
  40.       terminationGracePeriodSeconds: 30    #定义了当Pod被删除时,Kubernetes等待的秒数,以允许容器优雅地关闭。
  41.       volumes:    #定义Pod可以使用的卷
  42.       - name: varlog    #定义了一个卷的名称
  43.         hostPath:    #指定了这个卷的主机路径
  44.           path: /var/log
复制代码
3、编写DaemonSet资源清单

daemonset.yaml
  1. apiVersion: apps/v1
  2. kind: DaemonSet
  3. metadata:
  4.   name: simple-daemonset
  5.   namespace: default
  6. spec:
  7.   selector:
  8.     matchLabels:
  9.       app: simple-daemonset-app
  10.   template:
  11.     metadata:
  12.       labels:
  13.         app: simple-daemonset-app
  14.     spec:
  15.       containers:
  16.       - name: nginx-container
  17.         image: nginx:latest
  18.         ports:
  19.         - containerPort: 80
复制代码
4、基于yaml创建DaemonSet
  1. kubectl apply -f daemonset.yaml
复制代码

5、注意点

5.1、必须字段

DaemonSet必要apiVersion、kind 、metadata 和spec字段
以下是DaemonSetYAML定义中最基本的必需字段:
  1. apiVersion: apps/v1
  2. kind: DaemonSet
  3. metadata:
  4.   name: <daemonset-name>
  5.   namespace: <namespace>
  6. spec:
  7.   selector:
  8.     matchLabels:
  9.       <label-key>: <label-value>
  10.   template:
  11.     metadata:
  12.       labels:
  13.         <label-key>: <label-value>
  14.     spec:
  15.       containers:
  16.       - name: <container-name>
  17.         image: <image-name>
复制代码
5.2、DaemonSet 对象的名称

DaemonSet 对象的名称必须是一个正当的 DNS 子域名
5.3、.spec.selector 与 .spec.template.metadata.labels之间的关系


.spec.selector 必须与 .spec.template.metadata.labels 匹配。这意味着 matchLabels 中定义的每个键值对都必须存在于 .spec.template.metadata.labels 中,以确保DaemonSet能够正确地选择它所创建的Pods。如果 .spec.selector 中的标签是 .spec.template.metadata.labels 的子集,则这种匹配是有效的。但如果 .spec.template.metadata.labels 中缺少 .spec.selector 中的任何一个标签,或者标签值不同,那么设置将被视为无效,Kubernetes API将拒绝这个设置。
6、查看DaemonSet

6.1、查看DaemonSet列表
  1. kubectl get ds -n default -o wide
复制代码

NAME:DaemonSet的名称。在这个例子中,DaemonSet的名称是simple-daemonset。
DESIRED:这是DaemonSet期望在集群中运行的Pod数量。对于DaemonSet而言,这通常是集群中节点的数量,因为DaemonSet的目标是在每个节点上运行至少一个Pod的实例。在这个例子中,DESIRED的值是2,是因为集群有两个节点。
CURRENT:这是DaemonSet当前管理的Pod数量。理想环境下,CURRENT的值应该等于DESIRED的值,这意味着DaemonSet已经达到了其目标状态。在这个例子中,CURRENT的值也是2,与DESIRED相匹配。
READY:这是DaemonSet管理的Pod中处于就绪状态的数量。就绪状态(Ready)意味着Pod中的所有容器都已经启动而且健康检查(如果有的话)已通过。在这个例子中,READY的值是2,表明Pod已经准备好并正在运行。
UP-TO-DATE:这是当前正在运行的Pod中与DaemonSet最新模板匹配的数量。当DaemonSet更新其Pod模板时,这个数字可以帮助你跟踪更新进度。在这个例子中,UP-TO-DATE的值是2,意味着所有运行的Pod都利用了最新的模板。
AVAILABLE:这是DaemonSet管理的Pod中可以服务流量的数量。这个数字通常与READY相同,除非某些Pod由于某种缘故起因被标志为不可用。在这个例子中,AVAILABLE的值是2,与READY一致。
NODE SELECTOR:这是DaemonSet利用的节点选择器,它定义了哪些节点可以运行DaemonSet的Pod。表现DaemonSet没有利用节点选择器,它的Pod可以在任何节点上运行。如果NODE SELECTOR包罗特定的键值对,那么DaemonSet的Pod将仅在具有相应标签的节点上运行。
AGE:这是DaemonSet的创建时间,以连续时间的形式给出。在这个例子中,DaemonSet的AGE是65s,意味着它在65秒前创建。
6.2、查看 DaemonSet 控制器所创建的 Pod 副本信息
  1. kubectl get pods -n default -o wide
复制代码

7、滚动更新

7.1、查看DaemonSet详情
  1. kubectl get ds -n default
  2. kubectl get daemonset simple-daemonset -n default -o json | jq '.spec.updateStrategy'
复制代码

可以看到DaemonSet支持RollingUpdate滚动更新策略

7.2、更新nginx镜像版本
  1. kubectl set image daemonsets simple-daemonset nginx-container=nginx:1.14.0 -n default
复制代码

7.3、查看滚动更新状态
  1. kubectl rollout status ds simple-daemonset -n default
复制代码

7.4、查看DS滚动更新过程
  1. kubectl describe ds simple-daemonset -n default
复制代码

7.5、查看DS滚动更新版本
  1. kubectl rollout history ds simple-daemonset -n default
复制代码

REVERSION1就是初始版本
8、版本回退

8.1、回滚
  1. kubectl rollout undo daemonset -n default simple-daemonset --to-revision=1
复制代码

8.2、查看版本回退环境
  1. kubectl describe ds simple-daemonset -n default
复制代码

9、删除DaemonSet

9.1、直接删除DS
  1. kubectl delete ds simple-daemonset -n default
复制代码

9.2、基于创建的资源清单删除DS
  1. kubectl delete -f daemonset.yaml
复制代码

四、DaemonSet调度

1、调度方式

DaemonSet通过kubernetes默认的调度器scheduler会在所有的node节点上运行一个Pod副本,可以通过如下三种方式将Pod运行在部分节点上
2、指定nodeName节点运行

这种方式通常不用于 DaemonSet,因为 DaemonSet 的目标是在尽大概多的节点上运行 Pod 副本。但是可以通过 .spec.nodeName 来指定特定节点运行 Pod。
2.1、原理机制

2.2、示例

2.2.1、创建一个DaemonSet资源清单,指定nodeName

[code]cat




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4