Kubernetes: is there any way to get headless service endpoint info in container environment vars

10/18/2021

I used Cloud Foundry a lot previously, when an app is bind with a service, all the service connection info will be injected into app's environment variables. In Kubernetes world, I think this is same for normal service. For me, I try to use headless service to describe an external PostgreSQL using below service yaml.

---
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

After deploy the headless service to cluster, the container does not has any environment variables for that, I guess it is because the ClusterIP = None. The apps can use postgresql:5432 to access by DNS, but I just wonder why Kubernetes does not inject the headless service and its endpoints into the app's environment variable, so the app can get both ip and port from it? Is there any way to do so?

Thanks!

-- George Lu
kubernetes

2 Answers

10/18/2021

The Kube-proxy does not manage HeadLess Service, a request made to theses service is only forwarded to the it. Kubernetes does not really aknowledge theses endpoints (cf https://kubernetes.io/docs/concepts/services-networking/service/#headless-services).

To pass the IP of your postgreSQL DB, you will have to add a environment variable in your deployment, like this:

env:
- name: POSTGRESQL_ADDR
  value: "10.29.0.123:5432"
-- Popopame
Source: StackOverflow

11/2/2021

I found the answer to the question. For a headless service, the service info will not be shown in pod's environment variables. If service info is to be available in the environment var, you need to use the service without selectors, simply remove the "clusterIP: None". The client pod can use both DNS and environment var for external service discovery.

-- George Lu
Source: StackOverflow