本文档采用自动化机器翻译技术翻译。 尽管我们力求提供准确的译文,但不对翻译内容的完整性、准确性或可靠性作出任何保证。 若出现任何内容不一致情况,请以原始 英文 版本为准,且原始英文版本为权威文本。

集群负载平衡器

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

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

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

先决条件

本示例中的所有节点均运行Ubuntu 20.04。

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

每个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

  • Nginx

HAProxy 是一个提供 TCP 负载均衡器的开源选项。它还支持负载均衡器本身的高可用性,确保各级别的冗余。有关更多信息,请参见 HAProxy 文档

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

  1. 安装 HAProxy 和 KeepAlived:

    sudo apt-get install haproxy keepalived
  2. 在 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
  3. 在 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
        }
    }
  4. 在 lb-1 和 lb-2 上重启 HAProxy 和 KeepAlived:

    systemctl restart haproxy
    systemctl restart keepalived
  5. 在 agent-1、agent-2 和 agent-3 上运行以下命令以安装 k3s 并加入集群:

    curl -sfL https://get.k3s.io | INSTALL_K3S_ARTIFACT_URL=<PRIME-ARTIFACTS-URL>/k3s K3S_TOKEN=lb-cluster-gd sh -s - agent --server https://10.10.10.100:6443

    其中 INSTALL_K3S_ARTIFACT_URL主要工件 URL

    您现在可以从服务器节点使用 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

Nginx 本身不支持高可用性 (HA) 配置。如果设置 HA 集群,在 K3s 前面有一个单一的负载均衡器将重新引入单点故障。

Nginx 开源 提供 TCP 负载均衡器。有关更多信息,请参见 使用 nginx 作为 HTTP 负载均衡器

  1. 在 lb-1 上创建一个 nginx.conf 文件,包含以下内容:

    events {}
    
    stream {
      upstream k3s_servers {
        server 10.10.10.50:6443;
        server 10.10.10.51:6443;
        server 10.10.10.52:6443;
      }
    
      server {
        listen 6443;
        proxy_pass k3s_servers;
      }
    }
  2. 在 lb-1 上运行 Nginx 负载均衡器:

    使用 Docker:

    docker run -d --restart unless-stopped \
        -v ${PWD}/nginx.conf:/etc/nginx/nginx.conf \
        -p 6443:6443 \
        nginx:stable

    或者 安装 nginx 然后运行:

    cp nginx.conf /etc/nginx/nginx.conf
    systemctl start nginx
  3. 在 agent-1、agent-2、agent-3 上运行以下命令以安装 k3s 并加入集群:

    curl -sfL https://get.k3s.io | INSTALL_K3S_ARTIFACT_URL=<PRIME-ARTIFACTS-URL>/k3s K3S_TOKEN=lb-cluster-gd sh -s - agent --server https://10.10.10.98:6443

    您现在可以从服务器节点使用 kubectl 与集群进行交互。

    root@server1 $ k3s kubectl get nodes -A
    NAME       STATUS   ROLES                       AGE     VERSION
    agent-1    Ready    <none>                      30s     v1.27.3+k3s1
    agent-2    Ready    <none>                      22s     v1.27.3+k3s1
    agent-3    Ready    <none>                      13s     v1.27.3+k3s1
    server-1   Ready    control-plane,etcd,master   4m49s   v1.27.3+k3s1
    server-2   Ready    control-plane,etcd,master   3m58s   v1.27.3+k3s1
    server-3   Ready    control-plane,etcd,master   3m16s   v1.27.3+k3s1