Не удалось вызвать один сервис из другого сервиса, используя DNS для сервисов в kubernetes - PullRequest
0 голосов
/ 28 июня 2018

Я настроил кластер KPS AWS для Kubernetes, у меня есть несколько микросервисов, где в каждом приложении необходимо взаимодействовать друг с другом.

Сценарий: мое приложение ta2carbon пытается вызвать функцию в приложении ta1carbon через имя службы (dns).

Результат: происходит сбой с ошибкой тайм-аута при попытке подключения к порту 80 (но настроен порт -3000)

журнал консоли моего приложения nodejs, apiUrl: http://ta1carbon/api/app1/app1Func2

{ Error: connect ETIMEDOUT 100.66.7.165:80
    at Object._errnoException (util.js:992:11)
    at _exceptionWithHostPort (util.js:1014:20)
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1186:14)
  code: 'ETIMEDOUT',
  errno: 'ETIMEDOUT',
  syscall: 'connect',
  address: '100.66.7.165',
  port: 80 }

Те же журналы ошибок для curl, когда я пытался свернуть свое приложение ta1carbon внутри модуля ta2carbon.

root@ta2carbon-5fdcfb97cc-8j4nl:/home/appHome# curl -i http://ta1carbon/api/app1/app1Func2
curl: (7) Failed to connect to ta1carbon port 80: Connection timed out

но мой определенный порт в service.yaml 3000, а не 80! ниже приведены конфигурации yml для обслуживания обоих микросервисов.

ta1carbon service yaml

apiVersion: v1
kind: Service
metadata:
  name: ta1carbon
  labels:
    app: ta1carbon
spec:
  ports:
  - port: 3000
    targetPort: 3000
  type: ClusterIP
  selector:
    app: ta1carbon

ta2carbon service yaml

apiVersion: v1
kind: Service
metadata:
  name: ta2carbon
  labels:
    app: ta2carbon
spec:
  ports:
  - port: 3001
    targetPort: 3001
  type: ClusterIP
  selector:
    app: ta2carbon

А ниже приведено подробное описание услуг для ta1carbon и ta2 carbon.

kubectl describe service ta1carbon
Name:              ta1carbon
Namespace:         default
Labels:            app=ta1carbon
Annotations:       <none>
Selector:          app=ta1carbon
Type:              ClusterIP
IP:                100.66.7.165
Port:              <unset>  3000/TCP
TargetPort:        3000/TCP
Endpoints:         100.96.1.13:3000
Session Affinity:  None
Events:            <none>

kubectl describe service ta2carbon
Name:              ta2carbon
Namespace:         default
Labels:            app=ta2carbon
Annotations:       <none>
Selector:          app=ta2carbon
Type:              ClusterIP
IP:                100.67.129.126
Port:              <unset>  3001/TCP
TargetPort:        3001/TCP
Endpoints:         100.96.1.12:3001
Session Affinity:  None
Events:            <none>

Итак, исходя из того, что я наблюдаю, для URL http://ta1carbon/api/app1/app1Func2 service dns ta1carbon разрешается в 100.67.24.69: 80 , что приводит к тайм-ауту.

, но, если я свернусь с 100.67.24.69: 3000 изнутри карбоновой капсулы, я получу ответ об успехе

Также, если я изменю свой сервис yaml - порт: 80 , разверну и протестирую снова, я получу успешный ответ

Я нахожу это поведение в Куберне довольно странным, не уверен, что я ошибаюсь или из-за окружающей среды.

Мой запрос -

почему он разрешает службу ta1carbon в значение 100.67.24.69:80 и время ожидания, когда порт должен был быть 3000!

Любой вклад в это будет высоко ценится. пожалуйста, дайте мне знать, чего в этом не хватает.

1 Ответ

0 голосов
/ 28 июня 2018

DNS разрешает имя домена в IP-адрес, а не IP-адрес + порт.

Существует два возможных решения:

  1. Измените исходный код приложения для отправки запросов API на http://ta1carbon:3000

  2. Установите port в вашем сервисе ta1carbon на 80.

Я рекомендую перейти к варианту 2. В этом сценарии вы используете преимущества сервисов Kubernetes. Kubernetes выставит службу на порту 80, но отправит запросы модулям, поддерживающим службу на порту 3000 (из-за targetPort: 3000).

...