实验手册05-DaemonSet

本节我们了解一下 K8S 的另一个 Controller: DaemonSet

Deployment 和 DaemonSet 的主要区别是:

  1. Deployment 部署的副本 Pods 会分布到各个节点上,而且一个节点可以运行好几个副本
  2. DaemonSet 只允许一个节点最多运行一个副本

前面说到“DaemonSet 只允许一个节点最多运行一个副本”,这种特性非常适合一些系统组件,比如我们之用安装过的 flannel 网络插件,它和各个节点的通信有关,直观感受上,一个节点拥有一个副本是最合适的

步骤1 验证(主节点)

bash

kubectl get pods --namespace kube-flannel -o wide

如图所示,每个节点都运行着一个 flannel 副本

今天只是回头看一下,粗略了解,我们后面还会深入了解它

对比一下上节课的 nginx.yaml 文件和几天以前上课分发的文件 kube-flannel.yml

以下是 kube-flannel.yml的节选内容:

yaml

apiVersion: apps/v1
kind: DaemonSet # nginx.yaml 中是 Deployment
metadata:
  name: kube-flannel-ds	  # 另外一个文件中是 nginx-deployment
  namespace: kube-flannel # 另外一个文件中没有这个,所以它在 default 空间里面
  labels:
    tier: node
    app: flannel
    k8s-app: flannel
spec:
  selector:
    matchLabels:
      app: flannel
  template:
    metadata:
      labels:
        tier: node
        app: flannel
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/os
                operator: In
                values:
                - linux
      hostNetwork: true # 直接使用宿主机的网络,相当于 docker run --network=host
      priorityClassName: system-node-critical
      tolerations:
      - operator: Exists
        effect: NoSchedule
      serviceAccountName: flannel
      initContainers:
      - name: install-cni-plugin
        image: docker.io/flannel/flannel-cni-plugin:v1.2.0
        command:
        - cp
        args:
        - -f
        - /flannel
        - /opt/cni/bin/flannel
        volumeMounts:
        - name: cni-plugin
          mountPath: /opt/cni/bin
      - name: install-cni
        image: docker.io/flannel/flannel:v0.22.2
        command:
        - cp
        args:
        - -f
        - /etc/kube-flannel/cni-conf.json
        - /etc/cni/net.d/10-flannel.conflist
        volumeMounts:
        - name: cni
          mountPath: /etc/cni/net.d
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      containers:
      - name: kube-flannel # 昨天那个是 nginx
        image: docker.io/flannel/flannel:v0.22.2 # 昨天那个是 nginx:1.7.9
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --kube-subnet-mgr
        resources:
          requests:
            cpu: "100m"
            memory: "50Mi"

我们现在只需要知道,这两个文件的结构很像就可以了,或者换句话说,flannel 这一系统组件和我们昨天自己运行的 nginx-deployment 并没有本质上的区别

步骤1 修改上节课的 nginx.yaml,要求如下:

  • kind 改成 DaemonSet
  • metadata 中的 name 改成 nginx-daemonset
  • 删除 replicas 这一行
  • 删除 nodeSelector 和 star: five 这两行

具体操作:

bash

cp nginx.yaml nginx-ds.yaml
vim nginx-ds.yaml

修改后的文件是右侧这样的:

大家修改文件时,要注意缩进

我们可以使用 Sublime Text 这类编辑器辅助我们修改文件,利用下图中出现的“竖线”来判断缩进是不是对齐了

配置文件对比

步骤2 主节点执行以下命令,应用我们修改后的配置文件

bash

kubectl apply -f nginx-ds.yaml

步骤3 验证一下是不是创建了 DaemonSet

bash

kubectl get daemonset
DaemonSet列表

步骤4 验证一个是不是创建了对应的 Pods(我们预期是每个节点上都有一个 Pod 副本)

bash

kubectl get pods -o wide

0914修改:增加 -o wide 参数

Pods列表

符合我们的预期