Skip to content

source/pod: skip internal-hostname pod when PodIP is empty#6382

Open
SAY-5 wants to merge 1 commit into
kubernetes-sigs:masterfrom
SAY-5:fix/pod-source-skip-empty-podip-6375
Open

source/pod: skip internal-hostname pod when PodIP is empty#6382
SAY-5 wants to merge 1 commit into
kubernetes-sigs:masterfrom
SAY-5:fix/pod-source-skip-empty-podip-6375

Conversation

@SAY-5
Copy link
Copy Markdown
Contributor

@SAY-5 SAY-5 commented Apr 21, 2026

Description

addInternalHostnameAnnotationEndpoints called endpoint.SuitableType(pod.Status.PodIP) and addToEndpointMap without first checking whether PodIP was empty. Pending / Scheduled pods carrying external-dns.alpha.kubernetes.io/internal-hostname emit a CNAME record whose target is the empty string (because SuitableType("") falls through to CNAME). Once the pod gets a PodIP and external-dns tries to write an A record at the same name, the provider rejects the update (A and CNAME cannot coexist), leaving the zone permanently stuck on the empty-target CNAME, the exact scenario the reporter hit on Azure Private DNS.

Fix

Skip the pod entirely when PodIP is empty. The pod will be reconciled again once the kubelet assigns an address.

Fixes

Fixes #6375

Checklist

  • Unit tests pass (go test ./source/...).
  • go build ./source/... clean.
  • gofmt clean.

Signed-off-by: SAY-5 SAY-5@users.noreply.github.com

addInternalHostnameAnnotationEndpoints called endpoint.SuitableType(pod.Status.PodIP)
and addToEndpointMap without first checking whether PodIP was empty.
Pending / Scheduled pods that carry external-dns.alpha.kubernetes.io/internal-hostname
ended up producing a CNAME record whose target was the empty string,
because SuitableType("") falls through to CNAME. Once the pod got a
PodIP and external-dns tried to write an A record at the same name,
the provider rejected the update (A and CNAME cannot coexist), leaving
the zone permanently stuck on the empty-target CNAME.

Skip the pod entirely when PodIP is empty. The pod will be reconciled
again once the kubelet assigns an address.

Fixes kubernetes-sigs#6375.

Signed-off-by: SAY-5 <SAY-5@users.noreply.github.com>
@k8s-ci-robot k8s-ci-robot added the do-not-merge/invalid-commit-message Indicates that a PR should not merge because it has an invalid commit message. label Apr 21, 2026
@k8s-ci-robot
Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by:
Once this PR has been reviewed and has the lgtm label, please assign szuecs for approval. For more information see the Code Review Process.

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@k8s-ci-robot
Copy link
Copy Markdown
Contributor

Welcome @SAY-5!

It looks like this is your first PR to kubernetes-sigs/external-dns 🎉. Please refer to our pull request process documentation to help your PR have a smooth ride to approval.

You will be prompted by a bot to use commands during the review process. Do not be afraid to follow the prompts! It is okay to experiment. Here is the bot commands documentation.

You can also check if kubernetes-sigs/external-dns has its own contribution guidelines.

You may want to refer to our testing guide if you run into trouble with your tests not passing.

If you are having difficulty getting your pull request seen, please follow the recommended escalation practices. Also, for tips and tricks in the contribution process you may want to read the Kubernetes contributor cheat sheet. We want to make sure your contribution gets all the attention it needs!

Thank you, and welcome to Kubernetes. 😃

@k8s-ci-robot k8s-ci-robot added the needs-ok-to-test Indicates a PR that requires an org member to verify it is safe to test. label Apr 21, 2026
@k8s-ci-robot
Copy link
Copy Markdown
Contributor

Hi @SAY-5. Thanks for your PR.

I'm waiting for a kubernetes-sigs member to verify that this patch is reasonable to test. If it is, they should reply with /ok-to-test on its own line. Until that is done, I will not automatically test new commits in this PR, but the usual testing commands by org members will still work.

Regular contributors should join the org to skip this step.

Once the patch is verified, the new status will be reflected by the ok-to-test label.

I understand the commands that are listed here.

Details

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@k8s-ci-robot k8s-ci-robot added size/S Denotes a PR that changes 10-29 lines, ignoring generated files. cncf-cla: yes Indicates the PR's author has signed the CNCF CLA. labels Apr 21, 2026
@k8s-ci-robot
Copy link
Copy Markdown
Contributor

Invalid commit message issues detected

Invalid commit messages

Keywords which can automatically close issues and hashtag(#) mentions are not allowed.

  • 6ae5f0e source/pod: skip internal-hostname pod when PodIP is empty

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. I understand the commands that are listed here.

Comment thread source/pod.go
Comment on lines +190 to +196
// Pods in Pending / Scheduled state without a PodIP must
// not emit an endpoint: endpoint.SuitableType("") returns
// CNAME, which would create a provider record whose target
// is the empty string. Once the pod eventually gets an IP
// external-dns then tries to create an A record at the
// same name and the provider rejects it because A and
// CNAME cannot coexist (#6375, #6199 on Azure / RFC2136).
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I don’t think this comment is necessary, as it’s already clear why we filter out pods without an IP. Endpoint shouldn't have an empty address.

Copy link
Copy Markdown
Contributor

@vflaux vflaux left a comment

Choose a reason for hiding this comment

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

pod.Status.PodIP is also used in addKopsDNSControllerEndpoints() and addPodSourceDomainEndpoints(). I think we need to filter there too.

Could you also add tests for those cases?

Copy link
Copy Markdown
Contributor

@vflaux vflaux left a comment

Choose a reason for hiding this comment

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

I'm surprised that an endpoint with an empty target is accepted by your provider, I would expect it to fail.

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

Labels

cncf-cla: yes Indicates the PR's author has signed the CNCF CLA. do-not-merge/invalid-commit-message Indicates that a PR should not merge because it has an invalid commit message. needs-ok-to-test Indicates a PR that requires an org member to verify it is safe to test. size/S Denotes a PR that changes 10-29 lines, ignoring generated files. source

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Pod source creates CNAME records with empty target when PodIP is not yet assigned

3 participants