K8S脉络整理(008)-DaemonSet
1、典型应用场景
2、两个 k8s 自己的 DaemonSet:kube-flannel-ds
和 kube-proxy
3、以 Prometheus Node Exporter 为例演示如何运行自己的 DaemonSet
Kubernetes 集群中每个当前运行的资源(deployment daemonset replicaset pod)都可以通过 kubectl edit 查看和编辑其配置和运行状态。
比如 kubectl edit deployment nginx-deployment
使用kubespary安装的k8s1.9 中,kube-proxy不再是daemonset,而是以pod存在各节点;
查看pod配置方式:kubectl edit pod kube-proxy-master --namespace=kube-system
1、典型应用场景
Deployment 部署的副本 Pod 会分布在各个 Node 上,每个 Node 都可能运行好几个副本。
DaemonSet 的不同之处在于:每个 Node 上最多只能运行一个副本。
DaemonSet 的典型应用场景有:
-
在集群的每个节点上运行存储 Daemon,比如 glusterd 或 ceph。
-
在每个节点上运行日志收集 Daemon,比如 flunentd 或 logstash。
-
在每个节点上运行监控 Daemon,比如 Prometheus Node Exporter 或 collectd。
其实 Kubernetes 自己就在用 DaemonSet 运行系统组件。执行如下命令:
kubectl get daemonset --namespace=kube-system
daweij@master:~$ kubectl get daemonset --namespace=kube-system NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE calico-node 5 5 5 5 5 <none> 33d
DaemonSet calico-node
负责在每个节点上运行 calico网络。
daweij@master:~$ kubectl get pod --namespace=kube-system -o wide NAME READY STATUS RESTARTS AGE IP NODE calico-node-4gm72 1/1 Running 53 33d 172.28.2.212 node2 calico-node-8fkfk 1/1 Running 0 33d 172.28.2.210 master calico-node-fqdwj 1/1 Running 53 33d 172.28.2.213 node3 calico-node-lpdtx 1/1 Running 48 33d 172.28.2.211 node1 calico-node-nq8l2 1/1 Running 42 33d 172.28.2.214 node4 kube-apiserver-master 1/1 Running 0 33d 172.28.2.210 master kube-apiserver-node4 1/1 Running 224 18d 172.28.2.214 node4 kube-controller-manager-master 1/1 Running 0 33d 172.28.2.210 master kube-controller-manager-node4 1/1 Running 5 18d 172.28.2.214 node4 kube-dns-79d99cdcd5-6vvrw 3/3 Running 0 18d 10.233.102.131 node1 kube-dns-79d99cdcd5-rkpf2 3/3 Running 0 18d 10.233.71.5 node3 kube-proxy-master 1/1 Running 0 33d 172.28.2.210 master kube-proxy-node1 1/1 Running 0 33d 172.28.2.211 node1 kube-proxy-node2 1/1 Running 0 18d 172.28.2.212 node2 kube-proxy-node3 1/1 Running 0 33d 172.28.2.213 node3 kube-proxy-node4 1/1 Running 0 18d 172.28.2.214 node4 kube-scheduler-master 1/1 Running 0 33d 172.28.2.210 master kube-scheduler-node4 1/1 Running 3 18d 172.28.2.214 node4 kubedns-autoscaler-5564b5585f-7z62x 1/1 Running 0 18d 10.233.71.4 node3 kubernetes-dashboard-6bbb86ffc4-zmmc2 1/1 Running 0 18d 10.233.75.5 node2 nginx-proxy-node1 1/1 Running 0 33d 172.28.2.211 node1 nginx-proxy-node2 1/1 Running 0 18d 172.28.2.212 node2 nginx-proxy-node3 1/1 Running 0 33d 172.28.2.213 node3
因为 calico 属于系统组件,需要在命令行中通过 --namespace=kube-system
指定 namespace kube-system
。
如果不指定则只返回默认 namespace default
中的资源。
下节详细分析 calico和 kube-proxy
这两个 DaemonSet。
calico-node的ymal文件模板参考
vim /root/kubespray/roles/network_plugin/calico/templates/calico-node.yml.j2
或执行下述命令查看配置
kubectl edit daemonset calico-node --namespace=kube-system
kube-proxy参考
vim /root/kubespray/roles/kubernetes/node/templates/kube-proxy-kubeconfig.yaml.j2
因所安装网络和cloudman的不同,下述以cloudman blog为准。
参考:http://www.cnblogs.com/CloudMan6/p/8449209.html
本节详细分析两个 k8s 自己的 DaemonSet:kube-flannel-ds
和 kube-proxy
。
kube-flannel-ds
下面我们通过分析 kube-flannel-ds
来学习 DaemonSet。
还记得之前是如何部署 flannel 网络的吗?我们执行了如下两个命令:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
flannel 的 DaemonSet 就定义在 kube-flannel.yml
中:
注:配置文件的完整内容要复杂些,为了更好地学习 DaemonSet,这里只保留了最重要的内容。
① DaemonSet 配置文件的语法和结构与 Deployment 几乎完全一样,只是将 kind
设为 DaemonSet
。
② hostNetwork 指定 Pod 直接使用的是 Node 的网络,相当于 docker run --network=host
。考虑到 flannel 需要为集群提供网络连接,这个要求是合理的。
③ containers
定义了运行 flannel 服务的两个容器。
我们再来分析另一个 DaemonSet kube-proxy
。
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
。
首先查看deployment kubectl get deployment --namespace=kube-system
使用kubespary安装的k8s1.9 中,kube-proxy不再是daemonset,而是以pod存在各节点,
查看配置方式:kubectl edit pod kube-proxy-master --namespace=kube-system
apiVersion: v1 kind: Pod metadata: annotations: kubernetes.io/config.hash: d9ac7a0726731fe5e9bb4d0047ee6840 kubernetes.io/config.mirror: d9ac7a0726731fe5e9bb4d0047ee6840 kubernetes.io/config.seen: 2018-02-01T19:02:59.015440759+08:00 kubernetes.io/config.source: file kubespray.kube-proxy-cert/serial: C943FB9988696E0A creationTimestamp: 2018-02-01T11:04:11Z labels: k8s-app: kube-proxy name: kube-proxy-master namespace: kube-system resourceVersion: "310" selfLink: /api/v1/namespaces/kube-system/pods/kube-proxy-master uid: a22c8545-073f-11e8-b7fb-005056a90262 spec: containers: - command: - /hyperkube - proxy - --v=2 - --kubeconfig=/etc/kubernetes/kube-proxy-kubeconfig.yaml - --bind-address=172.28.2.210 - --cluster-cidr=10.233.64.0/18 - --proxy-mode=iptables image: quay.io/coreos/hyperkube:v1.9.0_coreos.0 imagePullPolicy: IfNotPresent name: kube-proxy resources: limits: ................
运行自己的 DaemonSet。
本节以 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:
① 直接使用 Host 的网络。
② 设置容器启动命令。
③ 通过 Volume 将 Host 路径 /proc
、/sys
和 /
映射到容器中。我们将在后面详细讨论 Volume。
执行 kubectl apply -f node_exporter.yml
:
DaemonSet node-exporter-daemonset
部署成功,k8s-node1 和 k8s-node2 上分别运行了一个 node exporter Pod。