Kubernetes - 如何从 pod 检查由 --cluster-domain 设置的当前域?

And*_*Luo 14 kubernetes kubelet

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

那么问题来了,应用 pod 如何在运行时检查这个域?

Ric*_*ico 12

需要在DNS服务器上进行配置。

无论是KUBE-DNScoredns(上青睐新K8S版本)

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

core-dns:可以配置K8s ConfigMap

在这里看到:

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

如果您想知道 pod 如何解析cluster.local它,可以通过/etc/resolv.confkubelet 安装在每个 pod 上来完成。内容是这样的:

$ cat /etc/resolv.conf
nameserver 10.96.0.10
search <namespace>.svc.cluster.local svc.cluster.local cluster.local <nod-domain>
options ndots:5
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢里科。不过那不是我想要的。基本上,我知道是 kubelet 使用标志 --cluster-domain=&lt;default-local-domain&gt; 配置域。而 &lt;default-local-domain&gt; 是我想从正在运行的 pod 中查询的内容。 (2认同)

fja*_*mes 5

针对服务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//"'
Run Code Online (Sandbox Code Playgroud)

这将作为最后一行返回:

.svc.cluster.local
Run Code Online (Sandbox Code Playgroud)

但是,我认为用像 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())
}
Run Code Online (Sandbox Code Playgroud)