首页 > 系统相关 >CentOS7.9安装K8S高可用集群(三主三从)

CentOS7.9安装K8S高可用集群(三主三从)

时间:2023-02-13 22:12:57浏览次数:45  
标签:haproxy kubelet 三主三 etc keepalived CentOS7.9 yum K8S 节点

  服务器规划见下表:

 

   按上表准备好服务器后,对所有服务器操作系统内核由3.10升级至5.4+(haproxy和keepalived需要用到),步骤如下:

#导入用于内核升级的yum源仓库ELRepo的秘钥
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

#启用ELRepo仓库yum源
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm

#查看当前可供升级的内核版本
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available

#安装长期稳定版本的内核(本例中为5.4.231-1.el7.elrepo)
yum --enablerepo=elrepo-kernel install kernel-lt -y

#设置GRUB的默认启动内核为刚刚新安装的内核版本(先备份,再修改)
cp /etc/default/grub /etc/default/grub.bak
vi /etc/default/grub

  /etc/default/grub文件原来的内容如下:

GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos_jumpserver/root rd.lvm.lv=centos_jumpserver/swap rhgb quiet"
GRUB_DISABLE_RECOVERY="true"

将其的 GRUB_DEFAULT=saved 的值由 saved 改为 0 即可(即 GRUB_DEFAULT=0)保存退出,接着执行以下命令:

#重新生成启动引导项配置文件,该命令会去读取/etc/default/grub内容
grub2-mkconfig -o /boot/grub2/grub.cfg

#重启系统
reboot -h now

  重启完成后,查看一下当前的操作系统及内核版本:

[root@master1 ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
[root@master1 ~]# uname -rs
Linux 5.4.231-1.el7.elrepo.x86_64

  更新一下yum源仓库CentOS-Base.repo的地址,配置阿里云镜像地址,用于加速后续某些组件的下载速度:

#先安装一下wget工具
yum install -y wget

#然后备份 CentOS-Base.repo
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak

#使用阿里云镜像仓库地址重建CentOS-Base.repo
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

#运行yum makecache生成缓存
yum makecache

   关闭所有服务器的防火墙(在某些组件(例如Dashboard)的防火墙端口开放范围不是很清楚的情况下选择将其关闭,生产环境最好按官K8S和相关组件官网的说明,保持防火墙开启状态下选择开放相关端口):

#临时关闭防火墙
systemctl stop firewalld

#永久关闭防火墙(禁用,避免重启后又打开)
systemctl disable firewalld

  设置所有服务器的/etc/hosts文件,做好hostname和IP的映射:

cat >> /etc/hosts << EOF
192.168.17.3 master1 192.168.17.4 master2 192.168.17.5 master3 192.168.17.11 node1 192.168.17.12 node2 192.168.17.13 node3 192.168.17.200 lb # 后面将用于LoadBalance的VIP(虚拟IP),如果不是高可用集群,该IP可以是master1的IP
EOF

  设置所有服务器的时间同步组件(K8S在进行某些功能状态的判断时(例如节点存活)需要有统一的时间进行参考):

#安装时间同步组件
yum install -y ntpdate

#对齐一下各服务器的当前时间
ntpdate time.windows.com

  禁用selinux(K8S在SELINUX方面的使用和控制还不是非常的成熟):

#临时禁用Selinux
setenforce 0

#永久禁用Selinux
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

  关才操作系统swap功能(swap功能可能会使K8S在内存方面的QoS策略失效,进而影响内存资源紧张时的Pod驱逐):

#临时关闭swap功能
swapoff -a

#永久关闭swap功能
sed -ri 's/.*swap.*/#&/' /etc/fstab

  将每个节点上将桥接的IPv4流量传递到iptables的链(K8S的Service功能的实现组件kube-proxy需要使用iptables来转发流量到目标pod):

#新建 /etc/sysctl.d/k8s.conf 配置文件
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

#新建 /etc/modules-load.d/k8s.conf 配置文件
cat <<EOF | tee /etc/modules-load.d/k8s.conf
br_netfilter
overlay
EOF

#加载配置文件
sysctl --system

#加载br_netfilter模块(可以使 iptables 规则在 Linux Bridges 上面工作,用于将桥接的流量转发至iptables链)
#如果没有加载br_netfilter模块,并不会影响不同node上的pod之间的通信,但是会影响同一node内的pod之间通过service来通信
modprobe br_netfilter

#加载网络虚拟化技术模块
modprobe overlay

#检验网桥过滤模块是否加载成功
lsmod | grep -e br_netfilter -e overlay

  K8S的service有基于iptables和基于ipvs两种代理模型,基于ipvs的性能要高一些,但是需要手动载入ipvs模块才能使用:

#安装ipset和ipvsadm
yum install -y ipset ipvsadm

#创建需要加载的模块写入脚本文件(高版本内核nf_conntrack_ipv4已经换成nf_conntrack)
cat <<EOF> /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF

#为上述为脚本添加执行权限
chmod +x /etc/sysconfig/modules/ipvs.modules

#执行上述脚本
/bin/bash /etc/sysconfig/modules/ipvs.modules

#查看上述脚本中的模块是否加载成功
lsmod | grep -e -ip_vs -e nf_conntrack

  在master1节点上使用RSA算法生成非对称加密公钥和密钥,并将公钥传递给其他服务器节点(方便后面相同配置文件的分发传送):

#使用RSA算法成生密钥和公钥,遇到输入,直接Enter即可
ssh-keygen -t rsa

#将公钥传送给其他几个服务器节点(遇到(yes/no)的一路输入yes,并接着输入相应服务器的root密码)
for i in master1 master2 master3 node1 node2 node3;do ssh-copy-id -i .ssh/id_rsa.pub $i;done

Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@node3's password:


Number of key(s) added: 1


Now try logging into the machine, with: "ssh 'node3'"
and check to make sure that only the key(s) you wanted were added.

 

 

  配置所有服务器的limits:

#在所有节点上临时修改limits
ulimit -SHn 65536

#先在master1节点永久修改limits
vi /etc/security/limits.conf
#在最后添加以下内容
* soft nofile 65536
* hard nofile 65536
* soft nproc 4096
* hard nproc 4096
* soft memlock unlimited
* soft memlock unlimited

  然后将master1上的/etc/security/limits.conf文件复制到其他服务器节点上

scp /etc/security/limits.conf root@master2:/etc/security/limits.conf

scp /etc/security/limits.conf root@master3:/etc/security/limits.conf

scp /etc/security/limits.conf root@node3:/etc/security/limits.conf

scp /etc/security/limits.conf root@node2:/etc/security/limits.conf

scp /etc/security/limits.conf root@node1:/etc/security/limits.conf

 

  在所有服务器节点上安装Docker(K8S v1.24后推荐使用符合CRI标准的containerd或cri-o等作为容器运行时,原来用于支持Docker作为容器运行时的dockershim从该版本开始也已经从K8S中移除,如果还要坚持使用Docker的话,需要借助cri-dockerd适配器,性能没containerd和cri-o好):

#卸载旧docker相关组件
yum remove -y docker*
yum remove -y containerd*

#下载docker-ce仓库的yum源配置
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

#安装特定版本的docker(要符合目标版本K8S的docker版本要求)
yum install -y docker-ce-20.10.2

#配置docker(国内华中科技大学的镜像仓库、cgroup驱动为systemd等)
mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "exec-opts": ["native.cgroupdriver=systemd"],    
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],    
  "log-driver":"json-file",
  "log-opts": {"max-size":"500m", "max-file":"3"}
}
EOF

#立即启动Docker,并设置为开机自动启动
 systemctl enable docker --now

 

  设置下载K8S相关组件的yum国内镜像源(国外的太慢了,这里设置为阿里云的):

cat > /etc/yum.repos.d/kubernetes.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

  在master1、master2、master2上安装kubeadm、kubectl和kubelet三个工具:

yum install -y kubeadm-1.20.2 kubectl-1.20.2 kubelet-1.20.2 --disableexcludes=kubernetes

  在node1、node2和node3上安装kubeadm和kubelet两个工具:

yum install -y kubeadm-1.20.2  kubelet-1.20.2 --disableexcludes=kubernetes

  在所有节点上立即启动kubelet,并设置为开机启动:

systemctl enable kubelet --now

  在所有服务器节点上将kubelet使用的cgroup drver与前端安装配置Docker时的对齐,都设置为systemd :

#先在master1上修改"/etc/sysconfig/kubelet"文件的内容
vi /etc/sysconfig/kubelet

#cgroup-driver使用systemd驱动
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
#kube-proxy基于ipvs的代理模型
KUBE_PROXY_MODE="ipvs"

  然后将master1上的 /etc/sysconfig/kubelet 文件复制到其他服务器节点上

scp /etc/sysconfig/kubelet root@master2:/etc/sysconfig/kubelet

scp /etc/sysconfig/kubelet root@master3:/etc/sysconfig/kubelet
   
scp /etc/sysconfig/kubelet root@node3:/etc/sysconfig/kubelet
    
scp /etc/sysconfig/kubelet root@node2:/etc/sysconfig/kubelet
  
scp /etc/sysconfig/kubelet root@node1:/etc/sysconfig/kubelet

  在所有节点上立即启动kubelet,并设置为开机自动启动

#立即启动kubelet,并设置为开机自动启动
 systemctl enable kubelet --now
 
#查看各节点上kubelet的运行状态(由于网络组件还没安装,此时kubelet会不断重启,属于正常现象)
 systemctl status kubelet

  在master1、master2和master3上安装HAProxy和Keepalived高可用维护组件(仅高可用集群需要):

yum install -y keepalived haproxy

  在master1上修改HAproxy配置文件/etc/haproxy/haproxy.cfg,修改好后分发到master2和master3:

 #先备份HAProxy配置文件
 cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
 #修改HAProxy配置文件
 vi /etc/haproxy/haproxy.cfg
global
  maxconn  2000
  ulimit-n  16384
  log  127.0.0.1 local0 err
  stats timeout 30s
 
defaults
  log global
  mode  http
  option  httplog
  timeout connect 5000
  timeout client  50000
  timeout server  50000
  timeout http-request 15s
  timeout http-keep-alive 15s
 
frontend monitor-in
  bind *:33305
  mode http
  option httplog
  monitor-uri /monitor
 
listen stats
  bind    *:8006
  mode    http
  stats   enable
  stats   hide-version
  stats   uri       /stats
  stats   refresh   30s
  stats   realm     Haproxy\ Statistics
  stats   auth      admin:admin
 
frontend k8s-master
  bind 0.0.0.0:16443
  bind 127.0.0.1:16443
  mode tcp
  option tcplog
  tcp-request inspect-delay 5s
  default_backend k8s-master
 
backend k8s-master
  mode tcp
  option tcplog
  option tcp-check
  balance roundrobin
  default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100
  # 下面的配置根据实际情况修改
  server master1	192.168.17.3:6443  check
  server master2	192.168.17.4:6443  check
  server master3	192.168.17.5:6443  check

  然后将master1上的 /etc/haproxy/haproxy.cfg 文件复制到master2和master3节点上

scp /etc/haproxy/haproxy.cfg root@master2:/etc/haproxy/haproxy.cfg

scp /etc/haproxy/haproxy.cfg root@master3:/etc/haproxy/haproxy.cfg

  在master1、master2和master3上修改Keepalived的配置文件(注意各节点不一样的地方,红色标记):

 #先备份Keepalived的配置文件
 cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
 #修改HAProxy配置文件
 vi /etc/keepalived/keepalived.conf 
! Configuration File for keepalived
global_defs {
    ## 标识本节点的字符串,通常为 hostname
    router_id master1
    script_user root
    enable_script_security    
}
## 检测脚本
## keepalived 会定时执行脚本并对脚本执行的结果进行分析,动态调整 vrrp_instance 的优先级。如果脚本执行结果为 0,并且 weight 配置的值大于 0,则优先级相应的增加。如果脚本执行结果非 0,并且 weight配置的值小于 0,则优先级相应的减少。其他情况,维持原本配置的优先级,即配置文件中 priority 对应的值。
vrrp_script chk_apiserver {
    script "/etc/keepalived/check_apiserver.sh"
    # 每2秒检查一次
    interval 2
    # 一旦脚本执行成功,权重减少5
    weight -5
    fall 3  
    rise 2
}
## 定义虚拟路由,VR_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VR_1 {
    ## 主节点为 MASTER,对应的备份节点为 BACKUP
    state MASTER
    ## 绑定虚拟 IP 的网络接口(网卡),与本机 IP 地址所在的网络接口相同
    interface ens32
    # 主机的IP地址
    mcast_src_ip 192.168.17.3
    # 虚拟路由id
    virtual_router_id 100
    ## 节点优先级,值范围 0-254,MASTER 要比 BACKUP 高
    priority 100
     ## 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
    nopreempt 
    ## 组播信息发送间隔,所有节点设置必须一样,默认 1s
    advert_int 2
    ## 设置验证信息,所有节点必须一致
    authentication {
        auth_type PASS
        auth_pass K8SHA_KA_AUTH
    }
    ## 虚拟 IP 池, 所有节点设置必须一样
    virtual_ipaddress {
    	## VIP,可以定义多个	
        192.168.17.200
    }
    track_script {
       chk_apiserver
    }
}

  在master1新节点存活监控脚本 /etc/keepalived/check_apiserver.sh :

vi /etc/keepalived/check_apiserver.sh
#!/bin/bash
 
err=0
for k in $(seq 1 5)
do
    check_code=$(pgrep kube-apiserver)
    if [[ $check_code == "" ]]; then
        err=$(expr $err + 1)
        sleep 5
        continue
    else
        err=0
        break
    fi
done
 
if [[ $err != "0" ]]; then
    echo "systemctl stop keepalived"
    /usr/bin/systemctl stop keepalived
    exit 1
else
    exit 0
fi

  然后将master1上的 /etc/keepalived/check_apiserver.sh 文件复制到master2和master3节点上:

scp /etc/keepalived/check_apiserver.sh root@master2:/etc/keepalived/check_apiserver.sh

scp /etc/keepalived/check_apiserver.sh root@master3:/etc/keepalived/check_apiserver.sh

  各节点修改 /etc/keepalived/check_apiserver.sh 文件为可执行权限:

chmod +x /etc/keepalived/check_apiserver.sh

  各节点立即启动HAProxy和Keepalived,并设置为开机启动:

#立即启动haproxy,并设置为开机启动
systemctl enable haproxy  --now

#立即启动keepalived,并设置为开机启动
systemctl enable keepalived  --now

   测试Keepalived维护的VIP是否畅通:

#在宿主机上(此外为Windows)
ping 192.168.17.200

正在 Ping 192.168.17.200 具有 32 字节的数据:
来自 192.168.17.200 的回复: 字节=32 时间=1ms TTL=64
来自 192.168.17.200 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.17.200 的回复: 字节=32 时间=1ms TTL=64
来自 192.168.17.200 的回复: 字节=32 时间<1ms TTL=64

192.168.17.200 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 0ms,最长 = 1ms,平均 = 0ms

#在K8S各节点上
ping 192.168.17.200 -c 4
PING 192.168.17.200 (192.168.17.200) 56(84) bytes of data.
64 bytes from 192.168.17.200: icmp_seq=1 ttl=64 time=0.058 ms
64 bytes from 192.168.17.200: icmp_seq=2 ttl=64 time=0.055 ms
64 bytes from 192.168.17.200: icmp_seq=3 ttl=64 time=0.077 ms
64 bytes from 192.168.17.200: icmp_seq=4 ttl=64 time=0.064 ms

--- 192.168.17.200 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3112ms
rtt min/avg/max/mdev = 0.055/0.063/0.077/0.011 ms

未完待续...

 

标签:haproxy,kubelet,三主三,etc,keepalived,CentOS7.9,yum,K8S,节点
From: https://www.cnblogs.com/xuruiming/p/17116916.html

相关文章

  • 二进制部署k8s+calico+dashboard+nginx+keepalived
    192.168.190.200k8s-master1192.168.190.202k8s-node1192.168.190.201k8s-master2192.168.190.110vip#查看yum中可升级的内核版本yumlistkernel--showdup......
  • Kubeadm搭建K8S
    一、kubeadm部署K8S集群架构主机名IP地址安装组件master(2C/4G,cpu核心数要求大于2)192.168.2.66docker、kubeadm、kubelet、kubectl、flannelnode01(2C/2......
  • 二进制 k8s 集群下线 master 组件流程分析和实践
    目录事出因果环境介绍个人思路准备实践当前master节点信息切换apiserver访问流量查看nginx配置文件停止下线节点的apiserver服务将master节点的pod驱逐到其他......
  • k8s部署ingress
    k8s部署ingress零、nginx-dep#ngx-depkubectlcreatedeployngx-dep--image=nginx:alpine--dry-run=client-oyaml最终的配置文件apiVersion:apps/v1kind:D......
  • k8s部署flask
    k8s部署java服务是比较简单的,因为jar包已经包含了应用的所有内容,再加上JVM就可以开心的跑起来了。但是python服务比较特别,不仅需要python执行环境和应用代码,一般还需要依......
  • 记一次虚机强制断电 K8s 集群 etcd pod 挂掉快照丢失(没有备份)问题处理
    写在前面不小心拔错电源了,虚机强制关机,开机后集群死掉了记录下解决方案断电导致etcd快照数据丢失,没有备份.基本上是没办法处理可以找专业的DBA来处理数据看有没有可......
  • k8s安装YAPI
    一、前置条件提前安装MongoDB二、YAML文件namespace自行替换Deployment.yamlapiVersion:apps/v1kind:Deploymentmetadata:name:......
  • k8s——调度与驱逐
    设置节点不可调度,逐台进行kubectlcordonxxx-node-01kubectlcordonxxx-node-02kubectlcordonxxx-node-03驱逐节点上的pod,逐台进行kubectldrainxxx-node-01-......
  • 使用kubeadm快速部署一个K8s集群
    kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。这个工具能通过两条指令完成一个kubernetes集群的部署:#创建一个Master节点$kubeadminit#将一个Node......
  • K8S的基础概念
    一、Kubernetes介绍1、什么是Kubernetes?Kubernetes(通常称为K8s,K8s是将8个字母“ubernete”替换为“8”的缩写)是一个以容器为中心的基础架构,可以实现在物理集群或虚拟......