作者简介
王海龙,Rancher 中国社区技术经理,Linux Foundation APAC Evangelist,负责 Rancher 中国技术社区的保护和经营。领有 9 年的云计算畛域教训,经验了 OpenStack 到 Kubernetes 的技术改革,无论底层操作系统 Linux,还是虚拟化 KVM 或是 Docker 容器技术都有丰盛的运维和实践经验。
容器化和云原生利用疾速倒退,K3s 成为了备受瞩目的轻量级 Kubernetes 发行版。在生产环境中,单点故障可能导致整个集群的不可用,高可用对用户至关重要。
K3s 自身能够主动实现管制立体的高可用,但短少一个具备高可用的访问控制立体入口;毕竟,用户不想依附一个繁多的节点来拜访 Kubernetes 集群的 API。对此,用户能够借助 kube-vip 工具来实现 K3s 管制立体的高可用,从而确保 K3s 集群在面临故障时仍能提供稳固牢靠的服务。本文将对此进行具体介绍。
什么是 kube-vip
kube-vip 是一个功能强大的工具,它能够通过虚构 IP(VIP)来实现 Kubernetes 集群的高可用。它能够监控集群中的 Master 节点,并在主节点故障时主动切换到备用节点,以确保集群的继续可用性。
kube-vip 有两种应用模式:ARP 模式和 BGP 模式。这两种模式都可用于在 Kubernetes 集群中创立和治理高可用虚构 IP 地址。
- ARP 模式:在 ARP 模式下,kube-vip 应用 ARP(地址解析协定)来实现 IP 转发。它通过在集群中的节点之间发送 ARP 申请和响应来实现负载平衡和故障转移。当一个节点接管到 ARP 申请时,它会答复申请并接管 IP 地址。这种模式简略且易于配置,不须要任何其余的内部依赖。
- BGP 模式:在 BGP 模式下,kube-vip 应用 BGP(边界网关协定)来实现 IP 转发。BGP 是一种用于在不同自治零碎(AS)之间替换路由信息的路由协定。在 BGP 模式中,kube-vip 在 Kubernetes 集群外部模仿了一个 BGP 路由器,各个节点通过 BGP 会话将路由信息替换给 kube-vip,并由 kube-vip 将流量导向适当的节点。这种模式通常在须要与内部网络进行互连或实现更高级的路由策略时应用,它须要额定的配置和与网络设备(如路由器)的集成。
抉择哪种模式取决于集群的需要和网络环境。ARP 模式简略易用,适宜于较小规模的集群或在没有简单网络配置的状况下。BGP 模式则实用于更大规模的集群,须要与内部网络进行交互或实现高级路由策略的状况下。
本文演示的示例采纳的是 ARP 模式。更多应用形式可参考 kube-vip 文档:https://kube-vip.io/docs/
通过 kube-vip 实现 K3s 管制立体高可用
在上面的示例中,首先生成一个用于部署在 K3s 集群中的 kube-vip Manifest,而后再启动一个高可用的 K3s 集群,启动 K3s 集群时会主动部署 kube-vip 的 Manifest 文件,从而通过 kube-vip 实现管制立体的高可用。
创立 Manifests 文件夹
K3s 有一个可选的 Manifests 目录,K3s 启动时将查看该目录中的 yaml 文件,并主动在 K3s 中部署,参考:https://docs.k3s.io/installation/packaged-components#auto-dep...
首先创立此目录,以便稍后将 kube-vip 资源放入其中:
mkdir -p /var/lib/rancher/k3s/server/manifests/
获取 kube-vip RBAC 清单
kube-vip 在 K3s 下作为 DaemonSet 运行,咱们须要 RBAC 资源来确保 ServiceAccount 存在并进行绑定,来确保它具备与 API 服务器通信所需的权限。
获取 RBAC 清单并将其搁置在主动部署目录中:
curl https://kube-vip.io/manifests/rbac.yaml > /var/lib/rancher/k3s/server/manifests/kube-vip-rbac.yaml
生成 kube-vip DaemonSet 清单
export VIP=192.168.205.200 # 设置虚构 IP 用于访问控制立体的地址export INTERFACE=ens3 # 设置管制立体所在主机的网卡名称KVVERSION=$(curl -sL https://api.github.com/repos/kube-vip/kube-vip/releases | jq -r ".[0].name") # 获取 kube-vip 版本alias kube-vip="docker run --network host --rm ghcr.io/kube-vip/kube-vip:$KVVERSION" # 针对 docker 环境设置别名# 创立 kube-vip 清单kube-vip manifest daemonset \ --interface $INTERFACE \ --address $VIP \ --inCluster \ --taint \ --controlplane \ --services \ --arp \ --leaderElection > /var/lib/rancher/k3s/server/manifests/kube-vip.yaml
装置 HA K3s 集群
K3s 反对多种 HA 装置形式,本次示例采纳嵌入式 ETCD 的形式搭建高可用的 K3s 集群,这样集群中就存在了 3 个管制立体,而后通过 kube-vip 实现这些管制立体的高可用。
装置 K3s 时须要指定 --tls-san
参数,这样 K3s 就会应用 kube-vip 虚构 IP 地址生成 API 服务器证书。
启动第一个节点:
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn \ K3S_TOKEN=SECRET sh -s - server \ --cluster-init \ --system-default-registry "registry.cn-hangzhou.aliyuncs.com" \ --tls-san 192.168.205.200
应用雷同命令启动第二和第三个节点:
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn \ K3S_TOKEN=SECRET sh -s - server \ --server https://<ip or hostname of server1>:6443 \ --system-default-registry "registry.cn-hangzhou.aliyuncs.com" \ --tls-san 192.168.205.200
查看节点运行状况:
查看 kube-vip daemonset,咱们应该会看到 kube-vip-ds 曾经胜利启动:
验证 K3s 管制立体的高可用
查看虚构 IP 地址是否无效
kube-vip daemonset 启动胜利后,应该看到 kube-vip 配置的虚构 IP 地址能够 ping 通:
将 kubeconfig 更改为 kube-vip 的虚构 IP 地址
将 K3s 生成的 kubeconfig 文件下载到本地,并将默认的 127.0.0.1 改为虚构 IP 地址:192.168.205.200。
能够看到,应用虚拟机 IP 能够持续通过 kubeconfig 拜访 Kubernetes API。
模仿 K3s 管制立体故障,kube-vip 虚构 IP 切换
当初咱们曾经配置了 kube-vip,并且能够通过虚构 IP 拜访到某个管制立体。接下来让咱们执行理论测试,看看 kube-vip 虚构 IP 是否按预期进行故障转移。
此时,能够通过 ip addr show ens3
确认虚构 IP 落在了 k3s1 主机上:
接下来,咱们能够将 k3s1 主机关机,模仿故障:
正如所看到的,当 k3s1 主机产生故障,kube-vip 的虚构 IP 能够主动切换到其余主机,并且咱们能够持续应用该虚拟机 IP 去拜访 Kubernetes API:
总 结
通过应用 kube-vip,咱们能够轻松实现 K3s 管制立体的高可用。kube-vip 提供了一个简略而弱小的解决方案,通过虚构 IP 和主动切换机制,确保在 Master 节点故障时,集群仍能继续对外提供服务。
kube-vip 能够通过指定虚构 IP 和监听端口来监控集群中的 Master 节点的衰弱状态,并在主节点故障时主动将虚构 IP 切换到其余节点上。
总之,kube-vip 是实现 K3s 管制立体高可用的现实工具。它简略的装置和配置过程让任何用户都能够轻松部署和治理高可用的 K3s 集群。通过应用 kube-vip,用户能够释怀地在生产环境中运行 K3s,并确保集群的继续可用性和稳定性。