0

如何定义 DaemonSet 的单个定义以创建稍微不同的 pod?我所说的不同 pod 是指从不同命令创建的 pod。我目前制作了两个不同的 DaemonSet 对象来创建两种不同类型的 pod。

让我告诉你细节。

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

我有三种不同类型的节点:1)具有两个以太网接口的主节点:用于内部网络的 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 定义创建略有不同的 pod?最好只有一个带有占位符的定义,可以用特定标签的值代替。

否则我可以通过以不同的方式设置法兰绒来做到这一点?如果我们可以将以太网接口列表提供给 --iface 选项,那就太好了,但我的同事发现只有一个接口/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
4

1 回答 1

0

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

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

  2. 相同的脚本也可以放在 ConfigMap 中并挂载到容器中,就像你在 flannel 配置中所做的那样。然后,您可以更改command容器以执行此脚本。示例命令:["/bin/sh", "/etc/kube-flannel/entrypoint.sh"]

在我看来,选项 2 似乎更容易、更灵活。

于 2017-02-22T17:21:15.560 回答