【问题标题】:Kubernetes - how to check current domain set by --cluster-domain from pod?Kubernetes - 如何从 pod 检查由 --cluster-domain 设置的当前域?
【发布时间】:2019-03-27 04:52:35
【问题描述】:

Kubernetes 管理员可以使用--cluster-domain 来自定义集群域,而不是使用默认的:cluster.localKubelet Configs

所以问题是,应用程序 pod 如何在运行时检查此域?

【问题讨论】:

    标签: kubernetes kubelet


    【解决方案1】:

    需要在DNS服务器上配置。

    kube-dnscoredns(在较新的 K8s 版本上更受欢迎)

    kube-dns:这是一个 cli 选项 --domain

    core-dns:可以配置K8s ConfigMap

    你看到here

    kubelet 使用 --cluster-dns= 标志将 DNS 传递给每个容器。

    如果您想知道 pod 如何解析 cluster.local,它会通过 kubelet 安装在每个 pod 上的 /etc/resolv.conf 来解决。内容是这样的:

    $ cat /etc/resolv.conf
    nameserver 10.96.0.10
    search <namespace>.svc.cluster.local svc.cluster.local cluster.local <nod-domain>
    options ndots:5
    

    10.96.0.10 是您的 corednskube-dns 集群 IP 地址。

    【讨论】:

    • 谢谢里科。但这不是我想要的。基本上,我知道是 kubelet 使用标志 --cluster-domain= 配置域。而 是我想从正在运行的 pod 中查询的内容。
    • 您到底在寻找什么? pod 如何知道搜索cluster.local?添加了更多详细信息,让我知道您是否需要。
    • 是的,替换默认的?我从您添加的答案中看到,您是在暗示解析 /etc/resolv.conf? /etc/resolv.conf 中的格式总是固定的吗?我找不到任何涵盖该区域的规范。
    • 是的,它一直都在。该规范只是 linux 手册页:) man7.org/linux/man-pages/man5/resolv.conf.5.html。这由每个容器上的 kubelet 获取,并根据配置/命名空间填充值。不幸的是,在 pod 上运行 hostname 只会给你 pod 名称和 pod-name.domain。没有 k8s pod 规范字段表明这是此 pod 的域
    • 谢谢里科。感觉有点hacky,但只要它有效。虽然能够像查询命名空间一样查询它真的很方便。
    【解决方案2】:

    对服务 kubernetes.default 运行 DNS 查询是一种可能的解决方案。这是 shell 中的单行示例:

    kubectl run -it --image=ubuntu --restart=Never shell -- \
    sh -c 'apt-get update > /dev/null && apt-get install -y dnsutils > /dev/null && \
    nslookup kubernetes.default | grep Name | sed "s/Name:\skubernetes.default//"'
    

    这将作为最后一行返回:

    .svc.cluster.local
    

    但是,我认为用像 go 这样的编程语言来实现这个算法会更健壮,它在 net 库中实现了一个很好的 DNS 客户端,这是一个可以在 pod 中运行的示例:

    package main
    
    import (
        "fmt"
        "net"
        "strings"
    )
    
    // GetClusterDomain returns Kubernetes cluster domain, default to "cluster.local"
    func getClusterDomain() string {
        apiSvc := "kubernetes.default.svc"
    
        cname, err := net.LookupCNAME(apiSvc)
        if err != nil {
            defaultClusterDomain := "cluster.local"
            return defaultClusterDomain
        }
    
        clusterDomain = strings.TrimPrefix(cname, apiSvc)
        clusterDomain = strings.TrimSuffix(clusterDomain, ".")
    
        return clusterDomain
    }
    
    func main() {
        fmt.Println(getClusterDomain())
    }
    

    【讨论】:

    • 如果您至少有 'ndots:1',它将无法工作。最好有 API 调用的结果。
    • 在 Kubernetes 中,'ndots' 默认设置为 5,因此可以正常工作。如果 'ndots' 设置为 1,Kubernetes 将根本无法为本地名称执行 DNS 解析,因此 'ndots:1' 会破坏 Kubernetes DNS。 API 调用会很方便,但会在应用程序 pod 和 k8s 之间添加一些依赖关系,因此不建议将其作为最佳实践。所以我在这里看不到一个简单的解决方案,我在我们的大型生产平台上使用上述技术:confluence.lsstcorp.org/display/DM/…
    猜你喜欢
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 2019-02-16
    • 2020-11-02
    • 1970-01-01
    • 2023-03-08
    • 2018-04-18
    • 2016-07-22
    相关资源
    最近更新 更多