如何定义一个DaemonSet来创建略有不同的pods?

How to define a DaemonSet to create slightly different pods?

如何定义 DaemonSet 的单个定义以创建与它略有不同的 pods? 我所说的不同 pods 的意思是 pods 从不同的命令创建。 我目前制作了两个不同的 DaemonSet 对象来创建两种不同的 pods.

让我告诉你详情。

我一直在修改kube-flannel.yml,尤其是DaemonSet的定义。 我想将“--iface=”添加到 flanneld [“/opt/bin/flanneld”、“--ip-masq”、“--kube-subnet-mgr”] 我想根据节点标签使用两个不同的以太网接口。

我有三种不同类型的节点: 1)一个master节点有两个以太网接口:eth0用于内网,eth3用于外网 2) 从节点有一个以太网接口: eth0 用于内部网络 3) 一个新添加的节点,带有一个以太网接口:p2p1 用于内部网络

当我有 1) 和 2) 时,我可以使用以下命令: [“/opt/bin/flanneld”、“--ip-masq”、“--kube-subnet-mgr”、“--iface=--eth0”] 我必须添加 --iface 选项,否则主节点上的 flanneld 会自动检测 eth3 而不是 eth0, 这就是我手动添加 iface 选项的原因。

现在我有 3 个), 我必须使用不同的命令创建两个 DaemonSet 定义: [ "/opt/bin/flanneld", "--ip-masq", "--kube-subnet-mgr", "--iface=--eth0"] 对于 1) 和 2) , [ "/opt/bin/flanneld", "--ip-masq", "--kube-subnet-mgr", "--iface=--p2p1"] for 3) 标签选择器用于告知节点使用哪个 DaemonSet。 完整的定义附在最后。

是否有更优雅的方法来创建与单个 DaemonSet 定义略有不同的 pods? 最好只有一个带有占位符的定义,该占位符可以由特定标签的值替换。

否则我可以通过以不同的方式设置法兰绒来做到这一点? 如果我们能给 --iface 选项一个以太网接口列表就好了,但是我的同事发现只能给一个 interface/ip 给 --iface 选项。

谢谢。

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: flannel
---
kind: ConfigMap
apiVersion: v1
metadata:
  name: kube-flannel-cfg
  labels:
    tier: node
    app: flannel
data:
  cni-conf.json: |
    {
      "name": "cbr0",
      "type": "flannel",
      "delegate": {
        "isDefaultGateway": true
      }
    }
  net-conf.json: |
    {
      "Network": "10.244.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }
    }
--- 
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: kube-flannel-ds
  labels:
    tier: node
    app: flannel
    iface: eth0
spec:
  template:
    metadata:
      labels:
        tier: node
        app: flannel
        iface: eth0
    spec:
      hostNetwork: true
      nodeSelector:
        beta.kubernetes.io/arch: amd64
        iface: eth0
      serviceAccountName: flannel
      containers:
      - name: kube-flannel
        image: quay.io/coreos/flannel:v0.7.0-amd64
        command: [ "/opt/bin/flanneld", "--ip-masq", "--kube-subnet-mgr", "--iface=eth0" ]
        securityContext:
          privileged: true
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        volumeMounts:
        - name: run
          mountPath: /run
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      - name: install-cni
        image: quay.io/coreos/flannel:v0.7.0-amd64
        command: [ "/bin/sh", "-c", "set -e -x; cp -f /etc/kube-flannel/cni-conf.json /etc/cni/net.d/10-flannel.conf; while true; do sleep 3600; done" ]
        volumeMounts:
        - name: cni
          mountPath: /etc/cni/net.d
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      volumes:
        - name: run
          hostPath:
            path: /run
        - name: cni
          hostPath:
            path: /etc/cni/net.d
        - name: flannel-cfg
          configMap:
            name: kube-flannel-cfg
---
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: kube-gpu-flannel-ds
  labels:
    tier: node
    app: flannel
    iface: p2p1
spec:
  template:
    metadata:
      labels:
        tier: node
        app: flannel
        iface: p2p1
    spec:
      hostNetwork: true
      nodeSelector:
        beta.kubernetes.io/arch: amd64
        iface: p2p1
      serviceAccountName: flannel
      containers:
      - name: kube-flannel
        image: quay.io/coreos/flannel:v0.7.0-amd64
        command: [ "/opt/bin/flanneld", "--ip-masq", "--kube-subnet-mgr", "--iface=p2p1" ]
        securityContext:
          privileged: true
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        volumeMounts:
        - name: run
          mountPath: /run
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      - name: install-cni
        image: quay.io/coreos/flannel:v0.7.0-amd64
        command: [ "/bin/sh", "-c", "set -e -x; cp -f /etc/kube-flannel/cni-conf.json /etc/cni/net.d/10-flannel.conf; while true; do sleep 3600; done" ]
        volumeMounts:
        - name: cni
          mountPath: /etc/cni/net.d
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      volumes:
        - name: run
          hostPath:
            path: /run
        - name: cni
          hostPath:
            path: /etc/cni/net.d
        - name: flannel-cfg
          configMap:
            name: kube-flannel-cfg

如果您需要有关容器命令的更高级逻辑,我可以建议 2 个选项。

  1. 基于 quay.io/coreos/flannel:v0.7.0-amd64 构建自定义 docker 图像并添加执行逻辑的脚本(例如,基于 ifconfig | grep p2p1 的输出)。使用脚本作为容器命令(在 Dockerfile 或 POD 规范中指定)。

  2. 也可以将相同的脚本放入 ConfigMap 并安装到容器中,就像您已经使用 flannel 配置一样。然后你可以更改容器的 command 来执行这个脚本。示例命令:["/bin/sh", "/etc/kube-flannel/entrypoint.sh"]

在我看来,选项 2 似乎更简单、更灵活。