kubernetes控制器之DaemonSet


什么是 DaemonSet?

DaemonSet 確保全部(或者一些)Node 上運行一個 Pod 的副本。當有 Node 加入集群時,也會為他們新增一個 Pod 。當有 Node 從集群移除時,這些 Pod 也會被回收。刪除 DaemonSet 將會刪除它創建的所有 Pod。

使用 DaemonSet 的一些典型用法:

  • 運行集群存儲 daemon,例如在每個 Node 上運行 glusterdceph
  • 日志收集,比如fluentd,logstash等
  • 系統監控,比如Prometheus Node Exporter,collectd,New Relic agent,Ganglia gmond等
  • 系統程序,比如kube-proxy, kube-dns, glusterd, ceph等

一個簡單的用法是,在所有的 Node 上都存在一個 DaemonSet,將被作為每種類型的 daemon 使用。 一個稍微復雜的用法可能是,對單獨的每種類型的 daemon 使用多個 DaemonSet,但具有不同的標志,和/或對不同硬件類型具有不同的內存、CPU要求。

例子

使用Fluentd收集日志的例子:

  1.  
  2. 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.

指定Node節點

DaemonSet會忽略Node的unschedulable狀態,有兩種方式來指定Pod只運行在指定的Node節點上:

  • nodeSelector:只調度到匹配指定label的Node上
  • nodeAffinity:功能更豐富的Node選擇器,比如支持集合操作
  • podAffinity:調度到滿足條件的Pod所在的Node上

nodeSelector示例

首先給Node打上標簽

kubectl label nodes node-01 disktype=ssd

然后在daemonset中指定nodeSelector為disktype=ssd:

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。

  1.  
  2. 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。這個功能比較繞,以下面的例子為例:

  • 如果一個“Node所在Zone中包含至少一個帶有security=S1標簽且運行中的Pod”,那么可以調度到該Node
  • 不調度到“包含至少一個帶有security=S2標簽且運行中Pod”的Node上
  1.  
    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。

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM