#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