容器化守护进程: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 来完成

 

posted @ 2020-12-13 17:55  zizi_come  阅读(260)  评论(0编辑  收藏  举报