使用kube-vip实现集群VIP访问

使用kube-vip实现集群VIP访问

k8e集群默认内置了api-server的地址访问负载机制,当你安装成功后,任意宕机一台机器,都可以访问任何一台存活的api-server机器来和集群交互。因为缺少VIP,如果你部署了管理容器集群的面板是,一般都需要你提供api-server的VIP地址。这个场景一般我们通过haproxy来实现,但是考虑到云原生的发展,kube-vip进入候选组件,它支持k8s control plan VIP的实现。本文通过简单的几步来介绍如何部署kube-vip。

安装kube-vip

kube-vip项目实现了两大功能Service LB和k8s control plan VIP,很容易让人陷入复杂的配置。这里简单来讲,你需要2样配置:

1、rabc.yaml和kube-vip-ds.yaml kubevip配置文件,支持权限和部署脚本配置 2、kube-vip镜像 镜像使用最新的版本,目前为v0.5.12

官方文档介绍如何生成部署脚本,个人感觉挺懵人的,直接提供配置文件:

kubectl apply -f https://kube-vip.io/manifests/rbac.yaml

使用daemonset部署kube-vip

默认kube-vip支持static pod和daemonset两种模式,建议选择daemonset模式。注意,需要手工修改网卡名称和VIP IP。 初始化变量如下: 用于控制平面的VIP地址设置为:

export VIP=192.168.0.40

将INTERFACE名称设置为将在其上联通VIP的控制平面的接口名称。在许多Linux发行版中,这可以通过ip a命令找到。

export INTERFACE=ens160

通过解析GitHub API获取kube-vip发布的最新版本。此步骤需要安装jq和curl。

KVVERSION=$(curl -sL https://api.github.com/repos/kube-vip/kube-vip/releases | jq -r ".[0].name")

或者手工指定:

export KVVERSION=v0.5.12

初始化 kubevip 的权限

kubectl apply -f https://kube-vip.io/manifests/rbac.yaml

然后配置 kubevip 方案,针对 k8e containerd 创建 kubevip 命令:

alias kube-vip="ctr image pull ghcr.io/kube-vip/kube-vip:$KVVERSION; ctr run --rm --net-host ghcr.io/kube-vip/kube-vip:$KVVERSION vip /kube-vip"

生成 Yaml 文件kubevip-ds.yaml:

kube-vip manifest daemonset \
     --interface $INTERFACE \
     --address $VIP \
     --inCluster \
     --taint \
     --controlplane \
     --services \
     --arp \
     --leaderElection > kubevip-ds.yaml

kubectl apply -f kubevip-ds.yaml 创建 kubevip 服务

[root@ip-172-31-6-27 ~]# kubectl get pods -n kube-system | grep -i vip
kube-vip-ds-ffd78                         1/1     Running   0          5m22s
kube-vip-ds-hjnfg                         1/1     Running   0          5m22s
kube-vip-ds-qxbxz                         1/1     Running   0          5m22s

验证 KubeVIP 对 APIServer 的效果

这里 VIP 会被 kubevip daemonset 分配到一台主机上,当你关闭这台主机,kubevip 会自动把 VIP 迁移到另外一台节点上。每次只有一台主机来充当 VIPServer 的入口 IP。对于容器管理平台接入集群可以实现高可用。

参考资料

  • https://kube-vip.io/docs/installation/daemonset/