我正在尝试使用kubectl来等待一个服务获得分配的外部ip。我一直在尝试使用下面的只是为了入门
kubectl wait --for='jsonpath={.spec.externalTrafficPolicy==Cluster}' --timeout=30s --namespace cloud-endpoints svc/esp-echo
但我不断得到下面的错误消息
error: unrecognized condition: "jsonpath={.spec.externalTrafficPolicy==Cluster}"
4条答案
按热度按时间hm2xizp91#
不可能传递任意的
jsonpath
,并且已经有一个request for the feature。但是,您可以使用bash脚本进行一些sleep,并使用其他
kubectl
命令监视服务:例如,上面的命令将返回LoadBalancer服务的外部IP。
您可以使用上面的代码编写一个简单的bash文件:
sqxo8psd2#
从Krishna Chaurasia的答案更新,
kubectl
现在已经实现了能够等待任意jsonpath
值的特性。然而,捕获的值将仅是原始值,不包括嵌套的原始值(
map[string]interface{}
或[]interface{}
)yfwxisqw3#
现在
kubectl wait
doesn't seem to work for in this case(也可以看到这个PR的评论).同时你可以这样做:或者甚至增强命令using timeout(
brew install coreutils
on a Mac)以防止该命令无限运行: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
循环。bxpogfeg4#
你需要提供一个条件。比如:
kubectl -n foobar wait --for=condition=complete --timeout=32s foo/bar
这里有一篇很好的文章,解释了这一点:https://mrkaran.dev/posts/kubectl-wait/
在这种情况下,您可以使用k8s probes之一。