Centos7基于LVS+Keepalived安装K8S高可用
1、服务器
需要准备八台Centos7
的服务器,配置最少2C 2G
。
八台服务器都已经配置好静态IP。
没有配的可以参考:VM Ware+Centos7配置静态IP
主机名 | IP | Docker版本 | 主机配置 | K8S版本 | Keepalived版本 |
---|---|---|---|---|---|
master01 | 192.168.159.171 | 20.10.7 | 2C8G | 1.21.2 | / |
master02 | 192.168.159.172 | 20.10.7 | 2C8G | 1.21.2 | / |
master03 | 192.168.159.173 | 20.10.7 | 2C8G | 1.21.2 | / |
work01 | 192.168.159.174 | 20.10.7 | 2C8G | 1.21.2 | / |
work02 | 192.168.159.175 | 20.10.7 | 2C8G | 1.21.2 | / |
lvs-keepalived01 | 192.168.159.176 | 20.10.7 | 2C8G | / | 2.2.2 |
lvs-keepalived02 | 192.168.159.177 | 20.10.7 | 2C8G | / | 2.2.2 |
VIP | 192.168.159.169 | / | / | / | / |
client | 192.168.159.170 | 20.10.7 | 2C8G | 1.21.2 | / |
2、环境准备
所有机器都需要配置一系列环境和参数修改。可以参考这个博客的第二步(环境准备)。将所有机器都配置完成。Centos7安装K8S的1.21.2集群
3、安装K8S高可用
1、查看K8S版本
-
使用
yum list
命令,列出所支持的版本。注意:横杠(-)之前的才是版本号。
yum list kubelet --showduplicates | sort -r
2、安装kubelet、kubeadm、kubectl
-
使用
yum install
命令安装指定的K8S版本。注意:除了LVS-Keepalived和VIP机器,其他机器都需要执行以下操作
yum install -y kubelet-1.21.2 kubeadm-1.21.2 kubectl-1.21.2
- 启动
kubelet
服务,并设置开机自启。
systemctl enable kubelet && systemctl start kubelet
3、拉取镜像
- 使用
kubeadm
命令、查看当前k8s所需的镜像版本。
kubeadm config images list
-
可以看到上面k8s所需的镜像版本是
1.21.3
。跟安装指定的版本并不相同,这个并不影响,可以自定义修改版本。只需要关注如:pause、etcd、coredns的版本即可。
因为k8s这些镜像都是国外的,直接访问下载镜像可能会有问题。
编写拉取镜像脚本,从阿里云镜像仓库下载所需版本。
注意:脚本需要在除LVS+VIP以外机器上都编写。都需要拉取镜像
#!/bin/bash
url=registry.cn-hangzhou.aliyuncs.com/google_containers
# 安装指定的kubectl版本
version=v1.21.2
# 上面查出来的coredns版本号
coredns=1.8.0
images=(`kubeadm config images list --kubernetes-version=$version|awk -F '/' '{print $2}'`)
for imagename in ${images[@]} ; do
if [ $imagename = "coredns" ]
then
docker pull $url/coredns:$coredns
docker tag $url/coredns:$coredns k8s.gcr.io/coredns/coredns:v1.8.0
docker rmi -f $url/coredns:$coredns
else
docker pull $url/$imagename
docker tag $url/$imagename k8s.gcr.io/$imagename
docker rmi -f $url/$imagename
fi
done
- 修改
images.sh
脚本权限,改为可执行权限。
chmod +x images.sh
- 执行
images.sh
脚本,拉取镜像
./images.sh
4、启虚拟IP
- 现在
master01
上启一个虚拟IP192.168.159.169
来为等会初始化K8S集群准备
ifconfig ens33:2 192.168.159.169 netmask 255.255.255.0 up
- 使用
ifconfig
命令查看虚拟IP是否启动成功。
ifconfig
5、初始化集群
-
在
master01
机器上执行初始化集群命令。注意:该命令只需在master01上执行
kubeadm init --kubernetes-version=1.21.2 --pod-network-cidr=10.244.0.0/16 --upload-certs --control-plane-endpoint "192.168.159.169:6443"
–kubernetes-version # 指定的版本
–pod-network-cidr # pod的网络IP范围
–control-plane-endpoint “192.168.159.169:6443” # 负载均衡器的地址或 DNS 和端口
–upload-certs #用来将在所有控制平面实例之间的共享证书上传到集群
- 记录初始化集群命令后,k8s给你生成的加入控制面板(control-plane)节点命令和加入工作(work)节点命令。
# control-plane
kubeadm join 192.168.159.169:6443 --token c9jraa.borzmf1s101w58lr \
--discovery-token-ca-cert-hash sha256:71bb74b1ab991baa6bdbd1c07c4fede07926c642152852dbacd2fbe8bb17797e \
--control-plane --certificate-key f45215cd0da1446e7750359e675275ab3f9b987b3755133187c2dc011cbd4994
# work
kubeadm join 192.168.159.169:6443 --token c9jraa.borzmf1s101w58lr \
--discovery-token-ca-cert-hash sha256:71bb74b1ab991baa6bdbd1c07c4fede07926c642152852dbacd2fbe8bb17797e
- 执行k8s集群初始化给你生成的创建目录和复制配置文件命令。
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
-
在
master02
和master03
两台机器上的根目录
执行你刚才记录的加入control-plane
控制面板节点命令。注意:一定要在根目录
kubeadm join 192.168.159.169:6443 --token c9jraa.borzmf1s101w58lr \
--discovery-token-ca-cert-hash sha256:71bb74b1ab991baa6bdbd1c07c4fede07926c642152852dbacd2fbe8bb17797e \
--control-plane --certificate-key f45215cd0da1446e7750359e675275ab3f9b987b3755133187c2dc011cbd4994
- 两台机器执行完加入控制面板后,也会提示让你创建K8S相关目录。
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
- 在
work01
和work02
两台机器上的根目录
执行刚才你记录的加入work
工作节点命令。
kubeadm join 192.168.159.169:6443 --token c9jraa.borzmf1s101w58lr \
--discovery-token-ca-cert-hash sha256:71bb74b1ab991baa6bdbd1c07c4fede07926c642152852dbacd2fbe8bb17797e
- 在
master01
机器上执行以下命令,查看k8s集群节点。可以看到所有节点状态都是NotReady
。这是因为网络插件没装。
kubectl get nodes
6、安装Calico网络插件
- 使用
curl
命令下载Calico网络插件的YAML文件。
curl https://docs.projectcalico.org/manifests/calico.yaml -O
- 使用
kubectl apply
应用刚刚下载好的calico.yaml
文件。
kubectl apply -f calico.yaml
- 使用以下命令查看当前K8S集群的pods
kubectl get pods -o wide -n kube-system
- 再次查看所有节点。
kubectl get nodes
4、安装LVS
注意:LVS-Keepalived01和LVS-Keepalived02两台机器都需要执行以下操作
1、安装ipvs
- LVS无需安装,安装的是管理工具,第一种叫ipvsadm,第二种叫keepalive。ipvsadm是通过命令行管理,而keepalive读取配置文件管理。
yum -y install ipvsadm
2、加载ipvsadm模块
- 将
ipvsadm
模块加载进系统
ipvsadm
5、安装Keepalived
Keepalived官网:Keepalived官网
注意:LVS+Keepalived两台机器都需要执行以下操作
1、安装Keepalived
-
从官网下载Keepalived版本,上传到服务器上指定目录。
-
使用
yum
安装Keepalived
所需依赖环境
yum -y install openssl-devel gcc gcc-c++ libnl3-devel pcre2-devel
- 解压
keepalived
安装包。
tar -zxvf keepalived-2.2.2.tar.gz
- 进到解压好的安装包目录。
cd keepalived-2.2.2
- 配置
keepalived
安装选项。
./configure --prefix=/app/keepalived-2.2.2
–prefix= # 指定安装目录
- 编译并安装
make && make install
- 将安装后的目录内文件,复制到系统文件目录下。
cp -a /app/keepalived-2.2.2/etc/keepalived/ /etc/init.d/
cp -a /app/keepalived-2.2.2/etc/sysconfig/keepalived /etc/sysconfig/
cp -a /app/keepalived-2.2.2/sbin/keepalived /usr/sbin/
mkdir /etc/keepalived/
cp /app/keepalived-2.2.2/etc/keepalived/keepalived.conf /etc/keepalived/
2、配置Keepalived
- 使用
vim
修改lvs-keepalived01
机器上的/etc/keepalived/keepalived.conf
文件配置。
! Configuration File for keepalived
global_defs {
router_id lvs-keepalived01 #router_id 机器标识,通常为hostname,但不一定非得是hostname。故障发生时,邮件通知会用到。
}
vrrp_instance VI_1 { #vrrp实例定义部分
state MASTER #设置lvs的状态,MASTER和BACKUP两种,必须大写
interface ens33 #设置对外服务的接口
virtual_router_id 100 #设置虚拟路由标示,这个标示是一个数字,同一个vrrp实例使用唯一标示
priority 100 #定义优先级,数字越大优先级越高,在一个vrrp——instance下,master的优先级必须大于backup
advert_int 1 #设定master与backup负载均衡器之间同步检查的时间间隔,单位是秒
authentication { #设置验证类型和密码
auth_type PASS #主要有PASS和AH两种
auth_pass 1111 #验证密码,同一个vrrp_instance下MASTER和BACKUP密码必须相同
}
virtual_ipaddress { #设置虚拟ip地址,可以设置多个,每行一个
192.168.159.169
}
}
virtual_server 192.168.159.169 6443 { #设置虚拟服务器,需要指定虚拟ip和服务端口
delay_loop 6 #健康检查时间间隔
lb_algo wrr #负载均衡调度算法
lb_kind DR #负载均衡转发规则
#persistence_timeout 50 #设置会话保持时间,对动态网页非常有用
protocol TCP #指定转发协议类型,有TCP和UDP两种
real_server 192.168.159.171 6443 { #配置服务器节点1,需要指定real server的真实IP地址和端口
weight 10 #设置权重,数字越大权重越高
TCP_CHECK { #realserver的状态监测设置部分单位秒
connect_timeout 10 #连接超时为10秒
retry 3 #重连次数
delay_before_retry 3 #重试间隔
connect_port 6443 #连接端口为6443,要和上面的保持一致
}
}
real_server 192.168.159.172 6443 { #配置服务器节点1,需要指定real server的真实IP地址和端口
weight 10 #设置权重,数字越大权重越高
TCP_CHECK { #realserver的状态监测设置部分单位秒
connect_timeout 10 #连接超时为10秒
retry 3 #重连次数
delay_before_retry 3 #重试间隔
connect_port 6443 #连接端口为6443,要和上面的保持一致
}
}
real_server 192.168.159.173 6443 { #配置服务器节点1,需要指定real server的真实IP地址和端口
weight 10 #设置权重,数字越大权重越高
TCP_CHECK { #realserver的状态监测设置部分单位秒
connect_timeout 10 #连接超时为10秒
retry 3 #重连次数
delay_before_retry 3 #重试间隔
connect_port 6443 #连接端口为6443,要和上面的保持一致
}
}
}
- 使用
vim
修改lvs-keepalived02
机器上的/etc/keepalived/keepalived.conf
文件配置。
! Configuration File for keepalived
global_defs {
router_id lvs-keepalived02 #router_id 机器标识,通常为hostname,但不一定非得是hostname。故障发生时,邮件通知会用到。
}
vrrp_instance VI_1 { #vrrp实例定义部分
state BACKUP #设置lvs的状态,MASTER和BACKUP两种,必须大写
interface ens33 #设置对外服务的接口
virtual_router_id 100 #设置虚拟路由标示,这个标示是一个数字,同一个vrrp实例使用唯一标示
priority 90 #定义优先级,数字越大优先级越高,在一个vrrp——instance下,master的优先级必须大于backup
advert_int 1 #设定master与backup负载均衡器之间同步检查的时间间隔,单位是秒
authentication { #设置验证类型和密码
auth_type PASS #主要有PASS和AH两种
auth_pass 1111 #验证密码,同一个vrrp_instance下MASTER和BACKUP密码必须相同
}
virtual_ipaddress { #设置虚拟ip地址,可以设置多个,每行一个
192.168.159.169
}
}
virtual_server 192.168.159.169 6443 { #设置虚拟服务器,需要指定虚拟ip和服务端口
delay_loop 6 #健康检查时间间隔
lb_algo wrr #负载均衡调度算法
lb_kind DR #负载均衡转发规则
#persistence_timeout 50 #设置会话保持时间,对动态网页非常有用
protocol TCP #指定转发协议类型,有TCP和UDP两种
real_server 192.168.159.171 6443 { #配置服务器节点1,需要指定real server的真实IP地址和端口
weight 10 #设置权重,数字越大权重越高
TCP_CHECK { #realserver的状态监测设置部分单位秒
connect_timeout 10 #连接超时为10秒
retry 3 #重连次数
delay_before_retry 3 #重试间隔
connect_port 6443 #连接端口为6443,要和上面的保持一致
}
}
real_server 192.168.159.172 6443 { #配置服务器节点1,需要指定real server的真实IP地址和端口
weight 10 #设置权重,数字越大权重越高
TCP_CHECK { #realserver的状态监测设置部分单位秒
connect_timeout 10 #连接超时为10秒
retry 3 #重连次数
delay_before_retry 3 #重试间隔
connect_port 6443 #连接端口为6443,要和上面的保持一致
}
}
real_server 192.168.159.173 6443 { #配置服务器节点1,需要指定real server的真实IP地址和端口
weight 10 #设置权重,数字越大权重越高
TCP_CHECK { #realserver的状态监测设置部分单位秒
connect_timeout 10 #连接超时为10秒
retry 3 #重连次数
delay_before_retry 3 #重试间隔
connect_port 6443 #连接端口为6443,要和上面的保持一致
}
}
}
3、去掉之前初始化集群启的虚拟IP
在master01初始化K8S集群之前,启动了一个虚拟IP为192.168.159.169。现在需要去掉
- 使用以下命令关闭
ifconfig ens33:2 192.168.159.169 netmask 255.255.255.0 down
4、启动Keepalived
lvs-keepalived两台机器都开启Keepalived并设置开机自启
- 启动Keepalived
service keepalived start
- 设置开机自启
systemctl enable keepalived
- 查看虚拟
VIP
ip a
6、control plane节点配置
三台Master机器(control plane)都执行以下操作。
- 在三台机器指定目录下,创建脚本文件。
#!/bin/bash
SNS_VIP=192.168.159.169
case "$1" in
start)
ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
/sbin/route add -host $SNS_VIP dev lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p >/dev/null 2>&1
echo "RealServer Start OK"
;;
stop)
ifconfig lo:0 down
route del $SNS_VIP >/dev/null 2>&1
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "RealServer Stoped"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0
- 更改脚本文件权限。
chmod +x realserver.sh
- 运行
realserver.sh
脚本
./realserver.sh start
- 设置
realserver.sh
脚本开机自启。
sed -i '$a /app/sh/realserver.sh start' /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local
7、安装Client
- 安装
kubectl
。
yum install -y kubectl-1.21.2
- 创建K8S配置目录
mkdir -p /etc/kubernetes
- 复制
master01
机器上的k8s配置文件。
scp /etc/kubernetes/admin.conf root@192.168.159.170:/etc/kubernetes/
- 将刚复制过来的
admin.conf
加到环境变量中。
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile
- 测试
kubectl
命令。
kubectl get nodes
kubectl get pods -o wide -A
8、测试
1、在lvs-keepalived01查看虚拟ip转发地址
- 在lvs-keepalived01机器上查看通过虚拟IP转发到哪些服务器
ipvsadm -ln
2、master01关机
- 先编写
nginx-master.yaml
文件。创建出nginx的pod
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-master
spec:
selector:
matchLabels:
app: nginx
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
- 应用nginx的yaml文件
kubectl apply -f nginx-master.yaml
kubectl get pods -o wide
- 将
master01
机器关机。
- 在lvs-keepalived01机器上再次查看通过虚拟IP转发到哪些服务器、可以看到已经没有
master01
机器了。
ipvsadm -ln
- 在
client
机器上查看节点和Pod信息。看看K8S集群是否受影响。可以看到master01
机器关机并没有影响K8S集群。
kubectl get nodes
kubectl get pods -o wide
kubectl get pods -o wide -n kube-system
3、master02关机
- 将
master02
继master01后关机。看看集群是否正常
- 在lvs-keepalived01机器上查看虚拟ip
ipvsadm -ln
- 在client机器上再次验证
kubectl
命令。可以看到K8S集群已经不能再对外提供服务。
kubectl get nodes
4、master01和master02启动
5、lvs-keepalived01关机
-
将
lvs-keepalived01
机器关机.
-
在
lvs-keepalived02
机器上查看虚拟IP,是否会转移过去
ip a
-
查看虚拟IP转发到哪些机器
-
在
client
机器上验证K8S集群是否受影响