You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制Kubernetes中DNS名称仅解析到带特定标签的服务?

Kubernetes 基于服务标签的条件DNS解析方案

在Kubernetes集群中,默认可通过http://<服务名>.<命名空间>.svc.cluster.local格式的内部DNS域名直接解析到对应服务IP。现在需要实现:仅当服务带有指定标签(如xyz: abcxyzexample)时,才能通过自定义后缀的DNS域名(如http://serviceNameExampleAbc.servicesWithXyzLabelOnly.default.svc.cluster.local)解析到该服务IP。

实现方案

Kubernetes默认的CoreDNS支持通过插件组合实现这类标签过滤的DNS解析,具体步骤如下:

1. 修改CoreDNS配置

编辑kube-system命名空间下的coredns ConfigMap,添加针对自定义DNS域的解析规则。以下是示例配置片段:

# 针对自定义域的解析规则
servicesWithXyzLabelOnly.default.svc.cluster.local:53 {
    errors
    health
    # 仅匹配带有xyz=abcxyzexample标签的服务
    kubernetes cluster.local in-addr.arpa ip6.arpa {
        pods insecure
        fallthrough in-addr.arpa ip6.arpa
        labelselector xyz=abcxyzexample
    }
    # 将自定义域名重写为标准Kubernetes服务域名格式
    rewrite name regex (.*)\.servicesWithXyzLabelOnly\.default\.svc\.cluster\.local $1.default.svc.cluster.local
    forward . /etc/resolv.conf
    cache 30
}

# 保留原有的默认集群域解析规则
cluster.local:53 {
    errors
    health
    kubernetes cluster.local in-addr.arpa ip6.arpa {
        pods insecure
        fallthrough in-addr.arpa ip6.arpa
    }
    forward . /etc/resolv.conf
    cache 30
    loop
    reload
    loadbalance
}

2. 生效配置并验证

  • 保存ConfigMap后,CoreDNS Pod会自动重启加载新配置(若未自动重启,可手动删除CoreDNS Pod触发重建)。
  • 在集群内的任意Pod中执行测试命令:
    • 对带有xyz: abcxyzexample标签的服务,执行nslookup serviceNameExampleAbc.servicesWithXyzLabelOnly.default.svc.cluster.local,应返回服务IP。
    • 对不带该标签的服务,执行相同命令会返回解析失败或无结果。

注意事项

  • 若需支持所有命名空间,可将自定义域改为servicesWithXyzLabelOnly.svc.cluster.local,并调整rewrite规则为(.*)\.servicesWithXyzLabelOnly\.svc\.cluster\.local $1.svc.cluster.local,同时kubernetes插件无需限制命名空间。
  • 确保使用的CoreDNS版本支持labelselector参数(CoreDNS 1.7.0及以上版本已支持该特性)。
  • 若集群仍在使用kube-dns,需先迁移至CoreDNS才能实现此功能。

内容的提问来源于stack exchange,提问作者Chris Stryczynski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 03:22:56