我使用VM和Kubespray在Google Cloud上部署了一个kubernetes集群。
现在,我希望使用loadbalancer将一个简单的节点应用程序暴露给外部IP,但显示我从gcloud到服务的外部IP不起作用。当我查询kubectl get services时,它停留在挂起状态。
根据this的说法,默认情况下,kubespray没有包含/集成任何负载均衡器机制。我应该如何进步?
发布于 2021-05-21 17:41:10
让我首先总结一下我们试图在这里解决的问题。
问题是,你有一个自托管的kubernetes集群,你想要创建一个type=LoadBalancer的服务,你想让k8s用externlIP以全自动的方式为你创建LB,就像你使用GKE (kubernetes作为服务解决方案)一样。
另外,我不得不提一下,我不太了解steps祈祷,所以我将只描述所有需要做的步骤,让它工作,剩下的留给你。所以,如果你想要修改kubespray代码,那就由你来决定。我用kubeadm集群做了所有的测试,但是把它应用到kubeadm上应该不是很困难。
我将首先将所有必须完成的步骤总结为4个步骤:
标记instances
对实例进行标记 GCP上的所有工作节点实例都必须使用唯一的标记进行标记,这是实例的名称;这些标记稍后用于为LB创建防火墙规则和目标列表。假设您有一个名为worker-0的实例;您需要使用标记worker-0对该实例进行标记
否则将导致错误(可以在控制器管理器日志中找到):
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。
WARNING: no cloud provider provided, services of type LoadBalancer will fail控制器管理器负责创建LoadBalancer。可以向它传递一个标志--cloud-provider。您可以手动将此标志添加到控制器管理器pod清单文件中;或者,就像在您的示例中一样,既然您运行的是maybe,您可以将此标志添加到kubespray代码中的某个位置(可能它已经自动完成,只需要您设置一些env或sth,但您需要自己找到它)。
下面是这个带有标志的文件的外观:
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不能只与主节点一起使用,必须至少创建一个工作节点。
另外,我不得不用一种艰难的方式来解决这个问题;通过查看日志,更改内容,再次查看日志,看看问题是否得到了解决。我找不到任何一篇文章/文档页面将它记录在一个地方。如果你自己解决了这个问题,那就把答案写给别人吧。谢谢。
https://stackoverflow.com/questions/67600909
复制相似问题