1

我正在将我的应用程序从 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 容器时,同样的工作正常 - 我能够连接到在我的机器上运行的 rabbit mq 实例的端口 5672。

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

4

2 回答 2

2

您正在为 pod 和服务公开端口 80。然后你在端口 5672 上卷曲。

要么暴露 pod 的 5672 端口并直接 curl ,要么暴露服务的 5672 端口并在 pod 上保留 80 端口,并在服务的 5672 端口上 curl。

这将是如何击中吊舱的高级“草图”:

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

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

现在您不能让一项服务同时进行两种转发。每个 pod 需要一个服务。可以是一个部署,也可以是一组 pod,但它们需要在同一个端口上提供服务。

于 2018-11-22T15:29:06.883 回答
2

如果我了解设置:

  • 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 文档中没有选择器的服务。我已经将此设置与 Cassandra 集群一起使用,其中 Cassandra 节点的 IP 都被列为addresses.

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

于 2018-11-23T15:51:04.213 回答