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

How do I get the External IP of a Kubernetes service as a raw value?

我是 运行 GKE 的应用程序。它工作正常,但我不知道如何以机器可读格式获取服务的外部 IP。 所以我正在搜索 gcloud 或 kubectl 命令,它只给我外部 IP 或 http://192.168.0.2:80 格式的 url,这样我就可以删除 IP。

可能不是 GKE,因为我的集群在 AWS 上,但我认为逻辑是相似的。当您 kubectl get svc 时,您可以 select 输出格式,它会比 "normal" 显示更多。对我来说,使用基于 ELB 的服务来获取 LB 主机名就足以 运行 即。 kubectl -n kube-system get svc cluster-nginx-ingress-controller -o json | jq .status.loadBalancer.ingress.hostname

您可以使用 jsonpath 输出类型直接获取数据,而不需要额外的 jq 来处理 json:

kubectl get services --namespace ingress-nginx nginx-ingress-controller --output jsonpath='{.status.loadBalancer.ingress[0].ip}'

(请务必将命名空间和服务名称分别替换为您的名称。)

在我的例子中,'kubectl get services' returns 项目数组,但不仅仅是一项服务。

那么这样的 jsonpath 对我来说很好用:

kubectl get services -l component=controller,app=nginx-ingress -o jsonpath="{.items[0].status.loadBalancer.ingress[0].ip}"

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

...还有另一种方式...这将列出 所有 "load-balancer" 服务

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

取决于您的集群使用的网络插件 services/pods 可能会直接暴露在外部 IP 上。但这也会在集群中找到一个入口控制器运行。

所有以前的解决方案对我不再适用(在 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}"

要在 GCP 上获得 external-ip,我可以使用:

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