iT邦幫忙

2022 iThome 鐵人賽

DAY 21
0
DevOps

從認識Docker到精通系列 第 21

第二十一天 - Daemon Set

  • 分享至 

  • xImage
  •  

DaemonSet


(圖源:DaemonSet  |  Google Kubernetes Engine (GKE)  |  Google Cloud)
在前幾天我們講了在各個node部署時會用到的Deployment、單次的批次工作的Job以及定期性的批次工作 CronJob,但若我們想要在每個node都執行一個特定的pod (adhere to a one-Pod-per-node model),像是日誌搜集系統、監測系統,利用上述工具便會變得有些複雜,這個時候,我們就可以使用自1.2版開始支援的資源物件 - DaemonSet,讓我們快速做到這件事情,以下為k8s官方docs中提到的使用情境:

  • 在每個node上運行Cluster Storge
  • 在每個node上運行logs collection daemon
  • 在每個node上運行monitoring daemon

DaemonSet YAML

和其他的資源類型、排程器一樣,都是用 YAML 檔去撰寫DaemonSet的配置內容,以下為官方提供的一個 DaemonSet 範例

apiVersion: apps/v1

kind: DaemonSet

metadata:

  name: fluentd-elasticsearch

  namespace: kube-system

  labels:

    k8s-app: fluentd-logging

spec:

  selector:

    matchLabels:

      name: fluentd-elasticsearch

  template:

    metadata:

      labels:

        name: fluentd-elasticsearch

    spec:

      tolerations:

      # these tolerations are to have the daemonset runnable on control plane nodes

      # remove them if your control plane nodes should not run pods

      - key: node-role.kubernetes.io/control-plane

        operator: Exists

        effect: NoSchedule

      - key: node-role.kubernetes.io/master

        operator: Exists

        effect: NoSchedule

      containers:

      - name: fluentd-elasticsearch

        image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2

        resources:

          limits:

            memory: 200Mi

          requests:

            cpu: 100m

            memory: 200Mi

        volumeMounts:

        - name: varlog

          mountPath: /var/log

      terminationGracePeriodSeconds: 30

      volumes:

      - name: varlog

        hostPath:

          path: /var/log

完成後依樣使用apply命令便可部署

kubectl apply -f <YAML檔位置>

pod template

  • .spec.template:為 必要 的部分,是 daemonSet 在各個 node 建立 pod 時的 pod 模板,其撰寫格式和 pod 的 template 相同
  • .spec.template.metadata.label:和其他的排程器一樣,必須設置適當的 label 作為 selector使用
  • RestartPolicy:因為是 DaemonSet 使用,故必須是Always,上方未設置是因為預設值為Always

pod selector

  • .spec.selector:為 DaemonSet 的 YAML 中另一個必要的項目,用來設置選取的 pod 條件
    • 一但設置就不可更改
    • 必須和 .spec.template.metadata.label中設置的一樣,也可以用 matchLabelsmatchExpression 的方式表示
    • 若上述表示法都使用,則會取兩個表示法的交集(也就是AND後的結果)
    • 要注意其他的資料資源如 deployment、job、cronjob、和pod,不可以使用類似的label,不然會被DaemonSet誤認為自己創建的 pod

node selector

  • 還有一個欄位叫做 .spec.template.spec.nodeSelector,若設置了這條,則 DaemonSet 會在符合條件的 node 上執行 pod
  • 若未設置,則 daemonSet 會在全部的 node 上創建 pod

v1.2前舊版的DaemonSet controller和kube-scheduler的衝突問題

  • 其他的 pod 在部署前是由 k8s-scheduler去做規劃,並部署到 node 各自的pod中,然而DaemonSet 是由DaemonSet自己的controller去做規劃的,因此有機會產生衝突(一般的 pod 在等待被分派前,被建立後會先進入 Pending 狀態,但 DaemonSet Pod 不會先進入 Pending 狀態,這樣的過程可能會讓使用者混淆)
  • DemonSet 可以在 k8s-scheduler 啟動之前便部署 pod

v1.2後

  • DaemonSet Controller的工作歸還給 kube-scheduler,藉此可避免上面的問題

經過以上的解釋應該就可以了解daemonSet的作用、和看懂上面YAML檔的內容了,但在最後面有個tolerations的部分,還沒有提到,那就是明天的主題啦

REF

DaemonSet | Kubernetes
DaemonSet  |  Google Kubernetes Engine (GKE)  |  Google Cloud


上一篇
第二十天 - CronJob
下一篇
第二十二天-Taints and Tolerations
系列文
從認識Docker到精通30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言