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

时间:2021-05-19 09:51:01

标签: kubernetes google-cloud-platform load-balancing kubespray

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

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

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

1 个答案:

答案 0 :(得分:1)

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

问题是你有自托管的 kubernetes 集群,你希望能够创建一个 type=LoadBalancer 的服务,你希望 k8s 使用 externlIP 和完全自动化的方式为你创建一个 LB,就像它会那样如果您使用 GKE(kubernetes 即服务解决方案)。

另外我不得不提一下,我对kubespray知之甚少,所以我只会描述使其工作所需的所有步骤,其余的留给您。因此,如果您想对 kubespray 代码进行更改,这取决于您。 我用 kubeadm cluster 做的所有测试,但是把它应用到 kubespray 应该不是很困难。


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

  1. 标记实例
  2. 启用云提供商功能
  3. IAM 和服务帐号
  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 代码的某处添加这个标志(也许它已经自动化了,只需要你设置一些 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。它通知 k8s 它在 GCE/GCP 上运行。


IAM 和服务帐户 既然您已经启用了您的提供商并涵盖了标签,我将讨论 IAM 和权限。

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

为此,您需要为 GCE 实例(主节点;运行控制器管理器的节点)设置访问范围,以便它可以使用 Cloud Engine API。

<块引用>

访问范围 -> 为每个 API 设置访问权限 -> 计算引擎=读写

要做到这一点,必须停止实例,所以现在停止实例。最好在创建实例时设置这些范围,这样您就不需要执行任何不必要的步骤。

您还需要转到 GCP Console 中的 IAM 和管理页面并添加权限,以便为主实例的服务帐户分配 Kubernetes Engine Service Agent 角色。这是一个预定义的角色,它具有比您可能需要的权限多得多的权限,但我发现所有内容都适用于此角色,因此我决定使用该角色仅用于演示目的,但您可能希望使用最低权限规则 .


其他信息 还有一件事我需要提一下。它不会影响您,但在测试时我发现了一件有趣的事情。

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


附注 我不得不以艰难的方式解决它;通过查看日志、更改内容并再次查看日志以查看问题是否已解决。我没有找到将它记录在一个地方的单个文章/文档页面。如果您设法自己解决,请为他人写答案。谢谢。