0

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

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

这是我的 Pod 在云中的样子

   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

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

4

1 回答 1

1

要在两个 pod 之间进行通信,您应该使用service具有端口类型的资源,ClusterPort因为它们位于同一个集群中。

根据 的输出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,则在应用此解决方案时需要考虑这一点。

于 2018-02-24T03:01:29.237 回答