#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 предлагает в качестве дополнения к кластеру. Просто следуйте документации.