首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >等待AWS上的服务公开.status.loadBalancer.ingress字段中报告的弹性负载均衡器地址

等待AWS上的服务公开.status.loadBalancer.ingress字段中报告的弹性负载均衡器地址
EN

Stack Overflow用户
提问于 2021-11-25 09:16:40
回答 1查看 643关注 0票数 0

As LoadBalancer

在支持外部负载平衡器的云提供商上,将类型字段设置为LoadBalancer为您的服务提供一个负载均衡器。负载均衡器的实际创建是异步进行的,有关供应均衡器的信息发布在服务的.status.loadBalancer字段中。

在服务(EKS)上,提供了一个AWS负载均衡器,即负载均衡网络流量(见AWS文档 & GitHub使用Pulumi提供EKS集群的示例项目)。假设我们已经准备好了一个Deployment和选择器app=tekton-dashboard (它是默认的Tekton仪表板,您可以按照docs中的说明进行部署。),那么在tekton-dashboard-service.yml中定义的LoadBalancer类型的Service可能如下所示:

代码语言:javascript
复制
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字段,因此无法立即使用。如果我们一起运行以下命令,我们可以检查这一点:

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

输出将是一个空字段:

代码语言:javascript
复制
{}%

因此,如果我们想在CI管道中运行这个设置,例如,.status.loadBalancer,我们需要等待字段填充AWS的主机名。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-25 09:16:40

TLDR;

v1.23 --使用kubectl wait是不可能的,但是将untilgrep结合使用,如下所示:

代码语言:javascript
复制
until kubectl get service/tekton-dashboard-external-svc-manual -n tekton-pipelines --output=jsonpath='{.status.loadBalancer}' | grep "ingress"; do : ; done

甚至增强命令使用超时 (在Mac上)以防止该命令无限地运行:

代码语言:javascript
复制
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一样,作为“一线”使用。

一个很好的起点可以是这个关于“监视”命令的输出,直到观察到特定字符串,然后退出。的超级用户答案。

代码语言:javascript
复制
until my_cmd | grep "String Im Looking For"; do : ; done

如果我们与kubectl get一起使用这种方法,我们就可以创建一个命令,直到ingress字段被填充到我们的Service中的status.loadBalancer字段。

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

代码语言:javascript
复制
$ 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已经存在):

代码语言:javascript
复制
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操作管道运行如果你感兴趣的话。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70108499

复制
相关文章

相似问题

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