创建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然而,这并不理想:
--wait或--wait-once,但是使用这些命令永远不会返回。是否有更好的方法来等待一个服务外部IP (也就是LoadBalancer入侵IP)被设置或失败?
发布于 2018-04-23 20:25:20
为了在这里添加答案,现在最好的选择是使用bash脚本。为了方便起见,我把它放在一行中,其中包括导出环境变量。
命令等待并找到Kubernetes服务端点
bash -c 'external_ip=""; while [ -z $external_ip ]; do echo "Waiting for end point..."; external_ip=$(kubectl get svc NAME_OF_YOUR_SERVICE --template="{{range .status.loadBalancer.ingress}}{{.ip}}{{end}}"); [ -z "$external_ip" ] && sleep 10; done; echo "End point ready-" && echo $external_ip; export endpoint=$external_ip'我还修改了您的脚本,因此它只在ip不可用时执行等待。最后一个位将导出一个名为“终结点”的环境变量。
检查给定服务的Bash脚本
将其保存为check-endpoint.sh,然后可以执行$sh check-endpoint.sh SERVICE_NAME
#!/bin/bash
# Pass the name of a service to check ie: sh check-endpoint.sh staging-voting-app-vote
# Will run forever...
external_ip=""
while [ -z $external_ip ]; do
echo "Waiting for end point..."
external_ip=$(kubectl get svc $1 --template="{{range .status.loadBalancer.ingress}}{{.ip}}{{end}}")
[ -z "$external_ip" ] && sleep 10
done
echo 'End point ready:' && echo $external_ip在Codefresh步骤中使用此方法
我在Codefresh管道中使用它,当它完成时它会传递一个变量$endpoint。
GrabEndPoint:
title: Waiting for endpoint to be ready
image: codefresh/plugin-helm:2.8.0
commands:
- bash -c 'external_ip=""; while [ -z $external_ip ]; do echo "Waiting for end point..."; external_ip=$(kubectl get svc staging-voting-app-vote --template="{{range .status.loadBalancer.ingress}}{{.ip}}{{end}}"); [ -z "$external_ip" ] && sleep 10; done; echo "End point ready-" && echo $external_ip; cf_export endpoint=$external_ip'发布于 2020-07-24 16:44:49
通过工作解决方案,这有点棘手:
kubectl get service -w load-balancer -o 'go-template={{with .status.loadBalancer.ingress}}{{range .}}{{.ip}}{{"\n"}}{{end}}{{.err}}{{end}}' 2>/dev/null | head -n1发布于 2021-11-25 10:41:17
我们有关于AWS EKS的一个类似问题,并希望有一个单一的班轮,用于我们的CI管道。kubectl wait是理想的,但是无法在任意jsonpath上等待会一直持续到v1.23 (参见这个公关)。
在此之前,我们可以简单地使用“观察”命令的输出,直到观察到特定字符串,然后退出。循环until:
until kubectl get service/<service-name> --output=jsonpath='{.status.loadBalancer}' | grep "ingress"; do : ; donetimeout 10s bash -c 'until kubectl get service/<service-name> --output=jsonpath='{.status.loadBalancer}' | grep "ingress"; do : ; done'在此之后获取ip很容易使用:
kubectl get service/<service-name> --output=jsonpath='{.status.loadBalancer.ingress[0].ip}' 或者当使用像AWS这样的服务时,您很可能填充了hostname而不是ip。
kubectl get service/<service-name> --output=jsonpath='{.status.loadBalancer.ingress[0].hostname}' https://stackoverflow.com/questions/35179410
复制相似问题