【问题标题】:Google GKE kubernetes DNS fail to resolve service nameGoogle GKE kubernetes DNS 无法解析服务名称
【发布时间】:2019-12-20 15:19:48
【问题描述】:

我在 GKE 上遇到 Kubernetes 问题。 我无法使用内部 DNS 按名称解析服务。

这是我的配置

谷歌 GKE v1.15

kubectl get namespaces
NAME              STATUS   AGE
custom-metrics    Active   183d
default           Active   245d
dev               Active   245d
kube-node-lease   Active   65d
kube-public       Active   245d
kube-system       Active   245d
stackdriver       Active   198d

我已经部署了几个基于 openjdk 11 docker 镜像的简单服务,并使用 spring boot + actuator 制作,以便在 dev 中测试 /actuator/health 端点

kubectl get pods --namespace=dev
NAME                          READY   STATUS    RESTARTS   AGE
test1-5d86946c49-h9t9l        1/1     Running   0          3h1m
test2-5bb5f4ff8d-7mzc8        1/1     Running   0          3h10m

如果我尝试在

下执行
kubectl --namespace=dev exec -it test1-5d86946c49-h9t9  -- /bin/bash
root@test1-5d86946c49-h9t9:/app# cat /etc/resolv.conf
nameserver 10.40.0.10
search dev.svc.cluster.local svc.cluster.local cluster.local europe-west1-b.c.back-office-236415.internal c.back-office-236415.internal google.internal
options ndots:5
root@test1-5d86946c49-h9t9:/app# nslookup test2
Server:         10.40.0.10
Address:        10.40.0.10#53

** server can't find test2: NXDOMAIN

如果我尝试使用 test2 服务并尝试解决 test1,也会出现同样的问题。命名空间是否有特殊配置来启用 D​​NS 解析?这不应该是自动的吗?

【问题讨论】:

  • 是否已分别为 test1test2(裸)Pod/部署创建了名为 test1test2Kubernetes Services?例如。这会返回任何 Kubernetes 服务吗:kubectl get svc --namespace=dev?
  • 是的,这两个服务都是通过部署创建的,但是您的评论非常有帮助,在我创建了几个服务 (nodeport) 之后,我能够通过 nodeports 服务查询 test1 和 test2。我认为 pod 不是必需的,因为 kuberenetes 会自动公开每个 pod 并认为是 DNS 名称。非常感谢

标签: kubernetes namespaces google-kubernetes-engine kube-dns


【解决方案1】:

我已使用主版本 1.15 和“ClusterIP”服务类型复制了此内容。我能够从一项服务的 Pod 查找到另一项服务。对于在 Google Kubernetes Engine 集群中创建 Kubernetes 服务 [1] 可能会有所帮助。

查看服务: $ kubectl get svc --namespace=default

要访问部署: $ kubectl exec -it [Pod 名称] sh

查找: $ nslookup [服务名称]

集群中定义的每个服务(包括 DNS 服务器本身)都被分配了一个 DNS 名称。默认情况下,客户端 Pod 的 DNS 搜索列表将包括 Pod 自己的命名空间和集群的默认域。

“正常”(非无头)服务被分配一个 DNS A 记录,其名称格式为 my-svc.my-namespace.svc.cluster-domain.example。这将解析为 Service 的集群 IP。

对于“无头”(没有集群 IP)服务还分配了一个 DNS A 记录作为名称。尽管这会解析为服务选择的 Pod 的 IP 集。

但是,可以基于每个 pod 设置 DNS 策略。目前 Kubernetes 支持以下特定于 pod 的 DNS 策略。这些策略在 Pod Spec [2] 的 dnsPolicy 字段中指定:

“默认”:Pod 从运行 Pod 的节点继承名称解析配置。

“ClusterFirst”:任何与配置的集群域后缀不匹配的DNS查询,例如“www.kubernetes.io”,都会被转发到从节点继承的上游域名服务器。集群管理员可能配置了额外的存根域和上游 DNS 服务器。

“ClusterFirstWithHostNet”:对于使用 hostNetwork 运行的 Pod,需要设置其 DNS 策略“ClusterFirstWithHostNet”。

“无”:它允许 Pod 忽略来自 Kubernetes 环境的 DNS 设置。所有 DNS 设置都应该使用 Pod Spec 中的 dnsConfig 字段来提供。

[1]-https://cloud.google.com/kubernetes-engine/docs/how-to/exposing-apps [2]-https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pod-s-dns-config

【讨论】:

  • 谢谢,这为我指明了正确的方向!我正在运行一个带有“hostNetwork:true”的 pod,在这种情况下,您显然 需要 使用 DNS 策略 ClusterFirstWithHostNet。
猜你喜欢
  • 1970-01-01
  • 2019-02-06
  • 2020-02-21
  • 1970-01-01
  • 2015-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多