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

时间:2018-10-23 03:34:31

标签: kubernetes kubelet

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

问题是,应用程序容器如何在运行时检查该域?

2 个答案:

答案 0 :(得分:3)

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

kube-dnscoredns(在较新的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是您的corednskube-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())
}