Centos7基于LVS+Keepalived安装K8S 1.21.2高可用

Centos7基于LVS+Keepalived安装K8S高可用

1、服务器

需要准备八台Centos7的服务器,配置最少2C 2G

八台服务器都已经配置好静态IP。

没有配的可以参考:VM Ware+Centos7配置静态IP

主机名IPDocker版本主机配置K8S版本Keepalived版本
master01192.168.159.17120.10.72C8G1.21.2/
master02192.168.159.17220.10.72C8G1.21.2/
master03192.168.159.17320.10.72C8G1.21.2/
work01192.168.159.17420.10.72C8G1.21.2/
work02192.168.159.17520.10.72C8G1.21.2/
lvs-keepalived01192.168.159.17620.10.72C8G/2.2.2
lvs-keepalived02192.168.159.17720.10.72C8G/2.2.2
VIP192.168.159.169////
client192.168.159.17020.10.72C8G1.21.2/

2、环境准备

所有机器都需要配置一系列环境和参数修改。可以参考这个博客的第二步(环境准备)。将所有机器都配置完成。Centos7安装K8S的1.21.2集群

3、安装K8S高可用

1、查看K8S版本

  1. 使用yum list命令,列出所支持的版本。

    注意:横杠(-)之前的才是版本号。

yum list kubelet --showduplicates | sort -r

在这里插入图片描述
在这里插入图片描述

2、安装kubelet、kubeadm、kubectl

  1. 使用yum install命令安装指定的K8S版本。

    注意:除了LVS-Keepalived和VIP机器,其他机器都需要执行以下操作

yum install -y kubelet-1.21.2 kubeadm-1.21.2 kubectl-1.21.2

在这里插入图片描述
在这里插入图片描述

  1. 启动kubelet服务,并设置开机自启。
systemctl enable kubelet && systemctl start kubelet

在这里插入图片描述

3、拉取镜像

  1. 使用kubeadm命令、查看当前k8s所需的镜像版本。
kubeadm config images list

在这里插入图片描述

  1. 可以看到上面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

在这里插入图片描述

  1. 修改images.sh脚本权限,改为可执行权限。
chmod +x images.sh

在这里插入图片描述

  1. 执行images.sh脚本,拉取镜像
./images.sh

在这里插入图片描述
在这里插入图片描述

4、启虚拟IP

  1. 现在master01上启一个虚拟IP192.168.159.169来为等会初始化K8S集群准备
ifconfig ens33:2 192.168.159.169 netmask 255.255.255.0 up

在这里插入图片描述

  1. 使用ifconfig命令查看虚拟IP是否启动成功。
ifconfig

在这里插入图片描述

5、初始化集群

  1. 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 #用来将在所有控制平面实例之间的共享证书上传到集群

在这里插入图片描述
在这里插入图片描述

  1. 记录初始化集群命令后,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

在这里插入图片描述

  1. 执行k8s集群初始化给你生成的创建目录和复制配置文件命令。
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

在这里插入图片描述

  1. master02master03两台机器上的根目录执行你刚才记录的加入control-plane控制面板节点命令。

    注意:一定要在根目录

kubeadm join 192.168.159.169:6443 --token c9jraa.borzmf1s101w58lr \
	--discovery-token-ca-cert-hash sha256:71bb74b1ab991baa6bdbd1c07c4fede07926c642152852dbacd2fbe8bb17797e \
	--control-plane --certificate-key f45215cd0da1446e7750359e675275ab3f9b987b3755133187c2dc011cbd4994

在这里插入图片描述
在这里插入图片描述

  1. 两台机器执行完加入控制面板后,也会提示让你创建K8S相关目录。
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

在这里插入图片描述

  1. work01work02两台机器上的根目录执行刚才你记录的加入work工作节点命令。
kubeadm join 192.168.159.169:6443 --token c9jraa.borzmf1s101w58lr \
	--discovery-token-ca-cert-hash sha256:71bb74b1ab991baa6bdbd1c07c4fede07926c642152852dbacd2fbe8bb17797e

在这里插入图片描述

  1. master01机器上执行以下命令,查看k8s集群节点。可以看到所有节点状态都是NotReady。这是因为网络插件没装。
kubectl get nodes

在这里插入图片描述

6、安装Calico网络插件

  1. 使用curl命令下载Calico网络插件的YAML文件。
curl https://docs.projectcalico.org/manifests/calico.yaml -O

在这里插入图片描述

  1. 使用kubectl apply应用刚刚下载好的calico.yaml文件。
kubectl apply -f calico.yaml

在这里插入图片描述

  1. 使用以下命令查看当前K8S集群的pods
kubectl get pods -o wide -n kube-system

在这里插入图片描述

  1. 再次查看所有节点。
kubectl get nodes

在这里插入图片描述

4、安装LVS

注意:LVS-Keepalived01和LVS-Keepalived02两台机器都需要执行以下操作

1、安装ipvs

  1. LVS无需安装,安装的是管理工具,第一种叫ipvsadm,第二种叫keepalive。ipvsadm是通过命令行管理,而keepalive读取配置文件管理。
yum -y install ipvsadm

在这里插入图片描述
在这里插入图片描述

2、加载ipvsadm模块

  1. ipvsadm模块加载进系统
ipvsadm

在这里插入图片描述

5、安装Keepalived

Keepalived官网:Keepalived官网

注意:LVS+Keepalived两台机器都需要执行以下操作

1、安装Keepalived

  1. 从官网下载Keepalived版本,上传到服务器上指定目录。
    在这里插入图片描述

  2. 使用yum安装Keepalived所需依赖环境

yum -y install openssl-devel gcc gcc-c++  libnl3-devel  pcre2-devel

在这里插入图片描述
在这里插入图片描述

  1. 解压keepalived安装包。
tar -zxvf keepalived-2.2.2.tar.gz

在这里插入图片描述
在这里插入图片描述

  1. 进到解压好的安装包目录。
cd  keepalived-2.2.2

在这里插入图片描述

  1. 配置keepalived安装选项。
./configure --prefix=/app/keepalived-2.2.2

–prefix= # 指定安装目录

在这里插入图片描述
在这里插入图片描述

  1. 编译并安装
make && make install

在这里插入图片描述
在这里插入图片描述

  1. 将安装后的目录内文件,复制到系统文件目录下。
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

  1. 使用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,要和上面的保持一致
       }
    }
}

在这里插入图片描述
在这里插入图片描述

  1. 使用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。现在需要去掉

  1. 使用以下命令关闭
ifconfig ens33:2 192.168.159.169 netmask 255.255.255.0 down

在这里插入图片描述
在这里插入图片描述

4、启动Keepalived

lvs-keepalived两台机器都开启Keepalived并设置开机自启

  1. 启动Keepalived
service keepalived start
  1. 设置开机自启
systemctl enable keepalived
  1. 查看虚拟VIP
ip a

在这里插入图片描述

6、control plane节点配置

三台Master机器(control plane)都执行以下操作。

  1. 在三台机器指定目录下,创建脚本文件。
#!/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

在这里插入图片描述

  1. 更改脚本文件权限。
chmod +x realserver.sh

在这里插入图片描述

  1. 运行realserver.sh脚本
./realserver.sh start

在这里插入图片描述

  1. 设置realserver.sh脚本开机自启。
sed -i '$a /app/sh/realserver.sh start' /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local

在这里插入图片描述

7、安装Client

  1. 安装kubectl
yum install -y kubectl-1.21.2

在这里插入图片描述
在这里插入图片描述

  1. 创建K8S配置目录
mkdir -p /etc/kubernetes

在这里插入图片描述

  1. 复制master01机器上的k8s配置文件。
scp /etc/kubernetes/admin.conf root@192.168.159.170:/etc/kubernetes/

在这里插入图片描述

  1. 将刚复制过来的admin.conf加到环境变量中。
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile

在这里插入图片描述

  1. 测试kubectl命令。
kubectl get nodes
kubectl get pods -o wide -A

在这里插入图片描述在这里插入图片描述

8、测试

1、在lvs-keepalived01查看虚拟ip转发地址

  1. 在lvs-keepalived01机器上查看通过虚拟IP转发到哪些服务器
ipvsadm -ln

在这里插入图片描述

2、master01关机

  1. 先编写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    

在这里插入图片描述
在这里插入图片描述

  1. 应用nginx的yaml文件
kubectl apply -f nginx-master.yaml
kubectl get pods -o wide

在这里插入图片描述

  1. master01机器关机。

在这里插入图片描述

  1. 在lvs-keepalived01机器上再次查看通过虚拟IP转发到哪些服务器、可以看到已经没有master01机器了。
ipvsadm -ln

在这里插入图片描述

  1. client机器上查看节点和Pod信息。看看K8S集群是否受影响。可以看到master01机器关机并没有影响K8S集群。
kubectl get nodes
kubectl get pods -o wide 
kubectl get pods -o wide -n kube-system

在这里插入图片描述

3、master02关机

  1. master02继master01后关机。看看集群是否正常

在这里插入图片描述

  1. 在lvs-keepalived01机器上查看虚拟ip
ipvsadm -ln

在这里插入图片描述

  1. 在client机器上再次验证kubectl命令。可以看到K8S集群已经不能再对外提供服务。
kubectl get nodes

在这里插入图片描述

4、master01和master02启动

在这里插入图片描述在这里插入图片描述

5、lvs-keepalived01关机

  1. lvs-keepalived01机器关机.
    在这里插入图片描述

  2. lvs-keepalived02机器上查看虚拟IP,是否会转移过去

ip a

在这里插入图片描述

  1. 查看虚拟IP转发到哪些机器
    在这里插入图片描述

  2. client机器上验证K8S集群是否受影响
    在这里插入图片描述

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值