在 Kubernetes 中获取服务的完整名称

32

根据k8s文档的默认设置,服务会被分配一个DNS A记录,其名称形式为my-svc.my-namespace.svc.cluster-domain.example

是否有命令可以检索服务的完整名称?


1
nslookup服务名称将为您提供此信息。 - Tushar Mahajan
2个回答

50
您可以从任何Pod执行DNS查询,然后您将获得FQDN。
# nslookup api-server
Server:     10.96.0.10
Address:    10.96.0.10#53

Name:   api-server.default.svc.cluster.local
Address: 10.104.225.18

root@api-server-6ff8c8b9c-6pgkb:/#
cluster-domain.example只是文档中的示例。cluster.local是默认分配的集群域。因此,默认情况下,任何服务的FQDN将是<service-name>.<namespace>.svc.cluster.local
您不需要使用FQDN来访问服务-对于同一命名空间中的服务,只需使用服务名称即可。对于其他命名空间中的服务,<service-name>.<namespace>就足够了,因为kubernetes会自动设置DNS搜索域。

1
假设我有一个名为db-service的服务在-n dev-n prod上运行。我知道FQDN分别是db-service.dev.svc.cluster.localdb-service.prod.svc.cluster.local,但在这种情况下我该如何使用nslookup呢? - Juliano Costa
你至少需要知道命名空间。你可以执行 nslookup db-service.devnslookup db-service.prod - Shashank V
1
我觉得我做错了什么,因为我能得到的唯一结果是:“** server can't find xxx: NXDOMAIN”,其中xxx是服务名称。 - Juliano Costa
1
你在哪里运行nslookup命令?你应该在Pod中的容器内运行它。 - Shashank V
2
它起作用了,谢谢@aviator。`master $ kubectl exec -it redis -- nslookup redis-service.default nslookup: 无法解析“(null)”: 名称无法解析名称:redis-service.default 地址1:10.107.229.159 redis-service.default.svc.cluster.local` - Juliano Costa
显示剩余3条评论

14

简而言之:如果您只想要一种自动化的方法来完成此操作,请跳过以下内容;这是我编写的一个快速的bash脚本,可自动完成此操作。这假设bash已安装在容器中:

k8s_shell_pod_svc_nslookup () {
  kubectl exec -it $1 --container $2 -- /bin/bash -c "apt update;apt-get -y install dnsutils;nslookup $3"
}

示例用法:

k8s_shell_pod_svc_nslookup example_pod example_container example_service

更详细的解释:

首先,在适当的命名空间中列出所有服务,以获取您感兴趣的服务的FQDN(完全限定域名)的名称:

kubectl get svc -n <namespace>

其次,通过列出所有 Pod 来获取与您感兴趣的服务关联的 Pod 的名称:

kubectl get pods

第三步,通过列出该 Pod 中的所有容器来获取您感兴趣的 Pod 中的容器:

kubectl get pods <pod_name> -o jsonpath='{.spec.containers[*].name}'

第四步,您需要访问Pod(以及在Pod中运行的容器),并启动Bash Shell。注意:我使用Istio,因此我的Pod中将始终有多个容器正在运行,因此我还需指定容器名。这假设容器中已安装Bash。

kubectl exec -it <pod_name> --container <container_name> -- /bin/bash

第五步,一旦您的bash shell已经启动,如果您正在运行一个 debian 容器,则需要使用 apt 安装 dnsutils,然后才能进行nslookup。如果您没有使用debian,请使用相应的替代方案:

apt update && apt-get -y install dnsutils

第六步,您可以执行 nslookup 命令:

nslookup <service_name>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接