разрешение имени модуля / контейнера не работает вне контейнеров

#kubernetes

#kubernetes

Вопрос:

Я могу преобразовать имена модулей в ip-адреса внутри соответствующих контейнеров, например, если у меня вызван модуль elasticsearch-0 и я вхожу в контейнер через kubectl exec -it elasticsearch-0 bash , я могу сделать следующее:

 curl elasticsearch-0:9200
  

и получите ответ:

 {
  "name" : "OUvCoFL",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "1Vhf2-pGR0m3e4ezDRAZ0Q",
  "version" : {
    "number" : "6.1.0",
    "build_hash" : "c0c1ba0",
    "build_date" : "2017-12-12T12:32:54.550Z",
    "build_snapshot" : false,
    "lucene_version" : "7.1.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}
  

Однако, если я попытаюсь сделать это из другого контейнера, например, kibana-0, произойдет сбой с:

curl: (6) Could not resolve host: elasticsearch-0; Name or service not known

Кто-нибудь знает, чего мне не хватает?

Спасибо

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

1. У вас есть служба на месте?

2. curl elasticsearch-0:9200 работал внутри этого контейнера. Потому что HOSTNAME этим контейнером является elasticsearch. Мы должны использовать во всех контейнерах (across pods) service . Для соединения между контейнерами (в одном модуле) мы можем использовать localhost для подключения.

Ответ №1:

Служба — это то, что вы ищете. Читать это

Модули могут быть настроены для взаимодействия со службой и знать, что обмен данными со службой будет автоматически распределен с балансировкой нагрузки на некоторый модуль, являющийся членом Службы.

Создайте службу:

 apiVersion: v1
kind: Service
metadata:
  name: elasticsearch
  labels:
    app: elasticsearch
spec:
  ports:
  - port: 9200
    protocol: TCP
  selector:
    app: elasticsearch
  

И получить доступ к сервису из любого модуля

curl http://elasticsearch:9200