作为"传统"的keepalived
和haproxy
方法的替代方案,kube-vip在一个服务中同时实现了虚拟IP
的管理和负载平衡
。与上述方案2类似,kube-vip
将作为master节点上的静态pod运行。它可以在二层
(使用ARP和leaderElection)和三层
使用BGP对接来实现。
和 keepalived
一样,协商虚拟IP的主机需要在同一个IP子网中
。同样,和haproxy
一样,基于流的负载均衡允许TLS终止由后面的API Server实例处理。
注意 kube-vip
需要访问API服务器,特别是在集群初始化期间(在kubeadm初始阶段)。在这一点上,admin.conf
是唯一的kubeconfig,可供kube-vip
验证并与API服务器进行通信。在集群建立后,建议用户签署一个自定义的客户端kubeconfig,并在到期时手动调整它。
Step 1:设置虚ip 和 网卡
export VIP=192.168.0.40
export INTERFACE=eth0
Step 2:指定一个containerd或docker,用于生成kube-vip.yaml清单
获取最新kube-vip的版本
KVVERSION=$(curl -sL https://api.github.com/repos/kube-vip/kube-vip/releases | jq -r ".[0].name")
或者手动指定kube-vip的版本:
export KVVERSION=vx.x.x
给kube-vip创建一个别名
,然后通过 contianerd 或 Docker 来生成 kube-vip.yaml 文件清单:
containerd
alias kube-vip="ctr run --rm --net-host ghcr.io/kube-vip/kube-vip:$KVVERSION vip /kube-vip"
Docker
alias kube-vip="docker run --network host --rm ghcr.io/kube-vip/kube-vip:$KVVERSION"
Step 3:选择mode
ARP或者BGP,任选一种模式来生成kube-vip.yaml
ARP
使用 leaderElection 启动 kube-vip。当这个实例被选为leader时,它会将vip绑定到指定的接口,对于类型为:LoadBalancer的服务也是一样。
export INTERFACE=eth0
kube-vip manifest pod \
--interface $INTERFACE \
--vip $VIP \
--controlplane \
--arp \
--leaderElection | tee /etc/kubernetes/manifests/kube-vip.yaml
例如生成的yaml文件:
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
name: kube-vip
namespace: kube-system
spec:
containers:
- args:
- manager
env:
- name: vip_arp
value: "true"
- name: port
value: "6443"
- name: vip_interface
value: ens192
- name: vip_cidr
value: "32"
- name: cp_enable
value: "true"
- name: cp_namespace
value: kube-system
- name: vip_ddns
value: "false"
- name: vip_leaderelection
value: "true"
- name: vip_leaseduration
value: "5"
- name: vip_renewdeadline
value: "3"
- name: vip_retryperiod
value: "1"
- name: vip_address
value: 192.168.0.40
image: ghcr.io/kube-vip/kube-vip:v0.4.0
imagePullPolicy: Always
name: kube-vip
resources: {}
securityContext:
capabilities:
add:
- NET_ADMIN
- NET_RAW
- SYS_TIME
volumeMounts:
- mountPath: /etc/kubernetes/admin.conf
name: kubeconfig
hostAliases:
- hostnames:
- kubernetes
ip: 127.0.0.1
hostNetwork: true
volumes:
- hostPath:
path: /etc/kubernetes/admin.conf
name: kubeconfig
status: {}
BGP
与ARP不同,BGP配置中的所有节点将公布虚拟IP地址。
请注意,我们将地址绑定到 lo,因为我们不希望多个设备在公共接口上具有相同的地址。 我们可以在一个逗号分隔的列表中指定所有对等点,格式为address:AS:password:multihop
。
export INTERFACE=lo
kube-vip manifest pod \
--interface $INTERFACE \
--vip $VIP \
--controlplane \
--bgp \
--localAS 65000 \
--bgpRouterID 192.168.0.2 \
--bgppeers 192.168.0.10:65000::false,192.168.0.11:65000::false | tee /etc/kubernetes/manifests/kube-vip.yaml
生产的yaml清单:
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
name: kube-vip
namespace: kube-system
spec:
containers:
- args:
- manager
env:
- name: vip_arp
value: "false"
- name: port
value: "6443"
- name: vip_interface
value: ens192
- name: vip_cidr
value: "32"
- name: cp_enable
value: "true"
- name: cp_namespace
value: kube-system
- name: vip_ddns
value: "false"
- name: bgp_enable
value: "true"
- name: bgp_routerid
value: 192.168.0.2
- name: bgp_as
value: "65000"
- name: bgp_peeraddress
- name: bgp_peerpass
- name: bgp_peeras
value: "65000"
- name: bgp_peers
value: 192.168.0.10:65000::false,192.168.0.11:65000::false
- name: vip_address
value: 192.168.0.40
image: ghcr.io/kube-vip/kube-vip:v0.4.0
imagePullPolicy: Always
name: kube-vip
resources: {}
securityContext:
capabilities:
add:
- NET_ADMIN
- NET_RAW
- SYS_TIME
volumeMounts:
- mountPath: /etc/kubernetes/admin.conf
name: kubeconfig
hostAliases:
- hostnames:
- kubernetes
ip: 127.0.0.1
hostNetwork: true
volumes:
- hostPath:
path: /etc/kubernetes/admin.conf
name: kubeconfig
status: {}
Step 4:验证
生产之后,默认将yaml复制/etc/kubernetes/manifests
,所以kubelet会自动启动它,你就可以通过nc命令查看负载是否生效:
nc -v 192.168.0.40 6443
如果失败失败。可以通过
docker ps|grep kube-vip
或
crictl ps|grep kube-vip
查看进程状态。