在 Kubernetes 中检索服务的全名

Retrieve the full name of a service in Kubernetes

默认情况下,根据 k8s documentation,为服务分配一个 DNS A 记录,其名称格式为 my-svc.my-namespace.svc.cluster-domain.example

是否有检索服务全名的命令?

您可以从任何 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 搜索域。

TLDR;如果您只想要一种自动化的方式来执行此操作,请跳过以下内容;这是我编写的用于自动执行此操作的快速 bash 脚本。这假设 bash 安装在容器中:

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

示例使用:

k8s_shell_pod_svc_nslookup example_pod example_container example_service

更长的解释:

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

kubectl get svc -n <namespace>

其次,通过列出您的所有 pods:

获取与您感兴趣的服务关联的 pod 的名称
kubectl get pods

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

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

第四,需要访问pod(以及pod中的容器运行),启动一个bashshell。注意:我使用 Istio,所以我的 pods 中总是有多个容器 运行,所以我也指定了我的容器。这假设 bash 安装在容器中。

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

第五,一旦您的 bash shell 启动,如果您是 运行 一个 debian 容器,您将需要使用 apt在执行 nslookup 之前安装 dnsutils。如果您不使用 debian,请使用适当的替代方法:

apt update && apt-get -y install dnsutils

六、可以执行nslookup:

nslookup <service_name>