如何获取Kubernetes服务的外部IP作为原始值?

10

我正在使用GKE运行一个应用程序。它工作得很好,但我无法弄清楚如何以机器可读的格式获取服务的外部IP。

因此,我正在寻找一个gcloud或kubectl命令,只给我外部IP或格式为http://192.168.0.2:80的URL,以便我可以剪切IP。

8个回答

20
您可以使用 jsonpath 输出类型直接获取数据,无需额外使用jq处理json:
kubectl get services \
   --namespace ingress-nginx \
   nginx-ingress-controller \
   --output jsonpath='{.status.loadBalancer.ingress[0].ip}'

注意

请务必将命名空间和服务名称替换为您自己的。


12

也许不是GKE,因为我的集群在AWS上,但我认为逻辑会类似。当你执行 kubectl get svc 命令时,你可以选择输出格式,它会显示比“普通”获取更多信息。对于我来说,对于基于ELB的服务,只需运行命令 kubectl -n kube-system get svc cluster-nginx-ingress-controller -o json | jq .status.loadBalancer.ingress.hostname 就足够获取负载均衡器主机名了。


1
注意:如果您想在其他地方使用它,可以对jq使用-r以获取原始值(否则它将在返回的字符串中包含引号)。 - kenny
我更喜欢使用 jsonpathkubectl get services -l component=controller,app=nginx-ingress -o jsonpath="{.items[0].status.loadBalancer.ingress[0].hostname}" - vikas027
这给了我一个错误无法使用字符串"hostname"索引数组,相反我使用了jq -r ".status.loadBalancer.ingress | .[].ip" - Chris Stryczynski

6
在我的情况下,'kubectl get services' 返回的是一组项目,而不仅仅是一个服务。因此,这个 jsonpath 对我来说是有效的:
kubectl get services -l component=controller,app=nginx-ingress -o jsonpath="{.items[0].status.loadBalancer.ingress[0].ip}"

2
上面的回答没有提供用户所要求的输出。正确的命令应该是:kubectl -n $namespace get svc $ingressServiceName -o json | jq -r .status.loadBalancer.ingress[].hostname

2

另一种方法是使用以下命令,列出所有“负载均衡器”服务:

kubectl get services --all-namespaces -o json | jq -r '.items[] | { name: .metadata.name, ns: .metadata.namespace, ip: .status.loadBalancer?|.ingress[]?|.ip }'

根据您的集群使用的网络插件,服务/ Pod 可能直接在外部 IP 上公开。但这也将查找在集群中运行的 Ingress 控制器。


2

在GCP上获取外部IP,我可以使用以下命令:

kubectl get services --namespace=<your-namespace> -o jsonpath="{.items[0].status.loadBalancer.ingress[0].ip}"

0

所有以前的解决方案在我(在GCP上)不再起作用。

获取IP的方法:

kubectl get ingress <YOUR_INGRESS_NAME> -o jsonpath="{.status.loadBalancer.ingress[0].ip}"

获取主机名:

kubectl get ingress <YOUR_INGRESS_NAME> -o jsonpath="{.spec.rules[0].host}"

0

类型

minikube tunnel

或者

kubectl cluster-info

您可以获取相关服务的公共暴露IP。


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