在 Kubernetes 中检索服务的全名

Jul*_*sta 4 kubernetes kubernetes-service

默认情况下,根据k8s 文档,服务被分配一个 DNS A 记录作为表单名称my-svc.my-namespace.svc.cluster-domain.example

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

Sha*_*k V 16

您可以从任何 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:/#
Run Code Online (Sandbox Code Playgroud)

cluster-domain.example只是文档中的一个例子。cluster.local是分配的默认集群域。因此,默认情况下任何服务的 FQDN 都是<service-name>.<namespace>.svc.cluster.local.

您不需要使用 FQDN 来访问服务 - 对于相同命名空间中的服务,只需服务名称就足够了。对于其他命名空间中的服务,<service-name>.<namespace>kubernetes 会自动设置 DNS 搜索域就足够了。

  • 它有效,谢谢@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` (2认同)

bwl*_*289 15

太长了;如果您只想以自动化方式执行此操作,请跳过以下内容;这是我编写的一个快速 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"
}
Run Code Online (Sandbox Code Playgroud)

使用示例:

k8s_shell_pod_svc_nslookup example_pod example_container example_service
Run Code Online (Sandbox Code Playgroud)

更长的解释:

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

k8s_shell_pod_svc_nslookup example_pod example_container example_service
Run Code Online (Sandbox Code Playgroud)

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

kubectl get svc -n <namespace>
Run Code Online (Sandbox Code Playgroud)

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

kubectl get pods
Run Code Online (Sandbox Code Playgroud)

第四,您需要访问 pod(以及在 pod 中运行的容器)并启动 bash shell。注意:我使用 Istio,因此我的 pod 中始终会运行多个容器,因此我还指定了我的容器。这假设容器中安装了 bash。

kubectl get pods <pod_name> -o jsonpath='{.spec.containers[*].name}'
Run Code Online (Sandbox Code Playgroud)

第五,一旦 bash shell 启动,如果您正在运行debian容器,则需要在执行 nslookup 之前使用aptinstall 。dnsutils如果您不使用debian,请使用适当的替代方案:

kubectl exec -it <pod_name> --container <container_name> -- /bin/bash
Run Code Online (Sandbox Code Playgroud)

第六,您可以执行nslookup

apt update && apt-get -y install dnsutils
Run Code Online (Sandbox Code Playgroud)