1 前言
2 Kubernetes定义
3 Kubernetes架构
4 Kubernetes技术
4.1 容器化技术
4.1.1 cgroups技术
4.1.2 Docker容器运行环境
4.1.3 containerd容器运行环境
4.1.4 Pod的基本概念
4.1.5 Pod的调度策略
4.1.6 Pod的资源编排
4.1.6.1Deployments
4.1.6.2ReplicaSet
4.1.6.3StatefulSets
4.1.6.4DaemonSet
DaemonSet是指一个类似于操作系统守护进程的Pod集合,kubernetes集群保证在每个(指定或者匹配)节点中都运行一个DaemonSet的Pod副本,每当一个节点加入到kubernetes集群中,则自动化地为该节点创建一个DaemonSet的Pod副本,每当一个节点从kubernetes集群中被删除,则自动化地删除节点对应DaemonSet的Pod副本,如果DaemonSet被删除,则其对应的Pod副本全部被删除。DaemonSet常用使用场景如下所示:
|
DaemonSet支持一对一的守护进程,也支持多对一的守护进程,也就是,一个守护进程对应一个DaemonSet类型,或者一个守护进程对应多个DaemonSet类型组合,不同硬件资源分配不同的处理器资源或者内存资源,或者不同硬件资源使用不同标识。
DaemonSet创建
以下简要说明DaemonSet的配置域:
必填项 apiVersion、kind、metadata以及.spec |
Pod模板 对应.spec.template配置域,RestartPolicy默认值是Always |
Pod选择器 对应.spec.selector配置域,与配置域.spec.template.metadata.labels必须相同 支持多个选择器,使用与运算规则匹配所有的选择器 |
Pod匹配节点 指定.spec.template.spec.nodeSelector配置域、.spec.template.spec.affinity配置域,用于在kubernetes集群调度资源时,控制器需要匹配的节点,如果没有指定需要匹配的节点,则控制器在kubernetes集群的所有节点中创建DaemonSet对应的Pod副本 |
Pod资源调度
DaemonSet保证在每个匹配到的合适的kubernetes集群节点中运行一个与之对应的Pod副本。一般情况下,kubernetes集群的节点资源是由kubernetes集群控制器负责调度,但是,DaemonSet的Pod副本资源是由DaemonSet控制器负责调度与创建,在调度策略上,这些控制器的行为区别如下所示:
|
用户可以使用.spec.affinity配置域设置默认的调度器,直接调度指定的节点资源:
另外,默认调度器默认地增加以下的tolerations策略(集群资源在异常情况下的容忍度),在调度时忽略此类型的节点资源:
node.kubernetes.io/unschedulable:NoSchedule
默认tolerations策略
Kubernetes集群自动地增加以下的tolerations策略(集群资源在异常情况下的容忍度)到DaemonSet的Pod副本中:
Toleration Key:node.kubernetes.io/not-ready Effect:NoExecute Version:1.13+ 当发生网络分区异常的节点问题的时候,DaemonSet中的Pod副本不会被删除 |
Toleration Key:node.kubernetes.io/unreachable Effect:NoExecute Version:1.13+ 当发生网络分区异常的节点问题的时候(网络不可达),DaemonSet中的Pod副本不会被删除 |
Toleration Key:node.kubernetes.io/disk-pressure Effect:NoSchedule Version:1.8+ 不调度磁盘压力问题的资源,忽略该节点资源 |
Toleration Key:node.kubernetes.io/memory-pressure Effect:NoSchedule Version:1.8+ 不调度内存压力问题的资源,忽略该节点资源 |
Toleration Key:node.kubernetes.io/unschedulable Effect:NoSchedule Version:1.12+ 不调度不可调度的资源,忽略该节点资源 |
Toleration Key:node.kubernetes.io/network-unavailable Effect:NoSchedule Version:1.12+ 不调度网络不可用的资源,忽略该节点资源 |
Pod的交互方法
提供如下方法与DaemonSet中的Pod副本进行消息交互:
Push 以消息推送的方式,DaemonSet中的Pod副本直接向其他服务发送更新消息,不需要客户端 |
NodeIP and Known Port 节点IP地址以及开放端口,DaemonSet中的Pod可以设置开放访问端口号,使用节点的IP地址以及Pod端口号可以访问对应Pod |
DNS 创建一个headless的服务,使用与DaemonSet中的Pod副本相同的选择器,绑定它们之间的关系,使用DNS提供的域名访问对应的Pod |
Service 创建一个普通的服务,使用与DaemonSet中的Pod副本相同的选择器,绑定它们之间的关系,使用服务访问对应的Pod |
更新DaemonSet
假如kubernetes集群中的节点的标签发生更新,则DaemonSet控制器将快速在匹配到的新节点中创建新的Pod副本、在不匹配的旧节点中删除旧的Pod副本。
用户可以修改DaemonSet中已创建的Pod副本,但是并不是所有的配置域都可以更新,DaemonSet控制器将使用最原始的模板在新增加的节点中创建新的Pod副本。
如果用户使用--cascade=orphan命令行参数删除DaemonSet,则只删除DaemonSet,但保留其Pod副本,当用户随后再创建相同选择器的DaemonSet的时候,则控制器会绑定新的DaemonSet与已经存在的旧Pod副本之间的关系,用户也可以使用updateStrategy的更新策略替换旧Pod副本。
(未完待续)