2017-02-22 21 views
0

Как я могу определить одно определение DaemonSet, чтобы создать из него несколько разных элементов? То, что я имею в виду под разными стручками, это стручки, созданные из разных команд. В настоящее время я создаю два разных объекта DaemonSet для создания двух разных типов стручков.Как определить DaemonSet для создания немного разных контейнеров?

Позвольте мне рассказать вам подробности.

Я модифицировал kube-flannel.yml, особенно определение DaemonSet. Я хочу добавить «--iface =» в flanneld ["/ opt/bin/flanneld", "--ip-masq", "--kube-subnet-mgr"] и хочу использовать два разных ethernet интерфейсы на основе метки узла.

У меня есть три различных вида узлов: 1) мастер-узла с двумя Интерфейсы Ethernet: eth0 для внутренней сети и eth3 для внешней сети 2) подчиненных узлов с одним Интерфейсы Ethernet: eth0 для внутренней сети 3) недавно добавленный узел с одним интерфейсом Ethernet: p2p1 для внутренней сети

Когда у меня были 1) и 2), я был в порядке со следующей командой: ["/ opt/bin/flanneld", "--ip-masq "," --kube-subnet-mgr "," --iface = - eth0 "] Я должен добавить параметр -iface, потому что иначе фланель на главном узле автоматически обнаруживает eth3, отличный от eth0, , который является reaso n Я вручную добавляю опцию iface.

Теперь у меня есть 3), я должен сделать два определения DaemonSet с различными командами: [ "/ Opt/бен/flanneld", "--ip-MASQ", «--kube-подсети прил "," --iface = - eth0 "] для 1) и 2) , ["/opt/bin/flanneld "," --ip-masq "," --kube-subnet-mgr "," - -iface = - p2p1 "] для 3) Селектор меток используется для указания того, какой DaemonSet используется для узла. Полное определение прилагается в конце.

Есть ли более элегантный способ создания немного разных стручков из одного определения DaemonSet? Было бы неплохо иметь только одно определение с заполнителем, которое может быть заменено значением конкретной метки.

В противном случае я могу сделать это, установив фланель другим способом? Было бы неплохо, если бы мы могли предоставить список интерфейсов ethernet для опции -iface, но мой коллега обнаружил, что для опции -iface может быть предоставлен только один интерфейс/ip.

Спасибо.

--- 
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 
+0

Для просмотра обсуждения в группах Google перейдите по ссылке https://groups.google.com/forum/#!topic/kubernetes-users/F6GvfHoX7V4 – eastcirclek

ответ

0

Если вам нужна более сложная логика относительно команд контейнера, я могу предложить 2 варианта.

  1. Создание пользовательского Docker изображений на основе quay.io/coreos/flannel:v0.7.0-amd64 и добавить скрипт, который делает логику (например, основанную на выходе ifconfig | grep p2p1). Используйте сценарий в качестве команды контейнера (либо укажите это в файле Docker, либо в спецификации POD).

  2. Тот же сценарий также может быть включен в конфигурационную карту ConfigMap и установлен в контейнер так же, как вы уже делали это с помощью фланелевой конфигурации. Затем вы можете изменить command контейнера для выполнения этого скрипта.Пример команды: ["/bin/sh", "/etc/kube-flannel/entrypoint.sh"]

Вариант 2, кажется, проще и более гибким, на мой взгляд.