使用 Skupper 实现 Kubernetes 多集群负载均衡


在本文中,您将了解如何利用Skupper在多个 Kubernetes 集群上运行的应用程序实例之间实现负载平衡。我们将使用 Kind 在本地创建一些 Kubernetes 集群。然后我们将使用 Skupper 连接它们。

Skupper集群互连工作在第7层(应用层)。这意味着无需创建任何 VNP 或特殊的防火墙规则。Skupper 按照虚拟应用网络 (VAN) 方法进行工作。因此,它可以连接不同的 Kubernetes 集群并保证服务之间的通信,而无需将它们暴露在互联网上。

GitHub 存储库:这次我们将使用命令行工具 ( skupperCLI) 完成几乎所有操作。该存储库仅包含一个示例应用程序 Spring Boot 以及 KubernetesDeployment清单和 Skaffold 配置。

使用 Kind 创建 Kubernetes 集群
第一步,我们将使用 Kind 创建三个 Kubernetes 集群。我们需要给它们起不同的名称:c1、c2和c3。因此,它们可以在上下文名称下使用:kind-c1、kind-c2和kind-c3。

$ kind create cluster --name c1
$ kind create cluster --name c2
$ kind create cluster --name c3

默认情况下,Skupper 将自身公开为 Kubernetes LoadBalancer Service。因此,我们需要在 Kind 上启用负载均衡器。为此,我们可以安装 MetalLB。

$ kubectx kind-c1

然后,我们必须应用以下 YAML 清单:

$ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.7/config/manifests/metallb-native.yaml

应该对其他两个集群重复相同的过程:c2和c3。

我们还需要设置负载均衡器使用的地址池。为此,我们首先检查 Kind 使用的 Docker 网络上的 IP 地址范围。对我来说是的172.19.0.0/16 172.19.0.1。

$ docker network inspect -f '{{.IPAM.Config}}' kind

根据结果​​,我们需要为所有三种集群选择正确的 IP 地址。然后我们必须创建IPAddressPool包含 IP 范围的对象。以下是集群的 YAML 清单c1:

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: example
  namespace: metallb-system
spec:
  addresses:
  - 172.19.255.200-172.19.255.250
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: empty
  namespace: metallb-system

这是例如 c2 c3集群的池配置。重要的是,地址范围不应与其他两个 Kind 集群中的范围冲突:

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: example
  namespace: metallb-system
spec:
  addresses:
  - 172.19.255.150-172.19.255.199
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: empty
  namespace: metallb-system

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: example
  namespace: metallb-system
spec:
  addresses:
  - 172.19.255.100-172.19.255.149
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: empty
  namespace: metallb-system

使用命令应用 YAML 清单后,kubectl apply -f 

我们可以继续下一部分。

在 Kubernetes 上安装 Skupper
我们可以通过两种不同的方式在 Kubernetes 上安装和管理 Skupper:使用 CLI 或通过 YAML 清单。

Skupper 文档中的大多数示例都使用 CLI,因此我认为这是一种更好的方法。因此,在开始使用 Kubernetes 之前,我们需要安装 CLI。您可以在此处的Skupper 文档中找到安装说明。安装后,只需使用以下命令验证它是否有效:

$ skupper version

之后,我们就可以继续进行 Kubernetes 集群了。我们将在所有三个集群中创建相同的命名空间interconnect。为了简化我们即将进行的练习,我们还可以为每个上下文设置默认名称空间(或者您可以使用命令来完成kubectl config set-context --current --namespace interconnect)。

$ kubectl create ns interconnect
$ kubens interconnect

然后,我们切换到kind-c1集群。我们将保持这种情况直到演习结束

$ kubectx kind-c1

最后,我们将在 Kubernetes 集群上安装 Skupper。为此,我们必须执行该skupper init命令。幸运的是,它允许我们使用参数设置目标 Kubernetes 上下文-c。在集群内部kind-c1,我们还将启用 Skupper UI 仪表板(--enable-console参数)。通过 Skupper 控制台,我们可以可视化 Skupper 网络中所有目标的流量。

$ skupper init --enable-console --enable-flow-collector
$ skupper init -c kind-c2
$ skupper init -c kind-c3

让我们验证 Skupper 安装的状态:

$ skupper status
$ skupper status -c kind-c2
$ skupper status -c kind-c3

使用 Skaffold 在 Kubernetes 上运行示例应用程序
Clone本教程github示例应用程序存储库后,转到主目录。您可以使用以下命令轻松构建kind-c2和部署应用程序:kind-c3

$ skaffold dev --kube-context=kind-c2
$ skaffold dev --kube-context=kind-c3

部署应用程序 skaffold 后会自动打印所有日志.

我们的应用程序是在该sample-spring-kotlin-microservice名称下部署的。

更新详细的集群测试场景点击标题