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 модулей.

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

Другие вопросы по тегам