Kubernetes-将负载平衡的公共IP作为环境变量传递到Pod

flo*_*olu 5 environment-variables google-cloud-platform kubernetes google-kubernetes-engine

要旨

我有一个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
Run Code Online (Sandbox Code Playgroud)

我正在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
Run Code Online (Sandbox Code Playgroud)

问题

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

因此,我设置了pod,该pod以某种方式为Web应用程序提供服务,它选择了一个环境变量“ API_URL”,从而使所有HTTP请求都对该URL进行了请求。

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

Mat*_*att 2

您正在尝试从客户端浏览器访问网关服务。

我想向您建议另一个解决方案,该解决方案与您当前正在尝试实现的方案略有不同,但它可以解决您的问题。

从你的问题我可以推断出你的网络应用程序和网关应用程序位于同一个集群上。

在我的解决方案中,您不需要 LoadBalancer 类型的服务,基本的 Ingress 足以使其工作。

您只需要创建一个 Service 对象(请注意该选项type: LoadBalancer现已消失)

apiVersion: v1
kind: Service
metadata:
name: gateway
spec:
selector:
  app: gateway
ports:
  - name: http
    port: 3000
    targetPort: 3000
    nodePort: 30000
Run Code Online (Sandbox Code Playgroud)

并且您还需要一个入口对象(请记住,需要将一个入口控制器部署到集群才能使其工作),如下所示:有关如何部署 Nginx 入口控制器的更多信息,您可以在此处找到,如果 您已经在使用一个(也许不同)那么你可以跳过这一步。

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: gateway-ingress
annotations:
  nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
  - host: gateway.foo.bar.com
    http:
      paths:
      - path: /
          backend:
            serviceName: gateway
            servicePort: 3000
Run Code Online (Sandbox Code Playgroud)

注意主机字段。

您需要对 Web 应用程序重复同样的操作。请记住使用适当的主机名(DNS 名称),例如对于 Web 应用程序:foo.bar.com和网关:gateway.foo.bar.com 然后仅使用gateway.foo.bar.comdns 名称从客户端 Web 浏览器连接到网关应用程序。

您还需要创建一个指向*.foo.bar.comIngress 公共 IP 地址的 dns 条目,因为 Ingress 控制器将创建自己的负载均衡器。

流量如下:

+-------------+   +---------+   +-----------------+   +---------------------+
| Web Browser |-->| Ingress |-->| gateway Service |-->| gateway application |
+-------------+   +---------+   +-----------------+   +---------------------+
Run Code Online (Sandbox Code Playgroud)

这种方法更好,因为它不会导致客户端浏览器中的跨源资源共享 (CORS) 问题。

我从 kubernetes 官方文档中获取了 Ingress 和服务清单的示例,并稍作修改。

您可以在此处找到有关 Ingress 的更多信息, 并在此处找到有关服务的更多信息