首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何等到Kubernetes将外部IP分配给LoadBalancer服务?

如何等到Kubernetes将外部IP分配给LoadBalancer服务?
EN

Stack Overflow用户
提问于 2016-02-03 14:13:13
回答 7查看 9.4K关注 0票数 24

创建Kubernetes LoadBalancer立即返回(例如:kubectl create -f ...kubectl expose svc NAME --name=load-balancer --port=80 --type=LoadBalancer)。

我知道一种在shell中等待的手动方法:

代码语言:javascript
复制
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)被设置或失败?

EN

回答 7

Stack Overflow用户

发布于 2018-04-23 20:25:20

为了在这里添加答案,现在最好的选择是使用bash脚本。为了方便起见,我把它放在一行中,其中包括导出环境变量。

命令等待并找到Kubernetes服务端点

代码语言:javascript
复制
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

代码语言:javascript
复制
#!/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。

代码语言:javascript
复制
  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'
票数 13
EN

Stack Overflow用户

发布于 2020-07-24 16:44:49

通过工作解决方案,这有点棘手:

代码语言:javascript
复制
kubectl get service -w load-balancer -o 'go-template={{with .status.loadBalancer.ingress}}{{range .}}{{.ip}}{{"\n"}}{{end}}{{.err}}{{end}}' 2>/dev/null | head -n1
票数 3
EN

Stack Overflow用户

发布于 2021-11-25 10:41:17

我们有关于AWS EKS的一个类似问题,并希望有一个单一的班轮,用于我们的CI管道。kubectl wait是理想的,但是无法在任意jsonpath上等待会一直持续到v1.23 (参见这个公关)。

在此之前,我们可以简单地使用“观察”命令的输出,直到观察到特定字符串,然后退出。循环until

代码语言:javascript
复制
until kubectl get service/<service-name> --output=jsonpath='{.status.loadBalancer}' | grep "ingress"; do : ; done

为了避免无限循环,您可以增强它使用超时 (在Mac上):

代码语言:javascript
复制
timeout 10s bash -c 'until kubectl get service/<service-name> --output=jsonpath='{.status.loadBalancer}' | grep "ingress"; do : ; done'

在此之后获取ip很容易使用:

代码语言:javascript
复制
kubectl get service/<service-name> --output=jsonpath='{.status.loadBalancer.ingress[0].ip}' 

或者当使用像AWS这样的服务时,您很可能填充了hostname而不是ip

代码语言:javascript
复制
kubectl get service/<service-name> --output=jsonpath='{.status.loadBalancer.ingress[0].hostname}' 
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35179410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档