如何为 pods 使用 Kubernetes DNS?

how to use Kubernetes DNS for pods?

在 GKE 上,kube-dns 在我的节点上 运行,我可以看到 docker 个容器。

我确实可以按名称访问 Services,这对于负载平衡是非常合适的解决方案的所有这些应用程序来说都很棒,但是 我将如何使用访问个人的 DNS pods?

我知道我可以在 API 中查找特定的 pods,但我需要自己更新 hosts 文件,并继续关注播客列表。 DNS 应该为我做这件事,那么在 pod 中使用它意味着什么?

Kubernetes 文档说 DNS 信息需要传递给 kubelet,但据我所知,我无法在 GKE 上访问它,所以它只是没有在 GKE 上以这种方式设置,还是有什么事情要做激活它?

我的一些服务(尤其是 zookeeper)知道它自己的其他节点,并尝试通过主机名(即 pod 名称)连接到它们并且失败,除非我更新 hosts自己归档。我想为此使用集成的 DNS 服务。

任何有关如何执行此操作的指导将不胜感激。

谢谢

更新

根据文档,格式现在是:

_my-port-name._my-port-protocol.my-svc.my-namespace.svc.cluster.local

在此处查看相关文档: https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pods

原始答案:

截至目前,这实际上是不可能的......但 Kubernetes 团队正在研究它。

看到这个问题:https://github.com/kubernetes/kubernetes/issues/13552

更新:

自 09/2015 起 Pods 可以使用 DNS 见公关:https://github.com/kubernetes/kubernetes/pull/13759

简而言之:

This will give pods dns in the form of <podIP>.<namespace>.pod.<clusterSuffix> Currently can be disabled, but is either on for all pods or off.

Kubernetes statefulset支持关联服务名,并通过服务名定义pod dns名称。

比如你创建了一个zk daemonset,一个zk service,那么zk daemonset的第一个pod的dns名称是zk-0.$(namespace).svc.cluster.local

更多详情请见: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/

重要提示:服务必须为“headless”才能正常工作,即.spec.clusterIP 必须None

Kubernetes 为 StatefulSet

的所有组件提供稳定的网络 ID

考虑以下示例:

kind: Namespace
apiVersion: v1
metadata:
  name: mynamespace
---
apiVersion: v1
kind: Service
metadata:
  name: myservice
  namespace: mynamespace
  labels:
    app: myapp
spec:
  ports:
    - port: 80
      name: http
  type: ClusterIP
  selector:
    app: myapp
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: myapp
  namespace: mynamespace
spec:
  serviceName: myservice
  replicas: 2
  selector:
    matchLabels:
      app: myapp
  # ...

然后您将在 k8s 集群中拥有以下可解析的 DNS 条目:

  • myservice.mynamespace.svc.cluster.local 用于通过 myservice
  • myapp pods 之一的负载均衡访问
  • myapp-0.myservice.mynamespace.svc.cluster.local 用于直接访问 myapp StatetefulSet
  • 的 Pod 0
  • myapp-1.myservice.mynamespace.svc.cluster.local 用于直接访问 myapp StatetefulSet
  • 的 Pod 1

文档:https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#stable-network-id