Skip to content

Deliver HAProxy config via writable emptyDir so #PUBLIC_IP substitution works (v1.3.3)#521

Merged
bsuh merged 1 commit into
mainfrom
pr521
Jun 30, 2026
Merged

Deliver HAProxy config via writable emptyDir so #PUBLIC_IP substitution works (v1.3.3)#521
bsuh merged 1 commit into
mainfrom
pr521

Conversation

@bsuh

@bsuh bsuh commented Jun 30, 2026

Copy link
Copy Markdown
Contributor

Since #483 mounted haproxy.cfg directly from a ConfigMap, the container
entrypoint (set_public_ip_and_start.sh) could no longer rewrite the config:
ConfigMap volumes (and subPath file mounts) are always mounted read-only by
the kubelet regardless of the readOnly flag, so its in-place

sed -i 's/#PUBLIC_IP/tcp-request connection set-dst ipv4($PUBLIC_IP)/g'

failed with 'Resource busy' / read-only filesystem. The #PUBLIC_IP placeholders
were left untouched, HAProxy never set the destination address, and it
advertised each pod's private IP to WhatsApp instead of the public egress IP
(observed server-side as 'proxy IP address is unexpected: 10.0.x.x').

Fix, chart-only (no image rebuild):

  • Mount the ConfigMap read-only at a side path (/haproxy-config-src).
  • Mount a writable emptyDir at the canonical /usr/local/etc/haproxy.
  • An initContainer seeds the emptyDir with the image defaults (preserving
    errors/) and overlays the ConfigMap haproxy.cfg.

The entrypoint can now edit haproxy.cfg in place at its normal location, so the
config stays inspectable via the usual path and HAProxy advertises the real
public IP again. Bump chart version to 1.3.3.

…on works (v1.3.3)

Since #483 mounted haproxy.cfg directly from a ConfigMap, the container
entrypoint (set_public_ip_and_start.sh) could no longer rewrite the config:
ConfigMap volumes (and subPath file mounts) are always mounted read-only by
the kubelet regardless of the readOnly flag, so its in-place

    sed -i 's/#PUBLIC_IP/tcp-request connection set-dst ipv4($PUBLIC_IP)/g'

failed with 'Resource busy' / read-only filesystem. The #PUBLIC_IP placeholders
were left untouched, HAProxy never set the destination address, and it
advertised each pod's private IP to WhatsApp instead of the public egress IP
(observed server-side as 'proxy IP address is unexpected: 10.0.x.x').

Fix, chart-only (no image rebuild):
- Mount the ConfigMap read-only at a side path (/haproxy-config-src).
- Mount a writable emptyDir at the canonical /usr/local/etc/haproxy.
- An initContainer seeds the emptyDir with the image defaults (preserving
  errors/) and overlays the ConfigMap haproxy.cfg.

The entrypoint can now edit haproxy.cfg in place at its normal location, so the
config stays inspectable via the usual path and HAProxy advertises the real
public IP again. Bump chart version to 1.3.3.
@meta-cla meta-cla Bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Jun 30, 2026
@bsuh bsuh requested a review from jaltenmueller June 30, 2026 03:53
@bsuh bsuh merged commit 140635a into main Jun 30, 2026
5 checks passed
@bsuh bsuh deleted the pr521 branch June 30, 2026 16:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants