如何等到Kubernetes为LoadBalancer服务分配外部IP?

Wer*_*ght 12 bash kubernetes

创建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
Run Code Online (Sandbox Code Playgroud)

然而,这并不理想:

  • 需要至少5行Bash脚本.
  • 即使出现错误也无限等待(否则需要超时,这会增加很多行数).
  • 可能效率不高; 可以使用--wait--wait-once使用那些命令永远不会返回.

有没有更好的方法等待服务外部IP(也称为LoadBalancer Ingress IP)设置或设置失败?

Dan*_*eld 8

只是为了在这里添加答案,现在最好的选择是使用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'
Run Code Online (Sandbox Code Playgroud)

我还修改了你的脚本,所以只有在ip不可用时它才会执行等待.最后一位将导出一个名为"endpoint"的环境变量

用于检查给定服务的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
Run Code Online (Sandbox Code Playgroud)

在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'
Run Code Online (Sandbox Code Playgroud)

  • `kubectl get svc $1 --output="jsonpath={.status.loadBalancer.ingress[0].hostname}"` 对我有用 (3认同)

Tim*_*kin 1

实际上并不存在“设置失败”的情况,因为我们将永远重试。故障可能是云提供商中的暂时性错误或在数小时或数天内解决的配额问题,或任何数量的事情。唯一的失败来自“你愿意等多久?” - 只有你才能知道。

我们没有通用的“等待表达式”命令,因为它最终会变得任意复杂,并且您最好只用真正的语言对其进行编码。因此上面的 bash 循环。我们可以在使用“watch”命令方面做得更好,但最终仍然是超时。