在 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>
默认情况下,根据 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>