【问题标题】:Kubernetes: is there any way to get headless service endpoint info in container environment varsKubernetes:有没有办法在容器环境变量中获取无头服务端点信息
【发布时间】:2021-11-02 17:24:35
【问题描述】:

我之前经常使用 Cloud Foundry,当一个应用程序与一个服务绑定时,所有的服务连接信息都会被注入到应用程序的环境变量中。在 Kubernetes 世界中,我认为这对于普通服务来说是一样的。 对我来说,我尝试使用无头服务来描述使用以下服务 yaml 的外部 PostgreSQL。

---
kind: "Service"
apiVersion: "v1"
metadata:
  name: "postgresql"
spec:
  clusterIP: None
  ports:
    - protocol: "TCP"
      port: 5432
      targetPort: 5432
      nodePort: 0
---
kind: "Endpoints"
apiVersion: "v1"
metadata:
  name: "postgresql"
subsets:
  -
    addresses:
      - ip: "10.29.0.123"
    ports:
      - port: 5432

将无头服务部署到集群后,容器没有任何环境变量,我猜是因为ClusterIP = None。 应用程序可以使用 postgresql:5432 通过 DNS 访问,但我只是想知道为什么 Kubernetes 不将无头服务及其端点注入应用程序的环境变量,因此应用程序可以从中获取 ip 和端口? 有什么办法吗?

谢谢!

【问题讨论】:

  • 你有什么理由使用无头服务?除非你知道你在做什么(在这种情况下你不会问这个问题 IMO),你最好使用普通的 ClusterIP 服务。
  • 如果我对外部 PostgreSQL 使用普通的 ClusterIP 服务,Kubernetes 也会转发流量吗?

标签: kubernetes


【解决方案1】:

Kube-proxy 不管理 HeadLess Service,对这些服务的请求仅转发给它。 Kubernetes 并不真正了解这些端点 (cf https://kubernetes.io/docs/concepts/services-networking/service/#headless-services)。

要传递您的 postgreSQL DB 的 IP,您必须在部署中添加一个环境变量,如下所示:

env:
- name: POSTGRESQL_ADDR
  value: "10.29.0.123:5432"

【讨论】:

  • 这样的环境应该在部署的时候就确定了吧?我想做的是让部署的应用程序在环境变量中发现外部 PostgreSQL。我希望 Kubernetes 可以将 PG 连接信息注入到应用程序的环境变量中。
  • 可以,您只需要在部署之前使用正确的变量配置 yaml 清单,或者在部署应用之前使用模板工具(helm、kustomize)设置这些变量。
【解决方案2】:

我找到了问题的答案。对于无头服务,服务信息不会显示在 pod 的环境变量中。如果要在环境变量中提供服务信息,则需要使用不带选择器的服务,只需删除“clusterIP:无”即可。 客户端 pod 可以使用 DNS 和环境变量进行外部服务发现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 2019-08-14
    • 2013-05-10
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多