DaemonSet是在Kubernetes1.2 版本新增的一種資源對象node
DaemonSet
可以讓全部(或者一些特定)的Node
節點僅運行一份Pod
。當節點加入到kubernetes集羣中,Pod會被(DaemonSet)調度到該節點上運行,當節點從kubernetes集羣中被移除,被(DaemonSet)調度的Pod會被移除,若是刪除DaemonSet,全部跟這個DaemonSet相關的pods都會被刪除。算法
在使用kubernetes來運行應用時,不少時候咱們須要在一個區域(zone)
或者全部Node
上運行同一個守護進程(pod)
,例如以下場景:docker
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(滾動升級)。日誌