Kubernetes 資源對象之DaemonSet

DaemonSet是在Kubernetes1.2 版本新增的一種資源對象node

DaemonSet可以讓全部(或者一些特定)的Node節點僅運行一份Pod。當節點加入到kubernetes集羣中,Pod會被(DaemonSet)調度到該節點上運行,當節點從kubernetes集羣中被移除,被(DaemonSet)調度的Pod會被移除,若是刪除DaemonSet,全部跟這個DaemonSet相關的pods都會被刪除。算法

在使用kubernetes來運行應用時,不少時候咱們須要在一個區域(zone)或者全部Node上運行同一個守護進程(pod),例如以下場景:docker

  • 每一個Node上運行一個分佈式存儲的守護進程,例如glusterd,ceph
  • 運行日誌採集器在每一個Node上,例如fluentd,logstash
  • 運行監控的採集端在每一個Node,例如prometheus node exporter,collectd等

DaemonSet的Pod調度策略與RC很相似,除了使用系統內置的調度算法在每一個Node上進行調度,也能夠在Pod定義中使用NodeSelector或NodeAffinity來指定知足條件的Node範圍進行調度api

DaemonSet 資源文件格式bash

apiVersion: extensions/v1beta1
kind: DaemonSet
  metadata:

1.下面例子定義爲在每一個Node上都啓動一個filebeat容器,其中掛載了宿主機目錄"/var/log/messages"app

$ vi k8s-log-filebeat.yaml
apiVersion: v1
kind: ConfigMap # 定義一個config文件內容
metadata:
  name: k8s-logs-filebeat-config
  namespace: kube-system
data:
  # 填寫filebeat讀取日誌相關信息
  filebeat.yml: |-
    filebeat.prospectors:
      - type: log
        paths:
          - /messages
        fields:
          app: k8s
          type: module
        fields_under_root: true
    output.logstash:
      # specified logstash port (by default 5044)
      hosts: ['10.0.0.100:5044']
---
apiVersion: apps/v1
kind: DaemonSet  # DaemonSet 對象,保證在每一個node節點運行一個副本
metadata:
  name: k8s-logs
  namespace: kube-system
spec:
  selector:
    matchLabels:
      project: k8s
      app: filebeat
  template:
    metadata:
      labels:
        project: k8s
        app: filebeat
    spec:
      containers:
      - name: filebeat
        image: docker.elastic.co/beats/filebeat:6.8.1
        args: [
          "-c", "/etc/filebeat.yml",
          "-e",
        ]
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
          limits:
            cpu: 500m
            memory: 500Mi
        securityContext:
          runAsUser: 0
        # 進行實際掛載操做
        volumeMounts:
        # 將configmap裏的配置掛載到 /etc/filebeat.yml 文件中
        - name: filebeat-config
          mountPath: /etc/filebeat.yml
          subPath: filebeat.yml

        # 將宿主機  /var/log/messages 路徑掛載到 /messages中
        - name: k8s-logs
          mountPath: /messages
      # 定義卷
      volumes:
      - name: k8s-logs
        hostPath:
          path: /var/log/messages
          type: File
      - name: filebeat-config
        configMap:
          name: k8s-logs-filebeat-config

2.使用kubectl create 命令建立該DeamonSet分佈式

$ kubectl create -f  k8s-log-filebeat.yaml
configmap/k8s-logs-filebeat-config created
daemonset.apps/k8s-logs created

3.查看建立好的DeamonSet和Pod,能夠看到在每一個Node上都建立了一個Podide

$ kubectl get ds -n kube-system | grep "k8s-logs"
NAME            DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                 AGE
k8s-logs                  2         2         0       2            0           <none>                        2m15s

$ kubectl get pods -n kube-system -o wide | grep "k8s-logs"  
k8s-logs-gw4bs                         0/1     Running   0          87s     <none>        k8s-node01     <none>           <none>
k8s-logs-p6r6t                         0/1     Running   0          87s     <none>        k8s-node02     <none>           <none>

在kubernetes 1.6之後的版本中,DaemonSet也能執行滾動升級了,即在更新一個DaemonSet模板的時候,舊的Pod副本會被自動刪除,同時新的Pod副本會被自動建立,此時DaemonSet的更新策略(updateStrategy)爲RollingUpdate,以下:spa

apiVersion: apps/v1
kind: DaemonSet 
metadata:
  name: k8s-logs
  namespace: kube-system
spec:
  updateStrategy:
    type: RollingUpdate

updateStrategy 的另一個值是OnDelete,即只有當手工刪除了DaemonSet建立的Pod副本,新的Pod副本纔會被建立出來,若是不設置updateStrategy的值,則在kubernetes 1.6以後的版本中會被默認設置爲RollingUpdate(滾動升級)。日誌

相關文章
相關標籤/搜索