Доступ Kubernetes к порту на узле изнутри модуля?

#kubernetes

Вопрос:

Я пытаюсь получить доступ к службе, прослушивающей порт, запущенный на каждом узле в моем кластере «голый металл» (Ubuntu 20.04), изнутри модуля. Я могу использовать реальный IP-адрес одного из узлов, и это работает. Однако мне нужны модули для подключения к порту на их собственном узле. Я не могу использовать «127.0.0.1» внутри модуля.

Дополнительная информация: Я пытаюсь объединить множество существующих сервисов в k8s. Мы используем старую версию Consul для обнаружения служб и запускаем ее на каждом узле, предоставляющем DNS на 8600. Я понял, как отредактировать основной файл coredns, чтобы добавить блок consul {}, поэтому поиск .consul работает.

 consul {
    errors
    cache 30
    forward . 157.90.123.123:8600
}
 

Однако мне нужно заменить этот IP-адрес на «адрес узла, на котором работает модуль coredns».

Есть какие-нибудь идеи? Или другие способы решения этой проблемы? Техас.

Комментарии:

1. Вы уже знаете о fieldRef of status.hostIP как о env-var (я думаю, вы также можете смонтировать нисходящий API в качестве тома, если это проще)?

2. Техас. Это может сработать. Похоже, что coredns расширит параметры в основном файле: coredns.io/manual/configuration

Ответ №1:

Комментарий от @mdaniel сработал. Техас.

Отредактируйте развертывание coredns. Добавьте это в контейнер после установки объемов:

 env:
- name: K8S_NODE_IP
  valueFrom:
    fieldRef:
      fieldPath: status.hostIP
 

Отредактируйте карту конфигурации coredns. Добавить в нижнюю часть основного файла:

 consul {
    errors
    cache 30
    forward . {$K8S_NODE_IP}:8600
}
 

Проверьте, работает ли DNS

 kubectl run tmp-shell --rm -i --tty --image nicolaka/netshoot -- /bin/bash
nslookup myservice.service.consul
nslookup www.google.com
exit