Kubernetes 资源对象之DaemonSet
DaemonSet
能够让所有(或者一些特定)的Node
节点仅运行一份Pod
。当节点加入到kubernetes集群中,Pod会被(DaemonSet)调度到该节点上运行,当节点从kubernetes集群中被移除,被(DaemonSet)调度的Pod会被移除,如果删除DaemonSet,所有跟这个DaemonSet相关的pods都会被删除。
在使用kubernetes来运行应用时,很多时候我们需要在一个区域(zone)
或者所有Node
上运行同一个守护进程(pod)
,例如如下场景:
- 每个Node上运行一个分布式存储的守护进程,例如glusterd,ceph
- 运行日志采集器在每个Node上,例如fluentd,logstash
- 运行监控的采集端在每个Node,例如prometheus node exporter,collectd等
DaemonSet的Pod调度策略与RC很类似,除了使用系统内置的调度算法在每个Node上进行调度,也可以在Pod定义中使用NodeSelector或NodeAffinity来指定满足条件的Node范围进行调度
DaemonSet 资源文件格式
apiVersion: extensions/v1beta1 kind: DaemonSet metadata:
1.下面例子定义为在每个Node上都启动一个filebeat
容器,其中挂载了宿主机目录"/var/log/messages"
$ 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上都创建了一个Pod
$ 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,如下:
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(滚动升级)。