Google GKE kubernetes DNS 无法解析服务名称

Google GKE kubernetes DNS fail to resolve service name

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

这是我的配置

Google 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 引导 + 执行器制作,以便有一个 /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 解析?这不应该是自动的吗?

我使用主版本 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。这解析为服务的集群 IP。

对于“无头”(没有集群 IP)服务,还为 name.Though 分配了 DNS A 记录,这解析为服务选择的 pods 的 IP 集。

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

“Default”:Pod继承pods 运行所在节点的名称解析配置。

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

“ClusterFirstWithHostNet”:对于Pods 运行 hostNetwork,需要设置其DNS策略“ClusterFirstWithHostNet”。

“None“:它允许 Pod 忽略来自 Kubernetes 环境的 DNS 设置。所有 DNS 设置都应该使用 Pod 规范中的 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