kubernetes - 以编程方式获取 Pod DNS 名称

标签 kubernetes kubernetes-go-client

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

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)

但我发现了一些问题:
  • 我将不得不根据副本的数量计算索引
  • 我需要知道用于此的服务名称 StatefulSet
  • 我假设集群域是 cluster.local这不一定是真的

  • 我认为它应该存在(但我不确定它是否真的存在)是一个 API,给定一个 StatefulSet 将允许我知道创建的副本的 DNS 名称。是否存在这样的 API?

    最佳答案

    创建 headless 时 ServiceStatefulSet ,它应该创建 DNS SRV 条目。您可以查询它以获取与 headless Service 对应的所有 pod 的主机名列表。在不知道号码的情况下。例如,如果使用 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.>
    

    看:
  • https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#srv-records
  • https://kubernetes.io/docs/concepts/services-networking/service/#headless-services
  • 关于kubernetes - 以编程方式获取 Pod DNS 名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49676719/

    相关文章:

    spring - 使用 Config Server 清洁部署 Spring Boot 微服务

    go - 无法在 kubernetes client-go 中创建没有复制 Controller 的部署

    go - GCP:Go中的存储桶创建

    go - 从 YAML 对象列表创建 API 对象

    go - 操作 Kubernetes 的 client-go PodList

    kubernetes - Helm升级遇到失败似乎是因为configmap限制​​超过

    mongodb - Kubernetes mongodb 就绪探测失败

    kubernetes - Ubuntu 升级到 19.10 后 Minikube 将无法工作

    Kubernetes 健康检查 : timeoutSeconds exceeds periodSeconds

    go - 如何通过 kubernetes go-client 获取 pod 资源使用情况?