前言
本文中所需要到外网下载的资料都在网盘中有备份,地址如下
# 网盘地址
链接:https://pan.baidu.com/s/1qDk4H9g5yGyrOOurXBGt7Q
提取码:lnt5
节点规划
主机名称 | IP地址 | 角色 | 配置 |
---|---|---|---|
k8s-master01 ~ 03 | 192.168.0.201 ~ 203 | Master/Worker节点 | 2C2G 40G |
k8s-node01 ~ 02 | 192.168.0.204 ~ 205 | Worker节点 | 2C2G 40G |
k8s-master-lb | 192.168.0.206 | VIP | VIP不占用机器 |
信息 | 备注 |
---|---|
系统版本 | CentOS7 |
Docker版本 | 19.03.x |
K8s版本 | 1.20.x |
Pod网段 | 172.168.0.0/16 |
Service网段 | 10.96.0.0/12 |
主要是做三个事情:
-
基于vagrant + virtualbox 创建6台虚拟机
-
升级6台机器的内核版本
-
6台机器统一配置基础环境
1. 基于vagrant + virtualbox 创建6台虚拟机
1.1 安装virtualbox、vagrant
官网获取安装包 or 网盘获取
# 网盘地址
链接:https://pan.baidu.com/s/1qDk4H9g5yGyrOOurXBGt7Q
提取码:lnt5
/0001-virtualbox+vagrant 目录下
先安装virtualbox,再安装vagrant
安装virtualbox需要在BIOS里开启CPU虚拟化;安装vagrant后需要重启系统。
安装过程一路下一步即可。
验证
打开cmd命令行界面,输入 vagrant,能出现vagrant相关信息即可。
1.2 导入官方centos7镜像
获取centos7镜像(官网 or 网盘)
/0001-virtualbox+vagrant 目录下有个 CentOS-7-x86_64-Vagrant-2004_01.VirtualBox.box 文件
导入镜像到vagrant本地库
假设你下载的CentOS-7-x86_64-Vagrant-2004_01.VirtualBox.box文件在D:/111 目录下,那么在D:/111目录打开命令行执行下述命令。
vagrant box add centos/7 ./CentOS-7-x86_64-Vagrant-2004_01.VirtualBox.box
验证导入是否成功
# 执行该命令,能看到刚刚导入的 centos/7镜像即可
vagrant box list
1.3 初始化一台机器
编写Vagrantfile文件
在你的工作目录下创建一个test文件夹,我这里工作目录是D:\virtualbox-work 我在这个目录下新建了一个目录 test
在test目录下创建Vagrantfile文件
Vagrantfile文件内容如下:
Vagrant.configure("2") do |config|
(1..1).each do |i|
config.vm.synced_folder ".", "/vagrant", disabled: true
config.vm.define "test-#{i}" do |node|
# 设置虚拟机的Box
node.vm.box = "centos/7"
# 设置虚拟机的主机名
node.vm.hostname="test-#{i}"
# 设置虚拟机的IP
node.vm.network "private_network", ip: "192.168.56.#{100+i}", netmask: "255.255.255.0"
# VirtaulBox相关配置
node.vm.provider "virtualbox" do |v|
# 设置虚拟机的名称
v.name = "test-#{i}"
# 设置虚拟机的内存大小
v.memory = 16384
# 设置虚拟机的CPU个数
v.cpus = 2
end
end
end
end
启动机器
在test目录打开cmd命令窗口,执行命令钱清确保 virtualbox是开启的。
vagrant up
一台虚拟机就起来了:
1.4 开启这台机器root用户远程登录
机器启动后,使用以下命令登录虚拟机
# test-1 是在Vagrantfile文件中声明的虚拟机的名称,这里只有一台机器,也可以不用指定机器名。
vagrant ssh test-1
配置允许root用户远程登录
# 修改 /etc/ssh/sshd_config 文件中的 PasswordAuthentication no改为PasswordAuthentication yes,并重启sshd服务
sudo vi /etc/ssh/sshd_config
sudo systemctl restart sshd
此时,就可以使用xshell使用root用户远程登录该机器了,机器IP在Vagrantfile中有配置,默认的密码是 vagrant
1.5 导出box镜像
继续在 cmd窗口进行导出镜像操作,也可以在此处进行内核升级,这样,后面克隆出来的机器就都是高版本的内核了。
# 关机
vagrant halt
# 打包镜像
# test-1 是待打包的机器的主机名
# k8s-base 是打包后的镜像名称
vagrant package --base test-1 --output k8s-base.box
打包后生成的镜像
1.6 导入上一步的box镜像
vagrant box add k8s-base ./k8s-base.box
查看导入的镜像
vagrant box list
能看到导入的镜像即可,如下:
1.7 编写初始化6台机器的Vagrantfile文件
工作目录为 D:\virtualbox-work ,在该目录下创建名为 k8s 的文件夹,并在 k8s 文件夹下创建 Vagrantfile文件
Vagrantfile文件
Vagrant.configure("2") do |config|
(1..6).each do |i|
config.vm.synced_folder ".", "/vagrant", disabled: true
config.ssh.username = "vagrant"
config.ssh.password = "vagrant"
config.vm.define "k8s-#{i}" do |node|
# 设置虚拟机的Box
node.vm.box = "k8s-base"
# 设置虚拟机的主机名
node.vm.hostname="k8s-#{i}"
# 设置虚拟机的IP
node.vm.network "private_network", ip: "192.168.0.#{200+i}", netmask: "255.255.255.0"
# VirtaulBox相关配置
node.vm.provider "virtualbox" do |v|
# 设置虚拟机的名称
v.name = "k8s-#{i}"
# 设置虚拟机的内存大小
v.memory = 16384
# 设置虚拟机的CPU个数
v.cpus = 2
end
end
end
end
1.8 开启六台机器
在D:\virtualbox-work\k8s打开cmd命令窗口,执行命令,执行启动命令前,需要先打开virtualbox。
vagrant up
最终会启动6台机器,如下:
用xshell连接6台虚拟机
2. 升级6台机器的内核版本
2.1 所有节点配置hosts
192.168.0.201 k8s-master01
192.168.0.202 k8s-master02
192.168.0.203 k8s-master03
192.168.0.206 k8s-master-lb # 如果不是高可用集群,该IP为Master01的IP
192.168.0.204 k8s-node01
192.168.0.205 k8s-node02
2.2 yum源配置
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
2.3 必备工具安装
yum install wget install jq psmisc vim lrzsz net-tools telnet yum-utils device-mapper-persistent-data lvm2 git -y
2.4 所有节点关闭防火墙、selinux、dnsmasq、swap。服务器配置如下:
systemctl disable --now firewalld
systemctl disable --now dnsmasq
systemctl disable --now NetworkManager
setenforce 0
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/sysconfig/selinux
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
2.5 关闭swap分区
swapoff -a && sysctl -w vm.swappiness=0
sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab
2.6 安装ntpdate
rpm -ivh http://mirrors.wlnmp.com/centos/wlnmp-release-centos.noarch.rpm
yum install ntpdate -y
2.7 所有节点同步时间。时间同步配置如下:
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo 'Asia/Shanghai' >/etc/timezone
ntpdate time2.aliyun.com
2.8 加入到crontab crontab -e
*/5 * * * * ntpdate time2.aliyun.com
2.9 所有节点配置limit:
ulimit -SHn 65535
2.10 vim /etc/security/limits.conf
# 末尾添加如下内容
* soft nofile 655360
* hard nofile 131072
* soft nproc 655350
* hard nproc 655350
* soft memlock unlimited
* hard memlock unlimited
2.11 Master01节点免密钥登录其他节点:
ssh-keygen -t rsa
for i in k8s-master01 k8s-master02 k8s-master03 k8s-node01 k8s-node02 k8s-master-lb;do ssh-copy-id -i .ssh/id_rsa.pub $i;done
2.12 下载安装所有的源码文件
cd /root/ ; git clone https://github.com/dotbalo/k8s-ha-install.git
# github下载有点慢,网盘里有 /0006-k8s/1.20.x目录下
2.13 所有节点升级系统并重启:
yum update -y && reboot
3. 升级内核
3.1 下载rpm包(网盘里有)
只需要一台机器去下载即可,我这里在 k8s-1这台机器上操作。
# 安装 wget
yum install wget -y
cd /root
# wget的方式下载
wget https://mirror.rc.usf.edu/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-5.10.5-1.el7.elrepo.x86_64.rpm
wget https://mirror.rc.usf.edu/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-devel-5.10.5-1.el7.elrepo.x86_64.rpm
# 网盘地址
链接:https://pan.baidu.com/s/1qDk4H9g5yGyrOOurXBGt7Q
提取码:lnt5
/0006-centos7内核 目录下
3.2 两个rpm包都放在k8s-1机器的/root目录下,分发到其它五台机器上
for i in k8s-master01 k8s-master02 k8s-master03 k8s-node01 k8s-node02 k8s-master-lb;do scp kernel* $i:/root/;done
3.3 所有机器安装内核、设置kernel启动顺序
cd /root && yum localinstall kernel-ml-* -y
grub2-set-default 0
grub2-mkconfig -o /boot/grub2/grub.cfg
grubby --default-kernel
reboot
3.4 检查内核版本
重启完成后,重新连接上机器,检查内核
[root@k8s-6 ~]# uname -r
5.10.5-1.el7.elrepo.x86_64
3.5 所有节点安装ipvsadm:
yum install ipvsadm ipset sysstat conntrack libseccomp -y
3.6 所有节点配置ipvs模块
vim /etc/modules-load.d/ipvs.conf
# 加入以下内容
ip_vs
ip_vs_lc
ip_vs_wlc
ip_vs_rr
ip_vs_wrr
ip_vs_lblc
ip_vs_lblcr
ip_vs_dh
ip_vs_sh
ip_vs_fo
ip_vs_nq
ip_vs_sed
ip_vs_ftp
ip_vs_sh
nf_conntrack
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
3.7 加载内核配置
systemctl enable --now systemd-modules-load.service
3.8 开启一些k8s集群中必须的内核参数,所有节点配置k8s内核
cat <<EOF > /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
fs.may_detach_mounts = 1
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
fs.file-max=52706963
fs.nr_open=52706963
net.netfilter.nf_conntrack_max=2310720
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl =15
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_orphans = 327680
net.ipv4.tcp_orphan_retries = 3
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.ip_conntrack_max = 65536
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_timestamps = 0
net.core.somaxconn = 16384
EOF
sysctl --system
3.9 验证
[root@k8s-1 ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4
ip_vs_ftp 16384 0
nf_nat 45056 1 ip_vs_ftp
ip_vs_sed 16384 0
ip_vs_nq 16384 0
ip_vs_fo 16384 0
ip_vs_sh 16384 0
ip_vs_dh 16384 0
ip_vs_lblcr 16384 0
ip_vs_lblc 16384 0
ip_vs_wrr 16384 0
ip_vs_rr 16384 0
ip_vs_wlc 16384 0
ip_vs_lc 16384 0
ip_vs 155648 24 ip_vs_wlc,ip_vs_rr,ip_vs_dh,ip_vs_lblcr,ip_vs_sh,ip_vs_fo,ip_vs_nq,ip_vs_lblc,ip_vs_wrr,ip_vs_lc,ip_vs_sed,ip_vs_ftp
nf_conntrack 155648 2 nf_nat,ip_vs
nf_defrag_ipv6 24576 2 nf_conntrack,ip_vs
libcrc32c 16384 4 nf_conntrack,nf_nat,xfs,ip_vs