【发布时间】:2018-06-06 18:27:13
【问题描述】:
我正在使用 GKE 运行一个应用程序。它工作正常,但我不知道如何以机器可读格式获取服务的外部 IP。
所以我正在搜索一个 gcloud 或 kubectl 命令,它只给我外部 IP 或 http://192.168.0.2:80 格式的 url,以便我可以删除 IP。
【问题讨论】:
标签: kubernetes kubectl google-kubernetes-engine
我正在使用 GKE 运行一个应用程序。它工作正常,但我不知道如何以机器可读格式获取服务的外部 IP。
所以我正在搜索一个 gcloud 或 kubectl 命令,它只给我外部 IP 或 http://192.168.0.2:80 格式的 url,以便我可以删除 IP。
【问题讨论】:
标签: kubernetes kubectl google-kubernetes-engine
也许不是 GKE,因为我的集群在 AWS 上,但我认为逻辑是相似的。当您kubectl get svc 时,您可以选择输出格式,它会显示更多而不是“正常”获取。对我来说,使用基于 ELB 的服务来获取 LB 主机名,运行 ie 就足够了。 kubectl -n kube-system get svc cluster-nginx-ingress-controller -o json | jq .status.loadBalancer.ingress.hostname
【讨论】:
-r 来获取原始值(否则它会在返回的字符串中包含引号)
您可以使用jsonpath输出类型直接获取数据,无需额外的jq处理json:
kubectl get services --namespace ingress-nginx nginx-ingress-controller --output jsonpath='{.status.loadBalancer.ingress[0].ip}'
(请务必将命名空间和服务名称分别替换为您的。)
【讨论】:
在我的例子中,'kubectl get services' 返回项目数组,但不仅仅是一个服务。
那么这样的 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
【讨论】:
...还有另一种方式...这将列出所有“负载平衡器”服务
kubectl get services --all-namespaces -o json | jq -r '.items[] | { name: .metadata.name, ns: .metadata.namespace, ip: .status.loadBalancer?|.ingress[]?|.ip }'
根据您的集群服务/pod 使用的 networkPlugin 可能会直接暴露在 external-ip 上。但这也会发现集群中运行了一个 Ingress 控制器。
【讨论】:
所有以前的解决方案都不再适用于我(在 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}"
【讨论】: