我使用虚拟机和Kubespray在 Google Cloud 上部署了一个 kubernetes 集群。
现在,我希望使用负载均衡器向外部 IP 公开一个简单的节点应用程序,但 将我的外部 IP 从 gcloud 显示到服务不起作用。当我查询时它保持挂起状态kubectl get services
。
据此, kubespray 默认不包含/集成任何负载均衡器机制。我应该如何进步?
我使用虚拟机和Kubespray在 Google Cloud 上部署了一个 kubernetes 集群。
现在,我希望使用负载均衡器向外部 IP 公开一个简单的节点应用程序,但 将我的外部 IP 从 gcloud 显示到服务不起作用。当我查询时它保持挂起状态kubectl get services
。
据此, kubespray 默认不包含/集成任何负载均衡器机制。我应该如何进步?
让我首先总结一下我们在这里试图解决的问题。
问题是您拥有自托管的 kubernetes 集群,并且您希望能够创建 type=LoadBalancer 的服务,并且您希望 k8s 使用 externlIP 以完全自动化的方式为您创建 LB,就像您使用GKE(kubernetes 即服务解决方案)。
另外我不得不提一下,我对 kubespray 了解不多,所以我只会描述使其工作所需完成的所有步骤,剩下的交给你。因此,如果您想更改 kubespray 代码,一切由您决定。我对 kubeadm cluster 进行的所有测试,但将其应用于 kubespray 应该不是很困难。
我将首先将所有必须完成的工作总结为 4 个步骤:
标记实例
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 必须被告知它正在云中运行以及它是什么云提供商,以便它知道如何与 api 对话。
控制器管理器日志通知您它不会创建 LB。
WARNING: no cloud provider provided, services of type LoadBalancer will fail
Controller Manager 负责创建一个 LoadBalancer。它可以传递一个标志--cloud-provider
。您可以手动将此标志添加到控制器管理器 pod 清单文件中;或者就像你的情况一样,因为你正在运行 kubespray,你可以在 kubespray 代码中的某个地方添加这个标志(也许它已经自动化了,只需要你设置一些环境或某事,但你需要自己找出来)。
这是带有标志的文件的样子:
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。它通知 k8s 它在 GCE/GCP 上运行。
IAM 和服务帐户 现在您已启用您的提供程序并涵盖了标签,我将讨论 IAM 和权限。
为了让 k8s 能够在 GCE 中创建 LB,它需要被允许这样做。每个 GCE 实例都分配了一个默认服务帐户。Controller Manager 使用存储在实例元数据中的实例服务帐户来访问 GCP API。
为此,您需要为 GCE 实例(主节点;运行控制器管理器的节点)设置访问范围,以便它可以使用 Cloud Engine API。
访问范围 -> 为每个 API 设置访问权限 -> 计算引擎 = 读写
为此,必须停止实例,所以现在停止实例。最好在实例创建期间设置这些范围,这样您就不需要执行任何不必要的步骤。
您还需要转到 GCP Console 中的 IAM 和管理页面并添加权限,以便主实例的服务帐户具有Kubernetes Engine Service Agent
分配的角色。这是一个预定义的角色,它的权限比您可能需要的要多得多,但我发现一切都适用于这个角色,所以我决定使用它来进行演示,但您可能希望使用最低权限规则。
附加信息 还有一件事我需要提及。它不会影响你,但在测试时我发现了一件有趣的事情。
首先,我只创建了一个节点集群(单个主节点)。即使从 k8s 的角度来看这是允许的,控制器管理器也不允许我创建 LB 并将其指向运行我的应用程序的主节点。由此得出结论,不能仅使用主节点的 LB,必须创建至少一个工作节点。
PS我不得不费劲地想办法;通过查看日志、更改内容并再次查看日志以查看问题是否得到解决。我没有找到在一个地方记录的单个文章/文档页面。如果您设法为自己解决它,请为其他人写下答案。谢谢你。