Skip to content

Helm updates can lose dual HTTP3 port #982

Open
@ananace

Description

Welcome!

  • Yes, I've searched similar issues on GitHub and didn't find any.
  • Yes, I've searched similar issues on the Traefik community forum and didn't find any.

What version of the Traefik's Helm Chart are you using?

26.0.0

What version of Traefik are you using?

2.10.6

What did you do?

Installed the Helm chart with;

ports:
  websecure:
    http3:
      enabled: true
      advertisedPort: 443

This results in a Deployment configured as;

# ...
         ports:
# ...
         - containerPort: 8443
           name: websecure
           protocol: TCP
         - containerPort: 8443
           name: websecure-http3
           protocol: UDP

And a service like;

# ...
  ports:
# ...
  - name: websecure
    port: 443
    protocol: TCP
    targetPort: websecure
  - name: websecure-http3
    port: 443
    protocol: UDP
    targetPort: websecure-http3

What did you see instead?

This configuration unfortunately seems to run into kubernetes/kubernetes#105610 on helm upgrades, causing the two ports to merge into one - with the first websecure winning and removing the UDP port from existence.

The resulting deployment looks like;

# ...
        ports:
# ...
        - containerPort: 8000
          name: web
          protocol: TCP
        - containerPort: 8443
          name: websecure
          protocol: TCP

And the service ends up as;

# ...
  ports:
# ...
  - name: websecure
    port: 443
    protocol: TCP
    targetPort: websecure
  - name: websecure-http3    
    port: 443
    protocol: UDP
    targetPort: websecure-http3

This causes the incoming service traffic to fail as there's no websecure-http3 port to reference

What is your environment & configuration?

Bare-metal Kubernetes.
Traefik installed from Helm chart using FluxCD.

helm-controller: v0.31.1
kustomize-controller: v0.35.0
notification-controller: v0.33.0
source-controller: v0.36.0

Additional Information

To keep the deployment working for now, I've added a post-renderer which replaces the service definition for the HTTP3 port to point directly to the port number instead of referring to it by name.

As a note, the template that the Helm Chart renders is correct.
The issue is that Kubernetes API server unfortunately messes up the port list when applying upgrades - for at least certain setups, and since the service object the Helm chart renders refers to the ports by name this means that one of the HTTPS/HTTP3 ports ends up unable to be routed to. (Depending on which one gets lost by the API server merge)

Metadata

Assignees

No one assigned

    Labels

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions