首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将外部GCP负载均衡器添加到kubespray集群?

如何将外部GCP负载均衡器添加到kubespray集群?
EN

Stack Overflow用户
提问于 2021-05-19 17:51:01
回答 1查看 221关注 0票数 1

我使用VM和Kubespray在Google Cloud上部署了一个kubernetes集群。

现在,我希望使用loadbalancer将一个简单的节点应用程序暴露给外部IP,但显示我从gcloud到服务的外部IP不起作用。当我查询kubectl get services时,它停留在挂起状态。

根据this的说法,默认情况下,kubespray没有包含/集成任何负载均衡器机制。我应该如何进步?

EN

回答 1

Stack Overflow用户

发布于 2021-05-21 17:41:10

让我首先总结一下我们试图在这里解决的问题。

问题是,你有一个自托管的kubernetes集群,你想要创建一个type=LoadBalancer的服务,你想让k8s用externlIP以全自动的方式为你创建LB,就像你使用GKE (kubernetes作为服务解决方案)一样。

另外,我不得不提一下,我不太了解steps祈祷,所以我将只描述所有需要做的步骤,让它工作,剩下的留给你。所以,如果你想要修改kubespray代码,那就由你来决定。我用kubeadm集群做了所有的测试,但是把它应用到kubeadm上应该不是很困难。

我将首先将所有必须完成的步骤总结为4个步骤:

标记instances

  • enabling云提供商functionality

  • IAM和服务信息accounts

  • additional

对实例进行标记 GCP上的所有工作节点实例都必须使用唯一的标记进行标记,这是实例的名称;这些标记稍后用于为LB创建防火墙规则和目标列表。假设您有一个名为worker-0的实例;您需要使用标记worker-0对该实例进行标记

否则将导致错误(可以在控制器管理器日志中找到):

代码语言:javascript
复制
Error syncing load balancer: failed to ensure load balancer: no node tags supplied and also failed to parse the given lists of hosts for tags. Abort creating firewall rule

启用云提供商功能必须告知 K8s它在云中运行,以及它是哪个云提供商,以便它知道如何与对话。

控制器管理器日志通知您它不会创建LB。

代码语言:javascript
复制
WARNING: no cloud provider provided, services of type LoadBalancer will fail

控制器管理器负责创建LoadBalancer。可以向它传递一个标志--cloud-provider。您可以手动将此标志添加到控制器管理器pod清单文件中;或者,就像在您的示例中一样,既然您运行的是maybe,您可以将此标志添加到kubespray代码中的某个位置(可能它已经自动完成,只需要您设置一些env或sth,但您需要自己找到它)。

下面是这个带有标志的文件的外观:

代码语言:javascript
复制
apiVersion: v1
kind: Pod
metadata:
  labels:
    component: kube-controller-manager
    tier: control-plane
  name: kube-controller-manager
  namespace: kube-system
spec:
  containers:
  - command:
    - kube-controller-manager
    ...
    - --cloud-provider=gce    # <----- HERE

正如你所看到的,在我们的例子中的值是gce,它是Google Compute Engine的stang。它通知k8s它在GCE/GCP上运行。

IAM和服务帐户现在您已经启用了您的提供商,并且介绍了标记,我将讨论IAM和权限。

为了让k8s能够在GCE中创建LB,需要允许它这样做。每个GCE实例都分配了一个默认服务帐户。Controller Manager使用存储在instance metadata中的实例服务帐户来访问GCP。

为此,您需要为GCE实例(主节点;控制器管理器正在运行的节点)设置Access Scopes,以便它可以使用云引擎API。

访问范围->设置每次->计算engine=Read写入的访问权限

为此,必须停止该实例,因此现在停止该实例。最好在创建实例时设置这些作用域,这样就不需要执行任何不必要的步骤。

您还需要进入监控管理&管理页面,添加权限,这样主实例的服务账号才会分配到Kubernetes Engine Service Agent角色。这是一个预定义的角色,它具有比您可能需要的权限多得多的权限,但我发现所有工作都与此角色有关,因此我决定使用此角色进行演示,但您可能希望使用最小权限规则。

附加信息还有一件事我需要提一下。它不会影响你,但在测试过程中,我发现了一件有趣的事情。

首先,我只创建了一个节点集群(单个主节点)。即使从k8s的角度来看,这是允许的,控制器管理器也不允许我创建LB并将其指向我的应用程序正在运行的主节点。由此得出的结论是,LB不能只与主节点一起使用,必须至少创建一个工作节点。

另外,我不得不用一种艰难的方式来解决这个问题;通过查看日志,更改内容,再次查看日志,看看问题是否得到了解决。我找不到任何一篇文章/文档页面将它记录在一个地方。如果你自己解决了这个问题,那就把答案写给别人吧。谢谢。

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

https://stackoverflow.com/questions/67600909

复制
相关文章

相似问题

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