以编程方式获取Pod DNS名称

时间:2018-04-05 15:59:13

标签: kubernetes kubernetes-go-client

我有一个有3名成员的州议会。可以从集群内部访问它们,例如:

podname-{0..n}.service.default.svc.cluster.local

我正在使用Controller中的Kubernetes API。我刚用:

创建了Statefulset
import (
    "k8s.io/client-go/kubernetes"
    appsv1 "k8s.io/api/apps/v1"
)
...

s := appsv1.StatefulSet{ /* some data */ }
kubernetes.AppsV1().StatefulSets(nameSpace).Create(s)

让我们假设一切正常,几分钟后我就有3个正在运行的Pod。如何获取新创建的Pod的Pod DNS条目?

我知道我可以使用以下方式构建DNS:

fmt.Sprintf("%s-%d.%s.%s.svc.cluster.local", s.Name, idx, service, S.Namespace)

但我发现了一些问题:

  1. 我必须根据副本的数量来计算索引
  2. 我需要了解用于此StatefulSet
  3. 的服务名称
  4. 我假设群集域是cluster.local,这不一定是真的
  5. 我认为它应该存在(但我不确定它是否真的存在),是一个API,给定一个StatefulSet将允许我知道创建的副本的DNS名称。这样的API是否存在?

2 个答案:

答案 0 :(得分:2)

使用Service创建无头StatefulSet时,应创建DNS SRV条目。您可以查询该内容以获取与无头Service对应的窗格的所有主机名列表,而不知道该号码。例如,如果使用Python,您可以执行以下操作:

>>> import dns
>>> for item in dns.resolver.query('your-app-name-headless', 'SRV'): item
...
<DNS IN SRV rdata: 10 25 0 2555bb89.your-app-name-headless.your-project.svc.cluster.local.>
<DNS IN SRV rdata: 10 25 0 830bdb18.your-app-name-headless.your-project.svc.cluster.local.>
<DNS IN SRV rdata: 10 25 0 aeb532de.your-app-name-headless.your-project.svc.cluster.local.>
<DNS IN SRV rdata: 10 25 0 a432c21f.your-app-name-headless.your-project.svc.cluster.local.>

请参阅:

答案 1 :(得分:1)

事件嗅探你所需要的几乎就是KubeDNS的工作方式。

所以code here古老而简单的方式。 看看override func viewWillAppear(_ animated: Bool) { addView() } 方法。 所以这里是代码的简短例子

podWatchFunc

official doc

中另一个好的推荐方式
func podWatchFunc(c *kubernetes.Clientset, ns string, s labels.Selector) func(options meta.ListOptions) (watch.Interface, error) {
    return func(options meta.ListOptions) (watch.Interface, error) {
        if s != nil {
            options.LabelSelector = s.String()
        }
        w, err := c.CoreV1().Pods(ns).Watch(options)
        if err != nil {
            return nil, err
        }
        return w, nil
    }
}

full code

您也可能了解dns是单独的k8s服务,而不是群集服务的一部分。所以找到ip / host并调用你的dns端点 For details 如果您使用默认命名策略和coredsn或dns-masq服务。 您还可以拥有pod metadata名称或自我链接

的域名
 import (
   "fmt"
   "k8s.io/client-go/1.4/kubernetes"
   "k8s.io/client-go/1.4/pkg/api/v1"
   "k8s.io/client-go/1.4/tools/clientcmd"
)
...
   // uses the current context in kubeconfig
   config, _ := clientcmd.BuildConfigFromFlags("", "path to kubeconfig")
   // creates the clientset
   clientset, _:= kubernetes.NewForConfig(config)
   // access the API to list pods
   pods, _:= clientset.CoreV1().Pods("").List(v1.ListOptions{})
   fmt.Printf("There are %d pods in the cluster\n", len(pods.Items))
...