Skip to content

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

Open
SAY-5 wants to merge 2 commits 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 2 commits 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

@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
Comment thread source/pod.go Outdated
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.

@SAY-5
Copy link
Copy Markdown
Contributor Author

SAY-5 commented May 19, 2026

Good catch. Added the same empty-PodIP guard to addKopsDNSControllerEndpoints and addPodSourceDomainEndpoints, and dropped the now-redundant comment block in addInternalHostnameAnnotationEndpoints. Also added two table-test cases covering the kops and pod-source-domain paths with a pod that has no PodIP.

@k8s-ci-robot k8s-ci-robot added needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. size/M Denotes a PR that changes 30-99 lines, ignoring generated files. and removed size/S Denotes a PR that changes 10-29 lines, ignoring generated files. needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. labels May 19, 2026
SAY-5 added 2 commits May 19, 2026 00:24
addInternalHostnameAnnotationEndpoints called endpoint.SuitableType(pod.Status.PodIP)
and addToEndpointMap without first checking whether PodIP was empty.
Pending or 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 on an empty string 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.

Ref: kubernetes-sigs#6375

Signed-off-by: SAY-5 <SAY-5@users.noreply.github.com>
…mpty

Apply the same empty-PodIP guard to addKopsDNSControllerEndpoints and
addPodSourceDomainEndpoints so kops-dns-controller and pod-source-domain
pods without an assigned address do not emit empty-target CNAME records.

Signed-off-by: SAY-5 <SAY-5@users.noreply.github.com>
@SAY-5 SAY-5 force-pushed the fix/pod-source-skip-empty-podip-6375 branch from bad3cf5 to 3115d27 Compare May 19, 2026 07:25
@k8s-ci-robot k8s-ci-robot removed the do-not-merge/invalid-commit-message Indicates that a PR should not merge because it has an invalid commit message. label May 19, 2026
@SAY-5
Copy link
Copy Markdown
Contributor Author

SAY-5 commented May 19, 2026

Rebased onto master to drop the merge commit and reworded the first commit to reference the issue by URL instead of a closing keyword, which clears the invalid-commit-message check. Also folded the kops and pod-source-domain guards into a second commit. Tests pass locally.

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. needs-ok-to-test Indicates a PR that requires an org member to verify it is safe to test. size/M Denotes a PR that changes 30-99 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