Kubernetes Pod无法连接到本地运行的Rabbit MQ实例

时间:2018-11-22 14:48:56

标签: kubernetes minikube kubernetes-helm kubernetes-pod

我正在将应用程序从docker迁移到kubernetes \ helm-到目前为止,除了设置传入\传出连接之外,我都已经成功了。

我面临的一个特殊问题是,我无法连接到在另一个Docker容器上的计算机上本地运行的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

但是当我作为docker容器部署时也可以正常工作-并且我能够通过端口5672连接到在我的机器上运行的Rabbit mq实例。

我需要做些什么来建立从Pod到我的本地计算机的连接吗?

2 个答案:

答案 0 :(得分:2)

您要同时暴露Pod和服务的端口80。然后卷曲在端口5672上。

或者暴露容器的端口5672并将其直接卷曲,或者暴露服务的端口5672并将端口80保持在容器上,并卷曲服务的端口5672。

这是如何击中豆荚的高级“草图”:

you -curl-> service1(80:80) -> pod1(80)
you -curl-> service2(80:5672) -> pod2(5672)

所以说你有两个豆荚。其中一个在端口80上提供服务,另一个在端口5672上提供服务。它们每个都针对一个吊舱。这些服务可以在端口80上运行,并将请求映射到Pod的端口80和5672。

现在,您无法提供一项服务来进行这两种转发。每个吊舱需要一项服务。可以是一个部署,也可以是一组Pod,但是它们需要在同一端口上服务。

答案 1 :(得分:1)

如果我了解设置:

  • minikube在本地计算机上运行。
  • rabbitmq也正在本地计算机上运行,​​并且正在侦听端口5672。
  • rabbitmq运行的IP是10.2.10.122。
  • 一个应用程序-jks-在minikube上运行。

问题是无法从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

...然后在jks应用程序中使用服务名称-svc-external-rabbitmq-连接到Rabbitmq。

有关说明,请参见Kubernetes文档中的Services without selectors。我已将此设置与Cassandra群集一起使用,其中Cassandra节点的IP全部列为addresses

编辑:请注意,在某些情况下,类型为ExternalName的服务也可以工作。