kube-vip安装

半兽人 发表于: 2022-08-12   最后更新时间: 2022-08-18 13:38:39  
{{totalSubscript}} 订阅, 2,197 游览

作为"传统"的keepalivedhaproxy方法的替代方案,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

查看进程状态。

原文链接

https://kube-vip.io

https://github.com/kubernetes/kubeadm/blob/main/docs/ha-considerations.md#options-for-software-load-balancing

更新于 2022-08-18

查看kubernetes更多相关的文章或提一个关于kubernetes的问题,也可以与我们一起分享文章