Можно ли узнать, является ли узел, на котором запланирован Pod Kubernetes, основным или рабочим? - PullRequest
2 голосов
/ 27 мая 2019

В настоящее время я использую Kubernetes для планирования DaemonSet на главном и рабочем узлах.

Определение DaemonSet одинаково для обоих типов узлов (одно и то же изображение, одинаковые тома и т. Д.), Единственное отличие состоит в том, что при выполнении точки входа мне нужно написать другой файл конфигурации (который создается вPython с некоторыми динамическими значениями), если узел является мастером или рабочим.

В настоящее время, чтобы преодолеть это, я использую два разных определения DaemonSet со значением env, которое сообщает, является ли узел мастером или нет.Вот файл yaml (только соответствующие части):

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: worker-ds
  namespace: kube-system
  labels:
    k8s-app: worker
spec:
  ...
    spec:
      hostNetwork: true
      containers:
        - name: my-image
          ...
          env:
            - name: NODE_IP
              valueFrom:
                fieldRef:
                  fieldPath: status.hostIP
            - name: IS_MASTER
              value: "false"
      ...
---
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: master-ds
  namespace: kube-system
  labels:
    k8s-app: master
spec:
  ...
    spec:
      hostNetwork: true
      nodeSelector:
        node-role.kubernetes.io/master: ""
      tolerations:
      - key: node-role.kubernetes.io/master
        operator: Exists
        effect: NoSchedule
      containers:
        - name: my-image
          ...
          env:
            - name: NODE_IP
              valueFrom:
                fieldRef:
                  fieldPath: status.hostIP
            - name: IS_MASTER
              value: "true"
      ...

Однако, поскольку единственное отличие - это значение IS_MASTER , я хочу свернуть оба определения в одном, которое программно понимаетесли текущий узел, на котором запланирован модуль, является мастером или рабочим.

Есть ли способ узнать эту информацию об узле программным путем (даже читая файл конфигурации [например, что-то, что имеет только мастер)или наоборот) в узле или что-то подобное)?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 28 мая 2019

К сожалению, нет удобного способа доступа к информации об узле в модуле.

Если вам нужно только одно определение DaemonSet, вы можете добавить контейнер sidecar к вашему модулю, контейнер sidecar может получить доступ к API k8s , а затем к вашему основному контейнеру.может получить что-то полезное от sidecar.

Кстати, я думаю, что ваше текущее решение правильно:)

1 голос
/ 27 мая 2019

Вы можете сказать, что узел является ведущим, если у него есть метка node-role.kubernetes.io/master: "".Что вам нужно сделать, так это получить доступ к этой метке из ваших контейнеров, что можно сделать с помощью Downward Api ( Редактировать: Неверно, только информация о Pod может быть доступна из Downward Api ).Вы можете смонтировать метки внутри ваших контейнеров, используя:

volumes:
    - name: podinfo
      downwardAPI:
        items:
          - path: "labels"
            fieldRef:
              fieldPath: metadata.labels

Затем вы можете искать содержимое этого файла внутри контейнера.

...