首页 > 解决方案 > Kubernetes - 将负载均衡的公共 IP 作为环境变量传递到 Pod

问题描述

要旨

我有一个ConfigMap为我的 pod 提供必要的环境变量:

apiVersion: v1
kind: ConfigMap
metadata:
  name: global-config
data:
  NODE_ENV: prod
  LEVEL: info

  # I need to set API_URL to the public IP address of the Load Balancer
  API_URL: http://<SOME IP>:3000

  DATABASE_URL: mongodb://database:27017
  SOME_SERVICE_HOST: some-service:3000

我在 Google Cloud 上运行我的 Kubernetes 集群,因此它会自动为我的服务创建一个公共端点:

apiVersion: v1
kind: Service
metadata:
  name: gateway
spec:
  selector:
    app: gateway
  ports:
    - name: http
      port: 3000
      targetPort: 3000
      nodePort: 30000
  type: LoadBalancer

问题

我有一个 Web 应用程序需要从客户端的浏览器向gateway服务发出 HTTP 请求。但是为了向外部服务发出请求,Web 应用程序需要知道它的 IP 地址。

因此,我设置了 pod,它以某种方式为 Web 应用程序提供服务,它获取一个环境变量“ API_URL”,结果向这个 url 发出所有 HTTP 请求。

所以我只需要一种方法将API_URL环境变量设置为gateway服务的公共 IP 地址,以便在它启动时将其传递到 Pod 中。

标签: kubernetesgoogle-cloud-platformenvironment-variablesgoogle-kubernetes-engine

解决方案


我知道这不是您想要的确切方法,但我发现创建静态 IP 地址并明确传递它往往更容易使用。

首先,创建一个静态 IP 地址:

gcloud compute addresses create gke-ip --region <region>

您的 GKE 集群所在region的 GCP 区域在哪里。

然后,您可以通过以下方式获取新 IP 地址:

gcloud compute addresses describe gke-ip --region <region>

现在,您可以通过指定显式的loadBalancerIP. 1

apiVersion: v1
kind: Service
metadata:
  name: gateway
spec:
  selector:
    app: gateway
  ports:
    - name: http
      port: 3000
      targetPort: 3000
      nodePort: 30000
  type: LoadBalancer
  loadBalancerIP: "1.2.3.4"

此时,您也可以将其硬编码到您的中ConfigMap,而不必担心从集群本身中获取值。

1如果您已经创建了LoadBalancer具有自动分配 IP 地址的 IP 地址,则设置 IP 地址不会更改底层 GCP 负载平衡器的 IP。相反,您应该删除LoadBalancer集群中的服务,等待大约 15 分钟以清理底层 GCP 资源,然后LoadBalancer使用显式 IP 地址重新创建。


推荐阅读