容器化守护进程:demonSet
一、 需求:k8s集群中有这样一类需求
1、各种网络插件的 Agent 组件,都必须运行在每一个节点上,用来处理这个节点上的容器网络;
2、各种存储插件的 Agent 组件,也必须运行在每一个节点上,用来在这个节点上挂载远程存储目录,操作容器的 Volume 目录;
3、各种监控组件和日志组件,也必须运行在每一个节点上,负责这个节点上的监控信息和日志搜集。
解决:就是k8s中的daemonSet,我们定义的各种controller,需要每个node上有且仅有一个pod运行,用此来完成。
二、举例
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: - key: node-role.kubernetes.io/master effect: NoSchedule containers: - name: fluentd-elasticsearch image: k8s.gcr.io/fluentd-elasticsearch:1.20 resources: limits: memory: 200Mi requests: cpu: 100m memory: 200Mi volumeMounts: - name: varlog mountPath: /var/log - name: varlibdockercontainers mountPath: /var/lib/docker/containers readOnly: true terminationGracePeriodSeconds: 30 volumes: - name: varlog hostPath: path: /var/log - name: varlibdockercontainers hostPath: path: /var/lib/docker/containers
它的作用:通过 fluentd 将 Docker 容器里的日志转发到 ElasticSearch 中
需要注意的是:Docker 容器里应用的日志,默认会保存在宿主机的 /var/lib/docker/containers/{{. 容器 ID}}/{{. 容器 ID}}-json.log 文件里,所以这个目录正是 fluentd 的搜集目标
1、问题:DaemonSet 又是如何保证每个 Node 上有且只有一个被管理的 Pod 呢?
答案:DaemonSet Controller,首先从 Etcd 里获取所有的 Node 列表,然后遍历所有的 Node。这时,它就可以很容易地去检查,当前这个 Node 上是不是有一个携带了 name=fluentd-elasticsearch 标签的 Pod 在运行。
num >1, 删除至1
num == 1,不变
num == 0,通过 nodeAffinity 来创建至1
2、nodeAffinity是什么?举例
apiVersion: v1 kind: Pod metadata: name: with-node-affinity spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: metadata.name operator: In values: - node-geektime
这里的nodeAffinity 的含义是:
1) requiredDuringSchedulingIgnoredDuringExecution:它的意思是说,这个 nodeAffinity 必须在每次调度的时候予以考虑。同时,这也意味着你可以设置在某些情况下不考虑这个 nodeAffinity;
2) 这个 Pod,将来只允许运行在“metadata.name”是“node-geektime”的节点上。
nodeAffinity能够支持更加丰富的用法,因此代替了nodeSelector
3、问题: master节点上有污点,默认pod部署不上去
解决:通过tolerations来解决
... template: metadata: labels: name: network-plugin-agent spec: tolerations: - key: node.kubernetes.io/network-unavailable operator: Exists effect: NoSchedule
4、如何进行版本控制?
通过ControllerRevision 的k8s资源对象来控制。通过 kubectl rollout undo 来完成