Kubernetes - 如何从 pod 检查由 --cluster-domain 设置的当前域?
Kubernetes - how to check current domain set by --cluster-domain from pod?
Kubernetes 管理员可以使用 --cluster-domain
来自定义集群域,而不是使用默认域:cluster.local
Kubelet Configs。
那么问题来了,应用程序 pod 如何在运行时检查这个域?
需要在DNS服务器上配置。
或者kube-dns or coredns(较新的 K8s 版本更受欢迎)
kube-dns:这是一个 cli 选项 --domain
core-dns: 你可以配置 K8s ConfigMap
然后你看到 here:
The kubelet passes DNS to each container with the --cluster-dns= flag.
如果您想知道 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
是您的 coredns
或 kube-dns
集群 IP 地址。
运行 针对服务 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//"'
这将 returns 作为最后一行:
.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())
}
Kubernetes 管理员可以使用 --cluster-domain
来自定义集群域,而不是使用默认域:cluster.local
Kubelet Configs。
那么问题来了,应用程序 pod 如何在运行时检查这个域?
需要在DNS服务器上配置。
或者kube-dns or coredns(较新的 K8s 版本更受欢迎)
kube-dns:这是一个 cli 选项 --domain
core-dns: 你可以配置 K8s ConfigMap
然后你看到 here:
The kubelet passes DNS to each container with the --cluster-dns= flag.
如果您想知道 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
是您的 coredns
或 kube-dns
集群 IP 地址。
运行 针对服务 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//"'
这将 returns 作为最后一行:
.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())
}