书籍来源:cloudman《每天5分钟玩转Kubernetes》
一边学习一边整理老师的课程内容及试验笔记,并与大家分享,侵权即删,谢谢支持!
附上汇总贴:每天5分钟玩转Kubernetes | 汇总_COCOgsta的博客-CSDN博客
Deployment部署的副本Pod会分布在各个Node上,每个Node都可能运行好几个副本。DaemonSet的不同之处在于:每个Node上最多只能运行一个副本。
DaemonSet的典型应用场景有:
(1)在集群的每个节点上运行存储Daemon,比如glusterd或ceph。
(2)在每个节点上运行日志收集Daemon,比如flunentd或 logstash。
(3)在每个节点上运行监控Daemon,比如Prometheus Node Exporter或collectd。
其实Kubernetes自己就在用DaemonSet运行系统组件。执行如下命令,如图所示。
kubectl get daemonset --namespace=kube-system
DaemonSet kube-flannel-ds和kube-proxy分别负责在每个节点上运行flannel和kube-proxy组件,如图所示。
因为flannel和kube-proxy属于系统组件,需要在命令行中通过--namespace=kube-system指定namespace kube-system。若不指定,则只返回默认namespace default中的资源。
下面我们通过分析kube-flannel-ds来学习DaemonSet。
还记得之前是如何部署flannel网络的吗?我们执行了如下命令:(实际未用此方式部署,因为无法下载国外网站文件)
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
注意:配置文件的完整内容要更复杂一些,为了更好地学习DaemonSet,这里只保留了最重要的内容。
① DaemonSet配置文件的语法和结构与Deployment几乎完全一 样,只是将kind设为DaemonSet。
② hostName指定Pod直接使用的是Node网络,相当于docker run - -network=host。考虑到flannel需要为集群提供网络连接,这个要求是合理的。
③ containers定义了运行flannel服务的两个容器。
下面我们再来分析另一个DaemonSet:kube-proxy。
由于无法拿到kube-proxy的YAML文件,只能运行如下命令查看配置:
kubectl edit daemonset kube-proxy --namespace=kube-system
结果如图所示。
同样为了便于理解,这里只保留了最重要的信息。
① kind: DaemonSet指定这是一个DaemonSet类型的资源。
② containers定义了kube-proxy的容器。
③ status是当前DaemonSet的运行时状态,这个部分是kubectl edit特有的。其实Kubernetes集群中每个当前运行的资源都可以通过 kubectl edit查看其配置和运行状态,比如kubectl edit deployment nginx-deployment。
本小节以Prometheus Node Exporter为例演示用户如何运行自己的DaemonSet。
Prometheus是流行的系统监控方案,Node Exporter是Prometheus的agent,以Daemon的形式运行在每个被监控节点上。
如果是直接在Docker中运行Node Exporter容器,命令为:
docker run -d \
-v "/proc:/host/proc" \
-v "/sys:/host/sys" \
-v "/:/rootfs" \
--net=host \
prom/node-exporter \
--path.procfs /host/proc \
--path.sysfs /host/sys \
--collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)"
将其转换为DaemonSet的YAML配置文件node_exporter.yml,如下所示。
[root@k8s-master ~]# cat node_exporter.yml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: node-exporter-daemonset
spec:
selector:
matchLabels:
app: prometheus
template:
metadata:
labels:
app: prometheus
spec:
hostNetwork: true
containers:
- name: node-exporter
image: prom/node-exporter
imagePullPolicy: IfNotPresent
command:
- /bin/node_exporter
- --path.procfs
- /host/proc
- --path.sysfs
- /host/sys
- --collector.filesystem.ignored-mount-points
- ^/(sys|proc|dev|host|etc)($|/)
volumeMounts:
- name: proc
mountPath: /host/proc
- name: sys
mountPath: /host/sys
- name: root
mountPath: /rootfs
volumes:
- name: proc
hostPath:
path: /proc
- name: sys
hostPath:
path: /sys
- name: root
hostPath:
path: /
[root@k8s-master ~]#
① 直接使用Host的网络。
② 设置容器启动命令。
③ 通过Volume将Host路径/proc、/sys和/映射到容器中。我们将在后面详细讨论Volume。
执行kubectl apply -f node_exporter.yml,如图所示。
DaemonSet node-exporter-daemonset部署成功,k8s-node1和k8s-node2上分别运行了一个node exporter Pod。