Можно ли узнать, является ли узел, на котором запланирован Pod Kubernetes, основным или рабочим?

В настоящее время я использую 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 ответа

Решение

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

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

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

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

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

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

Другие вопросы по тегам