跳至主要内容

集群负载均衡器

本节介绍如何在高可用性 (HA) K3s 集群的服务器节点前面安装外部负载均衡器。提供了两个示例:Nginx 和 HAProxy。

提示

外部负载均衡器不应该与嵌入式 ServiceLB 混淆,ServiceLB 是一个嵌入式控制器,允许在不部署第三方负载均衡器控制器的情况下使用 Kubernetes LoadBalancer 服务。有关更多详细信息,请参阅 服务负载均衡器

外部负载均衡器可用于为注册节点提供固定的注册地址,或用于外部访问 Kubernetes API 服务器。对于公开 LoadBalancer 服务,外部负载均衡器可以与 ServiceLB 一起使用或代替 ServiceLB,但在大多数情况下,MetalLB 或 Kube-VIP 等替代负载均衡器控制器是更好的选择。

先决条件

此示例中的所有节点都在运行 Ubuntu 20.04。

对于这两个示例,假设已在 3 个节点上安装了 具有嵌入式 etcd 的 HA K3s 集群

每个 k3s 服务器都配置了

# /etc/rancher/k3s/config.yaml
token: lb-cluster-gd
tls-san: 10.10.10.100

节点具有以下主机名和 IP 地址:

  • server-1: 10.10.10.50
  • server-2: 10.10.10.51
  • server-3: 10.10.10.52

用于负载均衡的另外两个节点配置了以下主机名和 IP 地址:

  • lb-1: 10.10.10.98
  • lb-2: 10.10.10.99

另外三个节点存在,主机名和 IP 地址为:

  • agent-1: 10.10.10.101
  • agent-2: 10.10.10.102
  • agent-3: 10.10.10.103

设置负载均衡器

HAProxy 是一种开源选项,提供 TCP 负载均衡器。它还支持负载均衡器本身的 HA,确保所有级别的冗余。有关更多信息,请参阅 HAProxy 文档

此外,我们将使用 KeepAlived 生成一个虚拟 IP(VIP),该虚拟 IP 将用于访问集群。有关更多信息,请参阅 KeepAlived 文档

  1. 安装 HAProxy 和 KeepAlived
sudo apt-get install haproxy keepalived
  1. 在 lb-1 和 lb-2 上将以下内容添加到 /etc/haproxy/haproxy.cfg
frontend k3s-frontend
bind *:6443
mode tcp
option tcplog
default_backend k3s-backend

backend k3s-backend
mode tcp
option tcp-check
balance roundrobin
default-server inter 10s downinter 5s
server server-1 10.10.10.50:6443 check
server server-2 10.10.10.51:6443 check
server server-3 10.10.10.52:6443 check
  1. 在 lb-1 和 lb-2 上将以下内容添加到 /etc/keepalived/keepalived.conf
global_defs {
enable_script_security
script_user root
}

vrrp_script chk_haproxy {
script 'killall -0 haproxy' # faster than pidof
interval 2
}

vrrp_instance haproxy-vip {
interface eth1
state <STATE> # MASTER on lb-1, BACKUP on lb-2
priority <PRIORITY> # 200 on lb-1, 100 on lb-2

virtual_router_id 51

virtual_ipaddress {
10.10.10.100/24
}

track_script {
chk_haproxy
}
}
  1. 在 lb-1 和 lb-2 上重新启动 HAProxy 和 KeepAlived
systemctl restart haproxy
systemctl restart keepalived
  1. 在 agent-1、agent-2 和 agent-3 上,运行以下命令来安装 k3s 并加入集群
curl -sfL https://get.k3s.io | K3S_TOKEN=lb-cluster-gd sh -s - agent --server https://10.10.10.100:6443

您现在可以使用服务器节点上的 kubectl 与集群交互。

root@server-1 $ k3s kubectl get nodes -A
NAME STATUS ROLES AGE VERSION
agent-1 Ready <none> 32s v1.27.3+k3s1
agent-2 Ready <none> 20s v1.27.3+k3s1
agent-3 Ready <none> 9s v1.27.3+k3s1
server-1 Ready control-plane,etcd,master 4m22s v1.27.3+k3s1
server-2 Ready control-plane,etcd,master 3m58s v1.27.3+k3s1
server-3 Ready control-plane,etcd,master 3m12s v1.27.3+k3s1