As LoadBalancer
在支持外部负载平衡器的云提供商上,将类型字段设置为LoadBalancer为您的服务提供一个负载均衡器。负载均衡器的实际创建是异步进行的,有关供应均衡器的信息发布在服务的
.status.loadBalancer字段中。
在服务(EKS)上,提供了一个AWS负载均衡器,即负载均衡网络流量(见AWS文档 & GitHub使用Pulumi提供EKS集群的示例项目)。假设我们已经准备好了一个Deployment和选择器app=tekton-dashboard (它是默认的Tekton仪表板,您可以按照docs中的说明进行部署。),那么在tekton-dashboard-service.yml中定义的LoadBalancer类型的Service可能如下所示:
apiVersion: v1
kind: Service
metadata:
name: tekton-dashboard-external-svc-manual
spec:
selector:
app: tekton-dashboard
ports:
- protocol: TCP
port: 80
targetPort: 9097
type: LoadBalancer如果我们使用kubectl apply -f tekton-dashboard-service.yml -n tekton-pipelines在集群中创建服务,AWS将自动创建:

只有一个问题:.status.loadBalancer字段是异步填充的ingress[0].hostname字段,因此无法立即使用。如果我们一起运行以下命令,我们可以检查这一点:
kubectl apply -f tekton-dashboard-service.yml -n tekton-pipelines && \
kubectl get service/tekton-dashboard-external-svc-manual -n tekton-pipelines --output=jsonpath='{.status.loadBalancer}'输出将是一个空字段:
{}%因此,如果我们想在CI管道中运行这个设置,例如,.status.loadBalancer,,我们需要等待字段填充AWS的主机名。
发布于 2021-11-25 09:16:40
TLDR;
v1.23 --使用kubectl wait是不可能的,但是将until与grep结合使用,如下所示:
until kubectl get service/tekton-dashboard-external-svc-manual -n tekton-pipelines --output=jsonpath='{.status.loadBalancer}' | grep "ingress"; do : ; done甚至增强命令使用超时 (在Mac上)以防止该命令无限地运行:
timeout 10s bash -c 'until kubectl get service/tekton-dashboard-external-svc-manual -n tekton-pipelines --output=jsonpath='{.status.loadBalancer}' | grep "ingress"; do : ; done'带kubectl等待的问题&详细解释的解决方案
正如这就是问与答和kubernetes中所述,在当前的Kubernetes版本中,使用kubectl wait解决库贝克尔等待无法等待服务准备#80828 & 在任意jsonpath #83094上等待kubectl问题是不可能的。
主要原因是,kubectl wait假定使用kubectl get service/xyz --output=yaml查询的Kubernetes资源的status字段包含一个conditions列表。而Service却没有。在这里使用jsonpath是一种解决方案,可以从Kubernetes v1.23 on (参见这个合并的公关)开始。但是,在像EKS这样的托管Kubernetes集群中广泛使用此版本之前,我们需要另一种解决方案。而且,它也应该像kubectl wait一样,作为“一线”使用。
一个很好的起点可以是这个关于“监视”命令的输出,直到观察到特定字符串,然后退出。的超级用户答案。
until my_cmd | grep "String Im Looking For"; do : ; done如果我们与kubectl get一起使用这种方法,我们就可以创建一个命令,直到ingress字段被填充到我们的Service中的status.loadBalancer字段。
until kubectl get service/tekton-dashboard-external-svc-manual -n tekton-pipelines --output=jsonpath='{.status.loadBalancer}' | grep "ingress"; do : ; done这将等到ingress字段被填充,然后打印出AWS地址(例如,之后通过使用kubectl get service tekton-dashboard-external-svc-manual -n tekton-pipelines --output=jsonpath='{.status.loadBalancer.ingress[0].hostname}' ):
$ until kubectl get service/tekton-dashboard-external-svc-manual -n tekton-pipelines --output=jsonpath='{.status.loadBalancer}' | grep "ingress"; do : ; done
{"ingress":[{"hostname":"a74b078064c7d4ba1b89bf4e92586af0-18561896.eu-central-1.elb.amazonaws.com"}]}现在,我们有了一个一行行命令,它的行为就像一个kubectl wait,这样我们的Service就可以通过AWS负载平衡器获得。我们可以反复检查它是否与以下命令结合使用(请确保在执行服务之前使用kubectl delete service/tekton-dashboard-external-svc-manual -n tekton-pipelines删除服务,否则服务将包含。AWS LoadBalancer已经存在):
kubectl apply -f tekton-dashboard-service.yml -n tekton-pipelines && \
until kubectl get service/tekton-dashboard-external-svc-manual -n tekton-pipelines --output=jsonpath='{.status.loadBalancer}' | grep "ingress"; do : ; done && \
kubectl get service tekton-dashboard-external-svc-manual -n tekton-pipelines --output=jsonpath='{.status.loadBalancer.ingress[0].hostname}'这里还有一个完整的GitHub操作管道运行如果你感兴趣的话。
https://stackoverflow.com/questions/70108499
复制相似问题