Kubernetes管理员可以使用--cluster-domain
自定义群集域,而不必使用默认域:cluster.local
Kubelet Configs。
问题是,应用程序容器如何在运行时检查该域?
答案 0 :(得分:3)
它需要在DNS服务器上进行配置。
kube-dns或coredns(在较新的K8s版本上受宠)
kube-dns:这是一个cli选项--domain
core-dns:您可以配置K8s ConfigMap
您会看到here:
kubelet使用--cluster-dns =标志将DNS传递到每个容器。
如果您想知道Pod如何解析cluster.local
,则可以通过/etc/resolv.conf
来完成,将kubelet安装在每个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
10.96.0.10
是您的coredns
或kube-dns
群集IP地址。
答案 1 :(得分:0)
针对服务 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这样的编程语言来实现该算法会更健壮,因为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"
clusterDomain := "cluster.local"
cname, err := net.LookupCNAME(apiSvc)
if err != nil {
return clusterDomain
}
clusterDomain = strings.TrimPrefix(cname, apiSvc)
clusterDomain = strings.TrimSuffix(clusterDomain, ".")
return clusterDomain
}
func main() {
fmt.Println(getClusterDomain())
}