Внутренний сокет Kubernetes.подключение ввода-вывода

#kubernetes #websocket

#kubernetes #websocket

Вопрос:

Я следую этой архитектуре изображений из K8s

введите описание изображения здесь

Однако, похоже, я не могу подключиться к сокету.сервер ввода-вывода из кластера с использованием имени службы

Текущая ситуация:

Из модуля B

  • Можно напрямую подключаться к модулю приложения A с помощью WS ( ws: // 10.10.10.1:3000) ✅
  • Может подключаться к приложению сервиса по протоколу HTTP ( http://orders:8000 ) ✅
  • Не удается подключиться к службе приложения A с помощью WS ( ws://orders:8000)

Из внешнего мира / Интернета

  • Можно подключиться к службе приложения A с помощью WS ( ws:// my-external-ip/orders) ✅ // используя traefik для маршрутизации my-external-ip/orders на заказы на обслуживание: 8000
  • Может подключаться к службе приложения A с помощью HTTP ( http://my-external-ip/orders ) ✅ // использование traefik для маршрутизации my-external-ip/заказов на обслуживание заказов: 8000

Моя текущая конфигурация службы

 spec:
  ports:
    - name: http
      protocol: TCP
      port: 8000
      targetPort: 3000
  selector:
    app: orders
  clusterIP: 172.20.115.234
  type: ClusterIP
  sessionAffinity: None
 

Моя схема управления входом

 apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: {{ template "app.name" $ }}-backend
  annotations:
    kubernetes.io/ingress.class: traefik
    ingress.kubernetes.io/auth-type: forward
    ingress.kubernetes.io/auth-url: "http://auth.default.svc.cluster.local:8000/api/v1/oauth2/auth"
    ingress.kubernetes.io/auth-response-headers: authorization
  labels:
    {{- include "api-gw.labels" $ | indent 4 }}
spec:
  rules:
    - host: {{ .Values.deploy.host | quote }}
      http:
        paths:
          - path: /socket/events
            backend:
              serviceName: orders
              servicePort: 8000
 

Схема управления моей службой

 apiVersion: v1
kind: Service
metadata:
  name: {{ template "app.name" . }}
spec:
  {{ if not $isDebug -}}
  selector:
    app: {{ template "app.name" . }}
  {{ end -}}
  type: NodePort
  ports:
  - name: http
    port: {{ template "app.svc.port" . }}
    targetPort: {{ template "app.port" . }}
    nodePort: {{ .Values.service.exposedPort }}
    protocol: TCP



# Helpers..
# {{/* vim: set filetype=mustache: */}}
# {{- define "app.name" -}}
#     {{ default "default" .Chart.Name }}
# {{- end -}}

# {{- define "app.port" -}}
# 3000
# {{- end -}}

# {{- define "app.svc.port" -}}
# 8000
# {{- end -}}
 

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

1. Возможно, это как-то связано с циклической балансировкой нагрузки. Попробуйте воссоздать службу с clusterIP: None помощью, таким образом, она будет предоставлять IP-адреса конечных точек службы вместо IP-адресов одного кластера.

2. Не могли бы вы предоставить полные yamls для служб и развертываний / модулей, включая поля metadata kind и api ?

3. Также неплохо было бы настроить конфигурацию для входа (для сравнения).

4. @BeWu Я только что обновил эту информацию

5. @akop Я обновил эту информацию

Ответ №1:

DNS-имя служб должно быть задано в вашем контейнере для доступа к его VIP-адресу. Kubernetes автоматически устанавливает переменные среды во всех модулях, которые имеют тот же селектор, что и служба.

В вашем случае все модули с селектором A имеют переменные среды, установленные в них при развертывании контейнера, которые содержат службы VIP и PORT.

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

Вот документация k8s, связанная с вашей проблемой.

Чтобы решить эту проблему, вы можете настроить службу DNS, которую k8s предлагает в качестве дополнения к кластеру. Просто следуйте документации.