Skip to content

Conversation

@vlsi
Copy link
Contributor

@vlsi vlsi commented Oct 7, 2025

Replace LISTEN_ADDR (pod IP) with POD_DNS_NAME (DNS FQDN) for Patroni REST API and PostgreSQL connect addresses to enable stable addressing across pod restarts.

Changes:

  • Add POD_NAME, HEADLESS_SERVICE, and POD_DNS_NAME environment variables to Patroni StatefulSet pods
  • Create patroni-headless Service for DNS-based pod discovery
  • Update patroni.config.yaml to use ${POD_DNS_NAME} for pod_ip, connect_address (PostgreSQL), and connect_address (REST API)
  • Register patroni-headless service creation in reconciler

Reasons:

  • Pod IPs are ephemeral and change on restarts, causing connection issues
  • DNS names (pod-name.service.namespace.svc.cluster.local) are stable
  • Improves reliability of Patroni DCS registration and cluster communication
  • Aligns with Kubernetes best practices for StatefulSet networking

🤖 Generated with Claude Code

Replace LISTEN_ADDR (pod IP) with POD_DNS_NAME (DNS FQDN) for Patroni
REST API and PostgreSQL connect addresses to enable stable addressing
across pod restarts.

Changes:
- Add POD_NAME, HEADLESS_SERVICE, and POD_DNS_NAME environment variables
  to Patroni StatefulSet pods
- Create patroni-headless Service for DNS-based pod discovery
- Update patroni.config.yaml to use ${POD_DNS_NAME} for pod_ip,
  connect_address (PostgreSQL), and connect_address (REST API)
- Register patroni-headless service creation in reconciler

Reasons:
- Pod IPs are ephemeral and change on restarts, causing connection issues
- DNS names (pod-name.service.namespace.svc.cluster.local) are stable
- Improves reliability of Patroni DCS registration and cluster communication
- Aligns with Kubernetes best practices for StatefulSet networking

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
@vlsi vlsi marked this pull request as ready for review October 9, 2025 17:00
role_label: pgtype
scope_label: app
pod_ip: ${LISTEN_ADDR}
pod_ip: ${POD_DNS_NAME}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tbh, I'm not sure about this change

I've checked all patroni-related projects (spilo, postgres-operator from Zalando), and they are using pod status.podIP everywhere:

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In my kubernetes environment, "pod ip" is like fd07:b51a:cc66:a::17f 192.168.194.10

How do you think it would work?

For instance, connect_address: ${LISTEN_ADDR}:8008 becomes connect_address: fd07:b51a:cc66:a::17f 192.168.194.10:8008 which is definitely not workable.


Both ChatGPT and Claude suggest stable pod dns names should be used for Patroni on Kubernetes.
E.g. https://chatgpt.com/share/68ecb326-44e4-800f-a125-a7a8cae96bd0

Copy link
Member

@mrMigles mrMigles Oct 14, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@vlsi
first of all, could you please provide environment/confirmation when you have migrated previous version of podIp based version to headless dns name? Have you performed integrations tests there?

Then, what I'm worried about and need to double check: you've modified kubernetes.pod_ip that with use_endpoints: true is used for preparing subsets.addresses.ip on endpoints that must be IP I suppose.
https://github.com/patroni/patroni/blob/v4.1.0/patroni/dcs/kubernetes.py#L1122
That's my HL analysis and I'm sure that should work with dns names and has IP resolving, but that's why I cannot apply it w/o confirmation of correct upgrade case.
Please correct me If I'm wrong

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants