前言

最近在学习K8S高可用集群搭建相关课程,今天是学习第一天,根据操作内容,记录一下学习历程,可能会有操作错误的地方,后面过程发现问题会及时修改内容。

环境准备

以下是我准备K8S实验的环境:
k8s-master01 4C16G CentOS Linux release 7.2.1511 (Core)
k8s-master02 4C16G CentOS Linux release 7.2.1511 (Core)
k8s-master03 4C16G CentOS Linux release 7.2.1511 (Core)
k8s-node01 4C16G CentOS Linux release 7.2.1511 (Core)
k8s-node02 4C16G CentOS Linux release 7.2.1511 (Core)
是由VMWare 划分的5台虚拟机。

初始化环境

修改/etc/hosts文件,增加主机ip配置(5台虚拟机同步操作)

vim /etc/hosts
#末尾加入内容
192.168.1.xx k8s-master01
192.168.1.xx k8s-master02
192.168.1.xx k8s-master03
192.168.1.xx k8s-node01
192.168.1.xx k8s-node02

更换yum源(所有节点)

因为国外的镜像源,在国内下载速度较慢,因为更改为阿里云的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
  1. yum-utils - 包含一组用于管理YUM仓库和软件包的实用程序。
  2. device-mapper-persistent-data - 提供了一些用于操作存储设备的工具,例如thin provisioned LVM逻辑卷。它还包含dmsetup和dmstats等工具。
  3. lvm2 - 逻辑卷管理(Logical Volume Manager),是一个用于管理磁盘分区和存储设备的高级工具。LVM2提供了灵活性,允许用户轻松调整分区大小、快照、合并或拆分逻辑卷。

第三步:在 CentOS 系统上添加阿里云镜像源的 Docker CE(社区版)仓库

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

第四步:创建一个名为kubernetes.repo的文件并将其放置在/etc/yum.repos.d/目录下。这个文件是一个Yum仓库配置文件,用于定义一个名为kubernetes的Yum仓库。

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=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

第五步:修改Linux中的yum源配置文件

sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo

安装必备工具(所有节点)

yum install wget jq psmisc vim net-tools telnet yum-utils device-mapper-persistent-data lvm2 git -y

所有节点关闭防火墙、selinux、dnsmasq、swap(所有节点)

#防火墙
systemctl disable --now firewalld 
#dnsmasq 是一个提供 DNS 和 DHCP 服务的轻量级软件,没有安装的话报错也不影响
systemctl disable --now dnsmasq
#如果使用的云服务器或者公司服务器使用了则不需要关闭
systemctl disable --now NetworkManager
#临时关闭 SELinux 安全策略
setenforce 0
#关闭selinux
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/sysconfig/selinux
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
#swap分区
swapoff -a && sysctl -w vm.swappiness=0
sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab

安装ntpdate(所有节点)

#WLNMP是一个开源的Nginx、MySQL和PHP的集成环境,它可以让开发者和系统管理员在Linux系统上轻松搭建并运行基于这些技术的Web应用程序。安装此RPM软件包后,您可以快速设置WLNMP环境并开始部署和运行您的Web项目
rpm -ivh http://mirrors.wlnmp.com/centos/wlnmp-release-centos.noarch.rpm
#安装ntpdate,用于时间同步
yum install ntpdate -y

时间同步(所有节点)

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo 'Asia/Shanghai' >/etc/timezone
ntpdate time2.aliyun.com
# 加入到crontab
crontab -e
#加入进crontab
*/5 * * * * /usr/sbin/ntpdate time2.aliyun.com

这是一组用于在Linux系统上设置时区和同步网络时间的命令。

  1. ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtimeln 命令用于创建符号链接。-s 参数表示创建软链接(符号链接),-f 参数表示如果目标文件已存在,则强制创建新的链接。这个命令将 /usr/share/zoneinfo/Asia/Shanghai(Asia/Shanghai时区的文件)链接到 /etc/localtime,从而将系统时区设置为上海时区。

  2. echo 'Asia/Shanghai' >/etc/timezoneecho 命令用于输出字符串。这个命令将字符串 ‘Asia/Shanghai’ 输出到文件 /etc/timezone,从而将系统时区设置为Asia/Shanghai。

  3. ntpdate [time2.aliyun.com](http://time2.aliyun.com/)ntpdate 命令用于校准系统时间,同步网络时间服务器。这个命令将从阿里云的时间服务器 time2.aliyun.com 获取网络时间,并同步到本地系统时间。这样可以确保系统时间准确无误。

设置文件描述符数量上限(所有节点)

ulimit -SHn 65535 #上限为65535个文件描述符

设置其他限制

vim /etc/security/limits.conf
# 末尾添加如下内容
#用于设置当前用户的最大打开文件数soft limit。soft limit是一个软限制,可以被用户自己修改,但不能超过系统的hard limit。这个参数设置为65536表示当前用户最多可以同时打开65536个文件。
* soft nofile 65536
#用于设置当前用户的最大打开文件数hard limit。hard limit是一个硬限制,只能由系统管理员修改,用户不能超过这个限制。这个参数设置为131072表示系统管理员设置了当前用户最多可以同时打开131072个文件。
* hard nofile 131072
#用于设置当前用户的最大进程数soft limit。soft limit是一个软限制,用户可以在这个限制内自由调整。这个参数设置为65535表示当前用户最多可以同时运行65535个进程
* soft nproc 65535
#用于设置当前用户的最大进程数hard limit。hard limit是一个硬限制,用户无法超过这个限制。
* hard nproc 655350
#用于设置当前用户的最大内存锁定大小soft limit。内存锁定是指将内存中的数据锁定在物理内存中,防止被交换到磁盘上。
* soft memlock unlimited
#用于设置当前用户的最大内存锁定大小hard limit。与soft limit不同的是,hard limit是一个更严格的限制,即使用户想要锁定更多的内存,也不能超过hard limit
* hard memlock unlimited

设置master01免密登陆(master01节点)

#生成rsa密钥,并传到其他节点去
ssh-keygen -t rsa
for i in k8s-master01 k8s-master02 k8s-master03 k8s-node01 k8s-node02;do ssh-copy-id -i .ssh/id_rsa.pub $i;done

下载安装k8s源码文件(master01节点)

cd /root/ ; git clone https://github.com/dotbalo/k8s-ha-install.git

升级系统

因为我的系统版本较低,升级一下

yum update -y --exclude=kernel*

内核升级

uname -r

结果:
3.10.0-327.el7.x86_64,我的操作系统内核版本太低了,需要升级内核,内核怎么选择呢,去K8S或者docker官网找一些推荐的稳定版本内核。我在这里升级的是4.19版本

升级命令

第一步:

cd /root
#下载内核包 master01节点
wget http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-devel-4.19.12-1.el7.elrepo.x86_64.rpm
wget http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-4.19.12-1.el7.elrepo.x86_64.rpm
#拷贝到其他节点
for i in k8s-master02 k8s-master03 k8s-node01 k8s-node02;do scp kernel-ml-4.19.12-1.el7.elrepo.x86_64.rpm kernel-ml-devel-4.19.12-1.el7.elrepo.x86_64.rpm $i:/root/ ; done
#所有节点安装
cd /root && yum localinstall -y kernel-ml*

第二步:安装过后查看默认内核版本,并改变内核启动顺序

grubby --default-kernel

如果是4.19不用更改内核启动顺序,如果不是,则执行:

grub2-set-default  0 && grub2-mkconfig -o /etc/grub2.cfg

grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"

现在再查看默认内核版本,则为4.19
第三步:所有节点重启,然后查看内核版本

#重启
reboot
#查看内核版本
uname -a
所有节点安装ipvsadm
yum install ipvsadm ipset sysstat conntrack libseccomp -y
#所有节点配置ipvs模块,在内核4.19+版本nf_conntrack_ipv4已经改为nf_conntrack, 4.18以下使用nf_conntrack_ipv4即可
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
#编辑配置文件,设置开机自启动
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
#重启服务
systemctl enable --now systemd-modules-load.service
开启一些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
net.ipv4.conf.all.route_localnet = 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
所有节点配置完内核后,重启服务器,保证重启后内核依旧加载
reboot
lsmod | grep --color=auto -e ip_vs -e nf_conntrack

结语

第一天学习就结束了,感受就是,做每一步操作还是要仔细,不然就会提高出错率。

参考来源:

https://edu.51cto.com/course/23845.html
感谢杜老师的课程

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐