Найдите IP-адрес конечной точки в k8s

#kubernetes

Вопрос:

Мне нужно создать yaml-дескриптор развертывания «A», в котором я могу найти IP-адрес конечной точки модуля (который принадлежит развертыванию «B») . Есть возможность использовать нисходящий API, но я не знаю, смогу ли я использовать его в этом случае.

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

1. почему бы не воспользоваться услугой?

2. @rohatgisanat Я использую сервис , но мне не нужен ClusterIP, мне нужен podIP.

3. можете ли вы объяснить, какого варианта использования вы пытаетесь достичь?

4. @rohatgisanat Я развернул nginx в своем кластере, и в моем кластере развернут еще один микросервис под названием «X». В этом микросервисе «X» в развертывании yml я указал следующее : — имена хостов: — test.api.com ip: 10.10..10.7 . Это работает правильно, но дело в том, что упомянутый ip-адрес (10.10..10.7) является ip-адресом модуля (конечной точки) моего nginx, развернутого в том же кластере. Если по какой-то причине nginx будет перезапущен, ip-адрес будет изменен. Есть ли какой-нибудь способ решить эту проблему?

Ответ №1:

Если я правильно понимаю, вы хотите сопоставить имя test.api.com хоста с IP-адресом определенного модуля.
Как справедливо отметил @whites11, вы можете использовать безголовые сервисы с селекторами:

Для безголовых служб, определяющих селекторы, контроллер конечных точек создает записи конечных точек в API и изменяет конфигурацию DNS для возврата записей (IP-адресов), которые указывают непосредственно на модули, поддерживающие Службу.

В этом случае может быть сложно правильно настроить /etc/hosts файл внутри модуля, но для достижения этой цели можно настроить DNS кластера Kubernetes.

Если вы используете CoreDNS в качестве DNS-сервера, вы можете настроить CoreDNS сопоставление одного домена ( test.api.com ) с другим доменом (DNS-имя безголовой службы), добавив rewrite правило.

Я приведу пример, чтобы проиллюстрировать, как это работает.


Во-первых, я подготовил образец web модуля с соответствующей web безголовой службой:

 # kubectl get pod,svc -o wide
NAME           READY   STATUS    RESTARTS   AGE   IP          NODE      NOMINATED NODE   READINESS GATES
pod/web        1/1     Running   0          66m   10.32.0.2   kworker   <none>           <none>

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE   SELECTOR
service/web          ClusterIP   None         <none>        80/TCP    65m   run=web
 

Мы можем проверить web , возвращает ли безголовый сервис запись (IP-адрес) , которая указывает непосредственно на web Модуль:

 # kubectl exec -i -t dnsutils -- nslookup web.default.svc
Server:         10.96.0.10
Address:        10.96.0.10#53

Name:   web.default.svc.cluster.local
Address: 10.32.0.2
 

Далее нам нужно настроить CoreDNS отображение test.api.com -> > web.default.svc.cluster.local .

Конфигурация CoreDNS хранится coredns ConfigMap в kube-system пространстве имен in. Вы можете отредактировать его с помощью:

 # kubectl edit cm coredns -n kube-system
 

Просто добавьте одно rewrite правило, как в примере ниже:

 apiVersion: v1
data:
  Corefile: |
    .:53 {
        errors
        health {
           lameduck 5s
        }
        rewrite name test.api.com web.default.svc.cluster.local # mapping test.api.com to web.default.svc.cluster.local
...
 

Чтобы перезагрузить ядра, мы можем удалить coredns модули ( coredns развертывается как развертывание, поэтому будут созданы новые модули).

Наконец, мы можем проверить, как это работает:

 # kubectl exec -i -t dnsutils -- nslookup test.api.com
Server:         10.96.0.10
Address:        10.96.0.10#53

Name:   test.api.com
Address: 10.32.0.2
 

Как вы можете видеть, test.api.com домен также возвращает IP-адрес web модуля.

Для получения дополнительной информации о rewrite плагине см. Документацию по перезаписи Coredns.

Ответ №2:

То, что вы ищете, — это Headless service (см. Документацию).

При использовании службы без головы у службы не будет собственного IP-адреса. Если вы укажете селектор для службы, служба DNS вернет IP-адрес модулей при запросе имени службы.

Цитирование документации:

Для безголовых служб, определяющих селекторы, контроллер конечных точек создает записи конечных точек в API и изменяет конфигурацию DNS для возврата записей (IP-адресов), которые указывают непосредственно на модули, поддерживающие Службу.

Чтобы создать службу без головы, просто установите .spec.clusterIP None значение «кому» и укажите селектор, как вы обычно делаете с традиционной службой.

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

1. спасибо @whites11 . Это работает правильно, но дело в том, что я не могу использовать его для нужной мне цели, потому что в развертывании «B» я хочу указать этот ip — адрес внутри /etc/хостов примерно так: ` — имена хостов: — test.api.com ip: «имя службы» ` и, к сожалению, мы не можем указать имя службы внутри IP-адреса /etc/hosts только в соответствующем.

2. Ну, вы никогда не сможете сделать это должным образом. Практически отсутствует контроль над тем, как IP-адреса назначаются блокам, и, таким образом, жесткое кодирование IP-адресов модулей в конечном итоге приведет к устареванию IP-адресов. Мое предложение состоит в том, чтобы как-то полагаться на внутреннюю службу DNS