kubernetes Kubectl等待服务获取外部IP

ercv8c1e  于 2023-03-29  发布在  Kubernetes
关注(0)|答案(4)|浏览(138)

我正在尝试使用kubectl来等待一个服务获得分配的外部ip。我一直在尝试使用下面的只是为了入门

kubectl wait --for='jsonpath={.spec.externalTrafficPolicy==Cluster}' --timeout=30s --namespace cloud-endpoints svc/esp-echo

但我不断得到下面的错误消息

error: unrecognized condition: "jsonpath={.spec.externalTrafficPolicy==Cluster}"
hm2xizp9

hm2xizp91#

不可能传递任意的jsonpath,并且已经有一个request for the feature
但是,您可以使用bash脚本进行一些sleep,并使用其他kubectl命令监视服务:

kubectl get --namespace cloud-endpoints svc/esp-echo --template="{{range .status.loadBalancer.ingress}}{{.ip}}{{end}}"

例如,上面的命令将返回LoadBalancer服务的外部IP。
您可以使用上面的代码编写一个简单的bash文件:

#!/bin/bash
ip=""
while [ -z $ip ]; do
  echo "Waiting for external IP"
  ip=$(kubectl get svc $1 --namespace cloud-endpoints --template="{{range .status.loadBalancer.ingress}}{{.ip}}{{end}}")
  [ -z "$ip" ] && sleep 10
done
echo 'Found external IP: '$ip
sqxo8psd

sqxo8psd2#

Krishna Chaurasia的答案更新,kubectl现在已经实现了能够等待任意jsonpath值的特性。
然而,捕获的值将仅是原始值,不包括嵌套的原始值(map[string]interface{}[]interface{}

yfwxisqw

yfwxisqw3#

现在kubectl waitdoesn't seem to work for in this case(也可以看到这个PR的评论).同时你可以这样做:

until kubectl get svc/esp-echo --namespace cloud-endpoints --output=jsonpath='{.status.loadBalancer}' | grep "ingress"; do : ; done

或者甚至增强命令using timeoutbrew install coreutils on a Mac)以防止该命令无限运行:

timeout 10s bash -c 'until kubectl get service/tekton-dashboard-external-svc-manual -n tekton-pipelines --output=jsonpath='{.status.loadBalancer}' | grep "ingress"; do : ; done'

We the same problem on AWS EKS,当创建LoadBalancer类型的Service时,AWS Elastic Load Balancer(ELB)将被配置。这很可能与其他云提供商的行为相当,因为它是官方www.example.com文档的一部分kubernetes.io:
在支持外部负载均衡器的云提供商上,将type字段设置为LoadBalancer将为您的Service提供负载均衡器。负载均衡器的实际创建是异步进行的,有关所提供的均衡器的信息将在Service的.status.loadBalancer字段中发布。
Krishna Chaurasia的答案也使用了这个字段,但我们希望有一个一行程序,可以像kubectl wait一样无需额外的bash脚本即可使用。因此我们的解决方案结合了serverfault上关于"watching" the output of a command until a particular string is observed and then exit的解决方案,并使用了until循环。

bxpogfeg

bxpogfeg4#

你需要提供一个条件。比如:
kubectl -n foobar wait --for=condition=complete --timeout=32s foo/bar
这里有一篇很好的文章,解释了这一点:https://mrkaran.dev/posts/kubectl-wait/
在这种情况下,您可以使用k8s probes之一。

相关问题