首页 / 最佳实践 / 网络 / 纯软数据中心 LB 方案(Alpha)

纯软数据中心 LB 方案(Alpha)

部署纯软数据中心 LB,通过在集群外部创建高可用负载均衡器,为集群多个 ALB 提供负载均衡能力,保证业务稳定运行。

前提条件

  1. 准备两台或者两台以上的主机节点作为 LB。推荐 LB 节点安装 Ubuntu 22.04 操作系统,可减少 LB 向异常 backend 节点转发流量的时间。

  2. 在外部 LB 所有主机节点上提前安装以下软件(本章以两台外部 LB 主机节点为例):

    • ipvsadm

    • Docker(20.10.7)

  3. 使用以下命令确保每台主机 Docker 服务开机自启:sudo systemctl enable docker.service

  4. 每台主机节点时钟确保一致。

  5. 准备 Keepalived 的镜像,用于启动外部 LB 服务,该镜像平台已内置,镜像地址如下:<镜像仓库地址>/tkestack/keepalived:v3.11.2

    提示:可在使 Global 集群中使用 kubectl get prdb base -o json | jq .spec.registry.address 命令来获取 <镜像仓库地址> 参数。

操作步骤

注意:以下所有操作均在每台外部 LB 主机节点上运行一次,且主机节点的 hostname 不允许重复。

  1. 将如下配置信息添加至文件 /etc/modules-load.d/alive.kmod.conf

    ip_vs
    ip_vs_rr
    ip_vs_wrr
    ip_vs_sh
    nf_conntrack_ipv4
    nf_conntrack
  2. 将如下配置信息添加至文件 /etc/sysctl.d/alive.sysctl.conf

    net.ipv4.ip_forward = 1
    net.ipv4.conf.all.arp_accept = 1
    net.ipv4.vs.conntrack = 1
    net.ipv4.vs.conn_reuse_mode = 0
    net.ipv4.vs.expire_nodest_conn = 1
    net.ipv4.vs.expire_quiescent_template = 1
  3. 使用 reboot 命令重启。

  4. 创建 Keepalived 配置文件的文件夹。

    mkdir -p /etc/keepalived
    mkdir -p /etc/keepalived/kubecfg
  5. 按照如下文件的注释修改配置项后,存放在 /etc/keepalived/ 文件夹中,命名为 alive.yaml

    global_cfg: |  # extra cfg write to  global_defs
      vmac_prefix acp-vrrp
    instances:
      - vip: # 可以配置多个 vip
          vip: 192.168.39.99 # vip 必须不同
          id: 20 # 每个 vip 的 id 必须不同 optional
          interface: "ens192" # 修改为当前机器网卡名称
          instance_cfg: |  # extra cfg write to vrrp_instance, optional
            check_unicast_src
          check_interval: 1 # optional default 1 执行 check 脚本的时间间隔
          check_timeout: 3  # optional default 3 执行 check 脚本的超时时间
          name: "vip-1" # 用来标识这个 instance 只能由字母数字连字符组成,开头不能是连字符
          peer: [ "192.168.39.21", "192.168.39.22" ] # keepalived 节点 ip 实际生成的 keepalived.conf 中会去掉所有在 interface 上的 ip  https://github.com/osixia/docker-keepalived/issues/33
          kube_lock:
            ns: "kube-system" # optional,默认 kube-system
            kubecfgs: # kube-lock 使用的 kube-config list 会依次尝试这些 kubecfg 来为 keepalived 做 leader election
              - "/live/cfg/kubecfg/kubecfg01.conf"
              - "/live/cfg/kubecfg/kubecfg02.conf"
              - "/live/cfg/kubecfg/kubecfg03.conf"
        ipvs: # optiaon ipvs的配置
          ips: [ "192.168.16.210", "192.168.116.212", ] # ipvs 后端,ip 修改为 alb 节点的 node ip 地址。
          ports: # 配置 vip 上每个端口的检查健康逻辑
            - port: 6443 # vserver 的端口和 realserver 的端口保持一致
              virtual_server_config: |
                delay_loop 10  # 执行 realserver 健康检查的时间间隔
                lb_algo rr
                lb_kind NAT
                protocol TCP
              raw_check: |
                SSL_GET {
                    url {
                        path /healthz
                    }
                    connect_timeout 1
                    connect_port 1936 # 配置对 alb 端口的健康检查,connect_port 为 alb 的 metrics 端口而不是 alive 转发的端口。global 集群端口为 11782,业务集群为 1936。
                }
            - port: 80
              virtual_server_config: |
                delay_loop 10
                lb_algo rr
                lb_kind NAT
                protocol TCP
              raw_check: |
                TCP_CHECK {
                    connect_timeout 1
                    connect_port 1936
                }
            - port: 53
              virtual_server_config: |
                delay_loop 10
                lb_algo rr
                lb_kind NAT
                protocol UDP
              raw_check: |
                TCP_CHECK {
                    connect_timeout 1
                    connect_port 1936
                }
  6. 检查配置文件的证书过期时间,确保证书处于有效期内。证书过期后 LB 功能将不可用,此时需联系平台管理员更新证书。

    openssl x509 -in <(cat /etc/kubernetes/admin.conf | grep client-certificate-data | awk '{print $NF}' | base64 -d ) -noout -dates
    notBefore=May 30 08:56:06 2023 GMT
    notAfter=May 27 08:57:25 2033 GMT
  7. 在本平台 Kubernetes 集群三个 Master 节点中的 /etc/kubernetes/admin.conf 文件复制到外部 LB 节点的 /etc/keepalived/kubecfg 文件夹中,并以序号命名,例如:kubecfg01.conf,再将这三个文件中的 apiserver 节点地址修改成 Kubernetes 集群对应的 apiserver 真实节点地址。

    注意:平台证书更新后,需要重新执行本步骤,并覆盖原有文件。

  8. 检测证书有效性。

    1. 将业务集群 Master 节点上的 /usr/bin/kubectl 拷贝到 LB 节点。

    2. 执行 chmod +x /usr/bin/kubectl 命令赋予执行权限。

    3. 执行如下命令确认证书有效性。

      kubectl --kubeconfig=/etc/keepalived/kubecfg/kubecfg01.conf get node
      kubectl --kubeconfig=/etc/keepalived/kubecfg/kubecfg02.conf get node
      kubectl --kubeconfig=/etc/keepalived/kubecfg/kubecfg03.conf get node
  9. 上传 Keepalived 的镜像到外部 LB 节点上并使用 Docker 运行 Keepalived。

    docker run -dt --restart=always --privileged --network=host -v /etc/keepalived:/live/cfg build-harbor.alauda.cn/tkestack/keepalived:v3.11.2
  10. 在访问 keepalvied 的节点上运行以下命令:sysctl -w net.ipv4.conf.all.arp_accept=1

验证

  1. 使用 telnet 命令访问 VIP,例如:telnet 192.168.39.99 80,正常访问。

  2. 重启其中一个外部 LB 节点,使用 telnet 命令访问 VIP,流量可以转发至配置的后端服务。