创建Kubernetes LoadBalancer会立即返回(例如:kubectl create -f ...
或kubectl expose svc NAME --name=load-balancer --port=80 --type=LoadBalancer
)。
我知道一种在shell中手动等待的方法:
external_ip=""
while [ -z $external_ip ]; do
sleep 10
external_ip=$(kubectl get svc load-balancer --template="{{range .status.loadBalancer.ingress}}{{.ip}}{{end}}")
done
但这并不理想:
- 至少需要5行Bash脚本。
- 即使在错误的情况下也要无限等待(否则需要超时,这会增加批次线计数)。
- 可能效率不高;可以使用
--wait
或--wait-once
,但使用这些命令永远不会返回。
是否有更好的方法等待服务 * 外部IP*(又名 LoadBalancer入口IP)设置或设置失败?
7条答案
按热度按时间omqzjyyz1#
为了补充这些问题的答案,现在最好的选择是使用bash脚本。为了方便起见,我将它放在一行中,其中包括导出环境变量。
等待并查找Kubernetes服务端点的命令
我还修改了你的脚本,所以它只在ip不可用时执行等待。最后一位将导出一个名为“endpoint”的环境变量。
检查给定服务的Bash脚本
将其保存为
check-endpoint.sh
,然后可以执行$sh check-endpoint.sh SERVICE_NAME
在Codefresh步骤中使用此内容
我将其用于Codefresh管道,完成后它会传递一个变量$endpoint。
w80xi6nr2#
这是有点棘手的工作解决方案:
nukf8bse3#
我们有a similar problem on AWS EKS,并希望在CI管道中使用一行程序。我们简单地使用
until
循环"watched" the output of a command until a particular string is observed and then exit:为了避免无限循环,可以增强using timeout(
brew install coreutils
on a Mac):在此之后获取IP很容易使用:
或者使用AWS EKS等服务时,您很可能填充了
hostname
而不是ip
:侧记(更新03.2023):
kubectl wait
将是理想的,但将not be able to wait on arbitrary jsonpath直到v1.23
(参见this PR)。但即使从1.24开始,我们似乎也是to not be able to usekubectl wait
,因为.status.loadBalancer.ingress[0]
是一个列表,kubectl wait
jsonpath实现不支持它。因此命令kubectl wait service/<service-name> --for=jsonpath='{.status.loadBalancer}'=ingress
抛出以下错误之一(参见this so question):h9vpoimq4#
也许这不是你想要的解决方案,但至少它有更少的代码行:
j9per5c45#
实际上并没有“设置失败”的情况,因为我们会永远重试。失败可能是云提供商的暂时错误,或者是在几小时或几天内解决的配额问题,或者任何数量的事情。唯一的失败来自“您愿意等待多久?”-这只有您自己知道。
我们没有一个通用的“wait for expression”命令,因为它最终会变得任意复杂,你最好用一种真实的的语言来编写它。因此,上面的bash循环。我们可以用一个“watch”命令做得更好,但它最终仍然是一个超时。
cyvaqqii6#
实际上只是对@Dan加菲猫的工作示例的清理;我的强迫症不会放过这个的。在这种情况下:
这已经被脚本化以接受一些参数,现在它是一个库;示例:
稍后,
$lbIngAdd
可以用来设置记录。看起来-o jsonpath="{.status.loadBalancer.ingress[*].ip}"
也可以工作;只要管用就行。谢谢你让我们开始丹:-)
z0qdvdin7#
下面是一个通用的bash函数,它可以***用timeout***监视给定命令输出中的任何regexp:
下面是我如何使用它来等待工作节点获得外部IP(这花了一分钟多的时间):
0... 1... 2... 3... .... 63... 64...
**3.22.37.41