pods 如何与使用 Kubernetes 创建的集群中的其他 pod 通信

How do pods communicates with the other pod in a cluster created using Kubernetes

我在 aws 中使用 kops 创建了 1 个主节点和 1 个工作节点以及 2 个 pods。 在一个 pod 中,我有我的 oracle 数据库 运行ning,在另一个 pod 中,我部署了我的 java Web 应用程序。现在 运行 java Web 应用程序需要与数据库 pod 对话 为了在集群中的 2 pods 之间进行通信,我在我的 java 应用程序中配置了 pod 的 IP 地址。我能够使用云提供商 public URL 访问应用程序,在开发环境中一切都很好。但是在生产环境中,我无法在我的 java 应用程序 Pod 中继续配置数据库 Pod 的 IP 地址。

人们如何解决这个问题?你们是否使用 Pod 的 IP 地址与 kubernetes 中的其他 Pod 通信?或者 pods 之间还有其他通信方式吗?

这是我的 Pods 在云中的样子

   NAME                           READY     STATUS    RESTARTS   AGE       IP            NODE
csapp-8cd5d44556-7725f         1/1       Running   2          1d        100.96.1.54   ip-172-56-35-213.us-west-2.compute.internal
csdb-739d459467-92cmh          1/1       Running   0          1h        100.96.1.57   ip-172-27-86-213.us-west-2.compute.internal

有关此问题的任何帮助或指示都会有所帮助。

要在两个 pods 之间进行通信,您应该使用端口类型为 ClusterPortservice 资源,因为它们在同一个集群中。

根据 kubectl get pods 的输出,您有两层:

  • 应用层:csapp-8cd5d44556-7725f

  • 数据层:csdb-739d459467-92cmh

下面是数据层的 service 资源示例,以及它在应用程序层中的使用方式。

apiVersion: v1
kind: Service
metadata:
  name: example-data-tier
spec:
  selector:
    app: csdb # ⚠️Make sure of this, it should select the POD csdb-...
  ports:
    - name: redis
      protocol: TCP
      port: 6379
      # type (default is ClusterPort which is for internal)

并且在 App 层的 POD 中,您应该为环境变量提供来自上述服务的值:

apiVersion: v1
kind: Pod
spec:
  containers:
    - name: xx
      image: "xxx:v1"
      ports:
        - containerPort: 8080
          protocol: TCP
      env:
        - name: "REDIS_URL"
          value: "redis://$(EXAMPLE_DATA_TIER_SERVICE_HOST):$(EXAMPLE_DATA_TIER_SERVICE_PORT_REDIS)"

如果您的数据库不是 Redis,则在应用此解决方案时需要考虑到这一点。