什麼是 DaemonSet?
DaemonSet 確保所有(或者一些)Node 上運行一個 Pod 的副本。當有 Node 加入集羣時,也會爲他們新增一個 Pod 。當有 Node 從集羣移除時,這些 Pod 也會被回收。刪除 DaemonSet 將會刪除它建立的全部 Pod。node
使用 DaemonSet 的一些典型用法:docker
- 運行集羣存儲 daemon,例如在每一個 Node 上運行
glusterd
、ceph
。
- 日誌收集,好比fluentd,logstash等
- 系統監控,好比Prometheus Node Exporter,collectd,New Relic agent,Ganglia gmond等
- 系統程序,好比kube-proxy, kube-dns, glusterd, ceph等
一個簡單的用法是,在全部的 Node 上都存在一個 DaemonSet,將被做爲每種類型的 daemon 使用。 一個稍微複雜的用法多是,對單獨的每種類型的 daemon 使用多個 DaemonSet,但具備不一樣的標誌,和/或對不一樣硬件類型具備不一樣的內存、CPU要求。api
例子
使用Fluentd收集日誌的例子:app
-
- apiVersion: extensions/v1beta1 kind: DaemonSet metadata: name: fluentd spec: template: metadata: labels: app: logging id: fluentd name: fluentd spec: containers: - name: fluentd-es image: gcr.io/google_containers/fluentd-elasticsearch:1.3 env: - name: FLUENTD_ARGS value: -qq volumeMounts: - name: containers mountPath: /var/lib/docker/containers - name: varlog mountPath: /varlog volumes: - hostPath: path: /var/lib/docker/containers name: containers - hostPath: path: /var/log name: varlog
選擇運行節點:當指定.spec.template.spec.nodeSelector,DaemonSet將會在匹配的節點上建立pod。若是都沒有指定,DaemonSet在全部node節點上建立pod.dom
指定Node節點
DaemonSet會忽略Node的unschedulable狀態,有兩種方式來指定Pod只運行在指定的Node節點上:elasticsearch
- nodeSelector:只調度到匹配指定label的Node上
- nodeAffinity:功能更豐富的Node選擇器,好比支持集合操做
- podAffinity:調度到知足條件的Pod所在的Node上
nodeSelector示例
首先給Node打上標籤ui
kubectl label nodes node-01 disktype=ssd
而後在daemonset中指定nodeSelector爲disktype=ssd:google
spec:
nodeSelector:
disktype: ssd
nodeAffinity示例
nodeAffinity目前支持兩種:requiredDuringSchedulingIgnoredDuringExecution和preferredDuringSchedulingIgnoredDuringExecution,分別表明必須知足條件和優選條件。好比下面的例子表明調度到包含標籤kubernetes.io/e2e-az-name而且值爲e2e-az1或e2e-az2的Node上,而且優選還帶有標籤another-node-label-key=another-node-label-value的Node。spa
-
- apiVersion: v1 kind: Pod metadata: name: with-node-affinity spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/e2e-az-name operator: In values: - e2e-az1 - e2e-az2 preferredDuringSchedulingIgnoredDuringExecution: - weight: 1 preference: matchExpressions: - key: another-node-label-key operator: In values: - another-node-label-value containers: - name: with-node-affinity image: gcr.io/google_containers/pause:2.0
podAffinity示例
podAffinity基於Pod的標籤來選擇Node,僅調度到知足條件Pod所在的Node上,支持podAffinity和podAntiAffinity。這個功能比較繞,如下面的例子爲例:.net
- 若是一個「Node所在Zone中包含至少一個帶有security=S1標籤且運行中的Pod」,那麼能夠調度到該Node
- 不調度到「包含至少一個帶有security=S2標籤且運行中Pod」的Node上
-
apiVersion: v1 kind: Pod metadata: name: with-pod-affinity spec: affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: security operator: In values: - S1 topologyKey: failure-domain.beta.kubernetes.io/zone podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchExpressions: - key: security operator: In values: - S2 topologyKey: kubernetes.io/hostname containers: - name: with-pod-affinity image: gcr.io/google_containers/pause:2.0
靜態Pod
除了DaemonSet,還可使用靜態Pod來在每臺機器上運行指定的Pod,這須要kubelet在啓動的時候指定manifest目錄:
kubelet --pod-manifest-path=/etc/kubernetes/manifests
而後將所須要的Pod定義文件放到指定的manifest目錄中。
注意:靜態Pod不能經過API Server來刪除,但能夠經過刪除manifest文件來自動刪除對應的Pod。