1

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

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

据此 kubespray 默认不包含/集成任何负载均衡器机制。我应该如何进步?

4

1 回答 1

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 代码中的某个地方添加这个标志(也许它已经自动化了,只需要你设置一些环境或某事,但你需要自己找出来)。

这是带有标志的文件的样子:

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我不得不费劲地想办法;通过查看日志、更改内容并再次查看日志以查看问题是否得到解决。我没有找到在一个地方记录的单个文章/文档页面。如果您设法为自己解决它,请为其他人写下答案。谢谢你。

于 2021-05-21T09:41:10.453 回答