Kubernetes pod не может подключиться к локальному экземпляру rabbit mq, работающему локально
Я перемещаю свое приложение из докера в kubernetes \ helm - и до сих пор я добился успеха, за исключением настройки входящих \ исходящих соединений.
Одна конкретная проблема, с которой я сталкиваюсь, заключается в том, что я не могу подключиться к экземпляру rabbitmq, работающему локально на моей машине в другом док-контейнере.
app-deployment.yaml:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: jks
labels:
app: myapp
spec:
replicas: 1
template:
metadata:
labels:
app: myapp
spec:
imagePullSecrets:
- name: ivsecret
containers:
- env:
- name: JOBQUEUE
value: jks_jobqueue
- name: PORT
value: "80"
image: repo.url
name: jks
ports:
- containerPort: 80
volumeMounts:
- name: config-vol
mountPath: /etc/sys0
volumes:
- name: config-vol
configMap:
name: config
restartPolicy: Always
------------
app-service.yaml:
apiVersion: v1
kind: Service
metadata:
name: jks
spec:
ports:
- name: "80"
port: 80
targetPort: 80
selector:
app: myapp
Я вижу ошибки в моем контейнере, жалуясь, что он не может подключиться к моей машине. Я попытался свернуться изнутри контейнера:
curl 10.2.10.122:5672
curl: (7) Failed to connect to 10.20.11.11 port 5672: Connection timed out
Но то же самое при развертывании в качестве док-контейнера работает нормально - и я могу подключиться к экземпляру rabbit mq, работающему на моей машине, через порт 5672.
Что-то, что я должен был бы сделать, чтобы установить соединение от модуля к моей локальной машине?
2 ответа
Если я понял настройку:
- Миникуб работает на локальной машине.
- rabbitmq также работает на локальной машине и прослушивает порт 5672.
- IP, на котором работает rabbitmq - 10.2.10.122 .
- приложение - jks - работает на миникубе.
Проблема в том, что из приложения jks невозможно подключиться к rabbitmq, правильно?
Один из способов заставить это работать - сначала создать Сервис без селектора:
apiVersion: "v1"
kind: "Service"
metadata:
name: "svc-external-rabbitmq"
spec:
ports:
- name: "rabbitmq"
protocol: "TCP"
port: 5672
targetPort: 5672
nodePort: 0
selector: {}
... затем создайте объект Endpoints для службы:
apiVersion: "v1"
kind: "Endpoints"
metadata:
name: "svc-external-rabbitmq"
subsets:
- addresses:
- ip: "10.2.10.122"
ports:
- name: "rabbitmq"
port: 5672
... тогда используйте имя сервиса - svc-external-rabbitmq
- в приложении jks для подключения к rabbitmq.
Для объяснения см. Сервисы без селекторов в документации Kubernetes. Я использовал эту настройку с кластером Cassandra, где IP-адреса узлов Cassandra были перечислены как addresses
,
РЕДАКТИРОВАТЬ: Обратите внимание, что в некоторых случаях служба типа ExternalName тоже может работать.
Вы выставляете порт 80 как для стручка, так и для сервиса. Тогда вы свернетесь на порт 5672.
Либо откройте порт 5672 модуля и закрутите его напрямую, либо откройте порт 5672 службы и оставьте порт 80 на модуле, а затем сверните порт 5672 службы.
Это был бы высокоуровневый "набросок" того, как поразить стручок:
you -curl-> service1(80:80) -> pod1(80)
you -curl-> service2(80:5672) -> pod2(5672)
Скажем, у вас есть две капсулы. Один из них обслуживает порт 80, а другой - порт 5672. Вы можете создать две службы; каждый из них нацелен на одну капсулу. Службы могут работать на порте 80 и отображать запросы на порты 80 и 5672 модулей.
Теперь вы не можете сделать один сервис для переадресации. Должен быть один сервис на стручок. Может быть развертыванием или группой модулей, но они должны обслуживать один и тот же порт.