Можно ли узнать, является ли узел, на котором запланирован 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
Затем вы можете искать содержимое этого файла из контейнера.