根据k8s文档的默认设置,服务会被分配一个DNS A记录,其名称形式为my-svc.my-namespace.svc.cluster-domain.example
。
是否有命令可以检索服务的完整名称?
根据k8s文档的默认设置,服务会被分配一个DNS A记录,其名称形式为my-svc.my-namespace.svc.cluster-domain.example
。
是否有命令可以检索服务的完整名称?
# 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
。<service-name>.<namespace>
就足够了,因为kubernetes会自动设置DNS搜索域。-n dev
和-n prod
上运行。我知道FQDN分别是db-service.dev.svc.cluster.local
和db-service.prod.svc.cluster.local
,但在这种情况下我该如何使用nslookup呢? - Juliano Costanslookup db-service.dev
或 nslookup db-service.prod
。 - Shashank V简而言之:如果您只想要一种自动化的方法来完成此操作,请跳过以下内容;这是我编写的一个快速的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>