
kube-vip 简介:
kube-vip 是一个云原生的开源项目,运行在群集之内,旨在简化为 Kubernetes 集群提供高可用及负载均衡服务。
kube-vip 为 Kubernetes 集群提供虚拟 IP实现高可用和负载均衡器,用于控制平面(用于构建高可用集群)和 Kubernetes 服务类型,而无需依赖LoadBalancer任何外部硬件或软件。
与传统高可用+负载均衡机制相比较(如nginx/haproxy+keepalived),它属于云原生的高可用以及负载均衡机制,运行在群集之内,配置也更简单。
一、k8s集群节点准备(所有主机)
实验环境

软件列表及软件版本:
CentOS7.9,docker-ce,cri-dockerd,k8s集群1.28.2
1、配置主机名
hostnamectl set-hostname xxx
2、配置主机名与IP地址解析
sed -i '$a\192.168.10.11 master1' /etc/hosts
sed -i '$a\192.168.10.12 master2' /etc/hosts
sed -i '$a\192.168.10.13 master3' /etc/hosts
sed -i '$a\192.168.10.14 worker1' /etc/hosts
sed -i '$a\192.168.10.15 worker2' /etc/hosts
sed -i '$a\192.168.10.16 lb.kubetest.com' /etc/hosts
cat /etc/hosts

3、关闭防火墙和selinux
systemctl disable --now firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
4、下载阿里源
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
yum clean all && yum makecache
5、同步时间
ntpdate time1.aliyun.com
6、配置内核路由转发及网桥过滤
添加网桥过滤及内核转发配置文件
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF
加载br_netfilter模块
modprobe br_netfilter
查看是否加载
lsmod | grep br_netfilter

sysctl --system
7、安装ipset及ipvsadm
安装ipset及ipvsadm
yum -y install ipset ipvsadm
配置ipvsadm模块加载方式,添加需要加载的模块
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF
授权、运行、检查是否加载
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack

8、关闭SWAP分区
swapoff -a
sed -i '/swap/s/^/#/' /etc/fstab
cat /etc/fstab

9、配置ssh免密登录
每台生成密钥并进行拷贝
ssh-keygen
ssh-copy-id root@192.168.10.xx
二、etcd集群部署
本次在master1、master2、master3上进行etcd集群部署(此次使用k8s集群外部署)
1、在k8s集群三个master节点上安装etcd
下载或上传etcd-v3.5.0-linux-amd64.tar.gz包到/root目录
下载方法:wget https://github.com/coreos/etcd/releases/download/v3.5.0/etcd-v3.5.0-linux-amd64.tar.gz
tar xf etcd-v3.5.0-linux-amd64.tar.gz
cd etcd-v3.5.0-linux-amd64/
mv etcd* /usr/local/bin
2、生成etcd配置相关文件
master1:
tee /usr/lib/systemd/system/etcd.service <<-'EOF'
[Unit]
Description=Etcd Server
After=network.target
[Service]
Type=notify
ExecStart=/usr/local/bin/etcd \
--name=master1 \
--data-dir=/var/lib/etcd/default.etcd \
--listen-peer-urls=http://192.168.10.11:2380 \
--listen-client-urls=http://192.168.10.11:2379,http://127.0.0.1:2379 \
--advertise-client-urls=http://192.168.10.11:2379 \
--initial-advertise-peer-urls=http://192.168.10.11:2380 \
--initial-cluster=master1=http://192.168.10.11:2380,master2=http://192.168.10.12:2380,master3=http://192.168.10.13:2380 \
--initial-cluster-token=smartgo \
--initial-cluster-state=new
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
master2:
tee /usr/lib/systemd/system/etcd.service <<-'EOF'
[Unit]
Description=Etcd Server
After=network.target
[Service]
Type=notify
ExecStart=/usr/local/bin/etcd \
--name=master2 \
--data-dir=/var/lib/etcd/default.etcd \
--listen-peer-urls=http://192.168.10.12:2380 \
--listen-client-urls=http://192.168.10.12:2379,http://127.0.0.1:2379 \
--advertise-client-urls=http://192.168.10.12:2379 \
--initial-advertise-peer-urls=http://192.168.10.12:2380 \
--initial-cluster=master1=http://192.168.10.11:2380,master2=http://192.168.10.12:2380,master3=http://192.168.10.13:2380 \
--initial-cluster-token=smartgo \
--initial-cluster-state=new
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
master3:
tee /usr/lib/systemd/system/etcd.service <<-'EOF'
[Unit]
Description=Etcd Server
After=network.target
[Service]
Type=notify
ExecStart=/usr/local/bin/etcd \
--name=master3 \
--data-dir=/var/lib/etcd/default.etcd \
--listen-peer-urls=http://192.168.10.13:2380 \
--listen-client-urls=http://192.168.10.13:2379,http://127.0.0.1:2379 \
--advertise-client-urls=http://192.168.10.13:2379 \
--initial-advertise-peer-urls=http://192.168.10.13:2380 \
--initial-cluster=master1=http://192.168.10.11:2380,master2=http://192.168.10.12:2380,master3=http://192.168.10.13:2380 \
--initial-cluster-token=smartgo \
--initial-cluster-state=new
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
3、在k8s集群三个master节点上启动etcd
(尽量同时执行,启动间隔时间不要太长)
systemctl enable --now etcd
4、检查etcd集群是否正常
etcdctl member list

etcdctl endpoint health

三、容器运行时 Docker准备(所有节点)
1、docker安装
(1)Docker安装YUM源准备
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
(2)Docker安装
yum -y install docker-ce
(3)启动Docker服务
systemctl enable --now docker
(4)修改cgroup方式
在/etc/docker/daemon.json添加如下内容(/etc/docker/daemon.json 默认没有此文件,需要单独创建)
cat > /etc/docker/daemon.json << EOF
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
systemctl restart docker
2、cri-dockerd安装
下载或上传cri-dockerd-0.3.8-3.el7.x86_64.rpm包到/root目录
下载方法:wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.8/cri-dockerd-0.3.8-3.el7.x86_64.rpm
yum -y install cri-dockerd-0.3.8-3.el7.x86_64.rpm
vim /usr/lib/systemd/system/cri-docker.service
添加:
--pod-infra-container-image=registry.k8s.io/pause:3.9

systemctl enable --now cri-docker
四、K8S集群软件准备(所有节点)
1、K8S软件YUM源准备
cat > /etc/yum.repos.d/k8s.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
2、K8S软件安装
(1)软件安装
查看指定版本
yum list kubeadm.x86_64 --showduplicates | sort -r
yum list kubelet.x86_64 --showduplicates | sort -r
yum list kubectl.x86_64 --showduplicates | sort -r
安装指定版本
yum -y install kubeadm-1.28.2-0 kubelet-1.28.2-0 kubectl-1.28.2-0
(2)kubelet配置
为了实现docker使用的cgroupdriver与kubelet使用的cgroup的一致性,建议修改如下文件内容。
vim /etc/sysconfig/kubelet
添加:
"--cgroup-driver=systemd"

设置kubelet为开机自启动即可,由于没有生成配置文件,集群初始化后自动启动
systemctl enable kubelet
五、kube-vip准备(三个master节点上)
export VIP=192.168.10.16
export INTERFACE=ens33
export KVVERSION=v0.6.4
docker run -it --rm --net=host ghcr.io/kube-vip/kube-vip:$KVVERSION manifest pod \
--interface $INTERFACE \
--address $VIP \
--controlplane \
--services \
--arp \
--enableLoadBalancer \
--leaderElection | tee /etc/kubernetes/manifests/kube-vip.yaml
查看是否生成kube-vip.yaml文件
cat /etc/kubernetes/manifests/kube-vip.yaml
六、K8S集群初始化
1、k8s集群容器镜像准备(所有节点)
查看v1.28.2版本相关镜像
kubeadm config images list --kubernetes-version=v1.28.2

上传k8s-1.28.2.tar包到/root目录并导入本地镜像库
docker load -i k8s-1.28.2.tar
2、K8S集群初始化配置文件准备(master1)
(1)查看不同 kind默认配置
kubeadm config print init-defaults --component-configs KubeletConfiguration
kubeadm config print init-defaults --component-configs InitConfiguration
kubeadm config print init-defaults --component-configs ClusterConfiguration
(2)生成配置文件样例 kubeadm-config.yaml
kubeadm config print init-defaults --component-configs KubeProxyConfiguration > kubeadm-config.yaml
修改 kubeadm-config.yaml,内容参考下面的配置,也可以直接复制生成新的kubeadm-config.yaml
vim kubeadm-config.yaml
添加修改:



certSANs:
- lb.kubetest.com
- master1
- master2
- master3
- worker1
- worker2
- 192.168.10.11
- 192.168.10.12
- 192.168.10.13
- 192.168.10.14
- 192.168.10.15
controlPlaneEndpoint: lb.kubetest.com:6443

etcd:
external:
endpoints:
- http://192.168.10.11:2379
- http://192.168.10.12:2379
- http://192.168.10.13:2379


podSubnet: 10.244.0.0/16



(3)使用初始化配置文件初始化集群第一个master节点
kubeadm init --config kubeadm-config.yaml --upload-certs --v=9
--upload-certs:上传证书
--v=9:显示详细的信息


(4)准备kubectl配置文件(master1)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
(5)加入其它K8S集群master节点(master2、master3)
kubeadm join lb.kubetest.com:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:caaf7f1add4172f2eaae58dbab46c86fed8118807b7e4378f16d580702858bd2 \
--control-plane --certificate-key ad29c2f507d364303ff24292ff377a094ff8aa432b1f8ab00bf83790464da779 --cri-socket unix:///var/run/cri-dockerd.sock
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
(6)加入worker节点(worker1、worker2)
kubeadm join lb.kubetest.com:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:caaf7f1add4172f2eaae58dbab46c86fed8118807b7e4378f16d580702858bd2 --cri-socket unix:///var/run/cri-dockerd.sock
master1:
kubectl get nodes

(7)网络插件calico部署及验证(master1)
应用operator资源清单文件
从网络路径应用
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/tigera-operator.yaml
或
上传tigera-operator.yaml包到/root目录
kubectl create -f tigera-operator.yaml
通过自定义资源方式安装
wget https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/custom-resources.yaml
或
上传custom-resources.yaml包到/root目录
修改custom-resources.yaml,修改为使用kubeadm init ----pod-network-cidr对应的IP地址段
vim custom-resources.yaml
修改:

应用资源清单文件
上传calico_v3.25.1.tar、calico-apiserver.tar、calico-typha.tar包到/root目录并导入镜像(所有节点)
docker load -i calico_v3.25.1.tar
docker load -i calico-apiserver.tar
docker load -i calico-typha.tar
master1:
kubectl create -f custom-resources.yaml

监视calico-sysem命名空间中pod运行情况
kubectl get pods -n calico-system

kubectl get nodes

此时可验证,群集master中的leader故障时(如关机),集群地址vip漂移到其他master节点,群集仍可用。
七、使用kube-vip实现Service LB(master1)
1、指定LB注解或使用loadBalancerIP
当 kube-vip 启动后,将在所有匹配类型为 loadBalancer 的服务上启用一个名为 watcher 的监听器。
只有在填充了 metadata.annotations["kube-vip.io/loadbalancerIPs"] 或 spec.loadBalancerIP 的情况下,watcher 才会发布一个 Kubernetes service。
mkdir kubevip
cd kubevip/

vim nginx.yaml
添加:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
type: LoadBalancer
loadBalancerIP: 192.168.10.200
selector:
app: nginx
ports:
- port: 80
targetPort: 80

上传nginx-latest.tar镜像文件并导入(worker1、worker2)
docker load -i nginx-latest.tar
master1:
kubectl apply -f nginx.yaml
![]()
kubectl get pods

kubectl get svc

curl 192.168.10.200

使用浏览器访问192.168.10.200

kubectl delete -f nginx.yaml
![]()
vim nginx.yaml
删除添加:
annotations:
kube-vip.io/loadbalancerIPs: "192.168.10.210"

kubectl apply -f nginx.yaml
![]()
kubectl get svc

curl 192.168.10.210

使用浏览器访问192.168.10.210


1482

被折叠的 条评论
为什么被折叠?



