5

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

 1 year ago
source link: https://www.jdon.com/67608.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

使用 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名称下部署的。

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK