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 的典型应用场景有:

  1. 在集群的每个节点上运行存储 Daemon,比如 glusterd 或 ceph。

  2. 在每个节点上运行日志收集 Daemon,比如 flunentd 或 logstash。

  3. 在每个节点上运行监控 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。

 

posted @ 2018-03-07 17:18  Cslc-DaweiJ  阅读(2908)  评论(0编辑  收藏  举报