基本环境配置¶
1、修改主机名
$ hostnamectl set-hostname node03
2、修改host文件
(1)新节点安装vim工具,如果安装过请忽略
$ yum install vim -y
(2)每台机器上修改hosts文件
$ vim /etc/hosts
192.168.1.60 master01
192.168.1.63 master02
192.168.1.64 master03
192.168.1.65 master-vip
192.168.1.61 node01
192.168.1.62 node02
192.168.1.66 node03
3、安装yum源
(1)在新节点上执行以下命令配置默认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
(2)在新节点上执行以下命令配置Docker的yum源
$ yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
(3)在新节点上执行以下命令配置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
$ sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
4、必备工具安装
(1)在新节点上执行以下命令安装必备工具
$ yum install wget jq psmisc vim net-tools telnet yum-utils device-mapper-persistent-data lvm2 git -y
5、在新节点上关闭防火墙、swap分区、dnsmasq、selinux
(1)在新节点上执行以下命令关闭防火墙
$ systemctl disable --now firewalld
(2)在新节点上执行以下命令关闭selinux
$ setenforce 0
$ sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/sysconfig/selinux
$ sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
(3)在新节点上执行以下命令关闭dnsmasq
$ systemctl disable --now dnsmasq
Failed to execute operation: No such file or directory
注意:这里如果是通过VMware虚拟机实践的,会因为没有这个服务而报错!!!
(4)在新节点上执行以下命令关闭NetworkManager
$ systemctl disable --now NetworkManager
注意:公有云不要关闭NetworkManager!!!
(5)在新节点上执行以下命令关闭swap分区
#临时关闭
$ swapoff -a && sysctl -w vm.swappiness=0
#永久关闭
$ sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab
6、时钟同步
(1)在新节点上执行以下命令安装ntpdate
$ rpm -ivh http://mirrors.wlnmp.com/centos/wlnmp-release-centos.noarch.rpm
$ yum install ntpdate -y
(2)在新节点上执行以下命令同步时间
$ ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
$ echo 'Asia/Shanghai' >/etc/timezone
$ ntpdate time2.aliyun.com
#添加定时任务
$ crontab -e
*/5 * * * * /usr/sbin/ntpdate time2.aliyun.com
7、配置limit
(1)在新节点上执行以下命令配置limit
$ ulimit -SHn 65535
$ vim /etc/security/limits.conf
# 末尾添加以下内容
* soft nofile 65536
* hard nofile 131072
* soft nproc 65535
* hard nproc 655350
* soft memlock unlimited
* hard memlock unlimited
8、新节点配置免密钥登录
(1)在Master01节点上配置如下命令,使其免密钥登录其他节点
$ ssh-copy-id -i .ssh/id_rsa.pub node03
注意:此操作结束后会提示输入4次其他节点的密码!!!
(2)在Master01节点上远程登录node03节点进行测试,发现测试成功
$ ssh node03
9、升级系统
(1)在新节点上执行以下命令升级系统
$ yum update -y --exclude=kernel*
内核配置¶
Centos7默认内核为3.10
$ uname -a
Linux master01 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
1.内核升级
(1)从master01节点传到新节点
$ scp kernel-ml-4.19.12-1.el7.elrepo.x86_64.rpm kernel-ml-devel-4.19.12-1.el7.elrepo.x86_64.rpm node03:/root/
(3)在新节点上执行以下命令安装内核
$ cd /root && yum localinstall -y kernel-ml*
(4)在新节点上执行以下命令更改内核启动顺序
$ grub2-set-default 0 && grub2-mkconfig -o /etc/grub2.cfg
$ grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"
(5)在新节点上执行以下命令检查默认内核是不是4.19
$ grubby --default-kernel
/boot/vmlinuz-4.19.12-1.el7.elrepo.x86_64
(6)在新节点上执行以下命令重启并检查默认内核是不是4.19
$ reboot
$ uname -a
Linux master02 4.19.12-1.el7.elrepo.x86_64 #1 SMP Fri Dec 21 11:06:36 EST 2018 x86_64 x86_64 x86_64 GNU/Linux
2.配置ipvs模块
(1)在新节点上执行以下命令安装ipvsadm
$ yum install ipvsadm ipset sysstat conntrack libseccomp -y
(2)在新节点上执行以下命令配置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
(3)在新节点上修改/etc/modules-load.d/ipvs.conf文件,在文件末尾添加以下内容
$ 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
(4)在新节点上设置开机自启
$ systemctl enable --now systemd-modules-load.service
(5)在新节点上执行以下命令开启一些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
上面参数说明:
- net.ipv4.ip_forward:允许系统在网络接口之间转发IP数据包
- net.bridge.bridge-nf-call-iptables:启用iptables处理桥接的网络流量
- net.bridge.bridge-nf-call-ip6tables:启用ip6tables处理桥接的网络流量
- fs.may_detach_mounts:允许在使用时卸载文件系统
- net.ipv4.conf.all.route_localnet:允许本地源IP地址的数据包路由
- vm.overcommit_memory:控制内存分配的过度提交行为
- vm.panic_on_oom:控制当发生内存不足条件时内核崩溃的行为
- fs.inotify.max_user_watches:指定每个用户的最大inotify监视数
- fs.file-max:指定最大打开文件数
- fs.nr_open:指定可打开的文件句柄的最大数
- net.netfilter.nf_conntrack_max:指定最大跟踪连接数
- net.ipv4.tcp_keepalive_time:指定TCP keepalive探测之间的间隔时间
- net.ipv4.tcp_keepalive_probes:指定可以发送的TCP keepalive探测的数量
- net.ipv4.tcp_keepalive_intvl:指定TCP keepalive探测之间的间隔时间
- net.ipv4.tcp_max_tw_buckets:指定timewait套接字的最大数量
- net.ipv4.tcp_tw_reuse:控制timewait套接字是否可以被重用
- net.ipv4.tcp_max_orphans:指定最大孤立套接字数量
- net.ipv4.tcp_orphan_retries:指定孤立套接字的重试次数
- net.ipv4.tcp_syncookies:启用TCP syncookies以防止SYN洪泛攻击
- net.ipv4.tcp_max_syn_backlog:指定侦听队列的最大大小
- net.ipv4.ip_conntrack_max:指定最大跟踪连接数
- net.ipv4.tcp_max_syn_backlog:指定侦听队列的最大大小
- net.ipv4.tcp_timestamps:启用TCP时间戳以进行性能优化
- net.core.somaxconn:指定侦听队列中的最大连接数
(6)重启新节点
$ reboot
(7)在新节点上执行以下命令进行验证,有"nf_conntrack"和"ip_vs"字样代表成功
$ lsmod | grep --color=auto -e ip_vs -e nf_conntrack

Containerd作为Runtime¶
如果安装的版本低于1.24,选择Docker和Containerd均可,高于1.24选择Containerd作为Runtime。
1.在新节点上执行以下命令安装docker-ce-20.10,注意这里安装docker时会把Containerd也装上
$ yum install docker-ce-20.10.* docker-ce-cli-20.10.* -y
2.在新节点上执行以下命令配置Containerd所需的模块
$ cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
3.在新节点上执行以下命令加载模块
$ modprobe -- overlay
$ modprobe -- br_netfilter
4.在新节点上执行以下命令配置Containerd所需的内核
$ cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
5.在新节点上执行以下命令加载内核
$ sysctl --system
6.在新节点上执行以下命令配置Containerd的配置文件
$ mkdir -p /etc/containerd
$ containerd config default | tee /etc/containerd/config.toml
7.在新节点上执行以下命令将Containerd的Cgroup改为Systemd,找到containerd.runtimes.runc.options,添加SystemdCgroup = true(如果已存在直接修改,否则会报错)
$ vim /etc/containerd/config.toml
...
...
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
BinaryName = ""
CriuImagePath = ""
CriuPath = ""
CriuWorkPath = ""
IoGid = 0
IoUid = 0
NoNewKeyring = false
NoPivotRoot = false
Root = ""
ShimCgroup = ""
SystemdCgroup = true

8.在新节点上执行以下命令将sandbox_image的Pause镜像改成符合自己版本的地址registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6
$ vim /etc/containerd/config.toml
#原本内容
sandbox_image = "registry.k8s.io/pause:3.6"
#修改后的内容
sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6"

9.在新节点上执行以下命令启动Containerd,并配置开机自启动
$ systemctl daemon-reload
$ systemctl enable --now containerd
$ ls /run/containerd/containerd.sock
/run/containerd/containerd.sock
10.在新节点上执行以下命令配置crictl客户端连接的运行时位置
$ cat > /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF
11.在新节点上执行以下命令进行验证
$ ctr image ls
REF TYPE DIGEST SIZE PLATFORMS LABELS
安装Kubernetes组件Kubeadm&Kubelet¶
1.在新节点查看最新的Kubernetes版本是多少
$ yum list kubeadm.x86_64 --showduplicates | sort -r
2.在新节点上执行以下命令安装1.26最新版本kubeadm、kubelet和kubectl
$ yum install kubeadm-1.26* kubelet-1.26* kubectl-1.26* -y
#查看版本
$ kubeadm version
3.在新节点上执行以下命令更改Kubelet的配置使用Containerd作为Runtime,如果选择的是docker作为的Runtime,则不需要进行更改
$ cat >/etc/sysconfig/kubelet<<EOF
KUBELET_KUBEADM_ARGS="--container-runtime=remote --runtime-request-timeout=15m --container-runtime-endpoint=unix:///run/containerd/containerd.sock"
EOF
4.在新节点上执行以下命令设置Kubelet开机自启动(由于还未初始化,没有kubelet的配置文件,此时kubelet无法启动,无需管理)
$ systemctl daemon-reload
$ systemctl enable --now kubelet
$ systemctl status kubelet
说明:由于还未初始化,没有kubelet的配置文件,此时kubelet无法启动,无需管理
13.4.1.5添加新节点¶
1、在Master01节点上生成新的token
[root@master01 ~]# kubeadm token create --print-join-command
kubeadm join 192.168.1.65:16443 --token u9ur5s.upyu9raqp6hwkk0g --discovery-token-ca-cert-hash sha256:c43fc602f2c19d3322d48dc68b150f940e4679cd74d5fc1542183a7f1dc7fa62
2、复制上面生成的命令到新节点
[root@node03 ~]# kubeadm join 192.168.1.65:16443 --token u9ur5s.upyu9raqp6hwkk0g --discovery-token-ca-cert-hash sha256:c43fc602f2c19d3322d48dc68b150f940e4679cd74d5fc1542183a7f1dc7fa62
3、在Master01节点上查看是否成功加入
[root@master01 ~]# k get node
NAME STATUS ROLES AGE VERSION
master01 Ready control-plane 18h v1.26.9
master02 Ready control-plane 18h v1.26.9
master03 Ready control-plane 18h v1.26.9
node01 Ready <none> 18h v1.26.9
node02 Ready <none> 18h v1.26.9
node03 Ready <none> 7m8s v1.26.9