四、Kubernetes学习指南:保姆级实操手册04——主机系统初始化
前言: 本章节主要内容是对主机操作系统的初始化操作,如发另外标注,所有的节点操作步骤一致,可以使用软件批量初始化。
1. 检查系统端口
确保以下端口未被占用: 运行后未有任务显示,表示端口未被占用。
[root@k8s-master01 ~]# ss -alnupt |grep -E '6443|10250|10259|10257|2379|2380'
[root@k8s-master01 ~]# ss -alnupt |grep -E '10250|3[0-2][0-7][0-6][0-7]'
2. 设置主机名
对于如k8s-master01
等主机,设置主机名并重启:
hostnamectl set-hostname k8s-master01
bash #改名后立即生效
3. 关闭SELinux和防火墙
[root@k8s-master01 ~]# setenforce 0;getenforce
[root@k8s-master01 ~]# sed -i "s/^SELINUX=.*/SELINUX=disabled/" /etc/sysconfig/selinux
[root@k8s-master01 ~]# systemctl stop firewalld.service ;systemctl disable firewalld.service ;systemctl status firewalld.service
4. 更新/etc/hosts
添加必要的静态解析:
[root@k8s-master01 ~]# cat > /etc/hosts <<EOF
> 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
> ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
>
> 10.255.210.1 k8s-master01
> 10.255.210.2 k8s-master02
> 10.255.210.3 k8s-master03
> 10.255.210.4 k8s-node01
> 10.255.210.5 k8s-node02
> 10.255.210.6 k8s-node03
> 10.255.210.99 apiserver.fq.com
>
> EOF
[root@k8s-master01 ~]# cat /etc/hosts
5. 配置/etc/resolv.conf
指定DNS服务器: 注:nameserver 后面的IP改为你环境可用的DNS IP地址
echo "nameserver 10.0.1.1" >> /etc/resolv.conf
systemctl restart network
ping -c 3 www.baidu.com
6. 配置免密登录
生成SSH密钥对并分发到所有节点: [[配置ssh免密登录]]
cat > password_free_login.sh <<'EOF'
#!/bin/bash
# 创建密钥对
if [ ! -f /root/.ssh/id_rsa ]; then
ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsa -q
fi
# 声明你服务器密码,建议所有节点的密码均一致,否则该脚本需要再次进行优化.
export mypasswd='Abcd@123456#' # 注意修改系统密码
# 定义主机列表
k8s_host_list=(k8s-master0{1..3} k8s-node0{1..3})
# 确认expect命令已安装
if ! command -v expect &> /dev/null; then
echo "Expect command could not be found. Please install it and re-run the script."
exit 1
fi
# 配置免密登录,利用expect工具免交互输入
for i in ${k8s_host_list[@]}; do
expect -c "
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@$i
expect {
\"*yes/no*\" {send \"yes\r\"; exp_continue}
\"*password*\" {send \"$mypasswd\r\"; exp_continue}
}"
done
EOF
sudo yum install -y expect
chmod +x password_free_login.sh
sh password_free_login.sh
7. 时间同步配置
安装并配置chrony
作为NTP服务器或客户端,确保时间同步。 [[chrony 时间同步服务器]]
7.1 server
在k8s-master01节点上安装chrony作为服务器端
7.1.1、安装chrony软件
yum install -y chrony
7.1.2、修改配置文件
cat > /etc/chrony.conf <<EOF
server ntp1.aliyun.com iburst minpoll 4 maxpoll 10
server ntp2.aliyun.com iburst minpoll 4 maxpoll 10
server ntp3.aliyun.com iburst minpoll 4 maxpoll 10
server ntp4.aliyun.com iburst minpoll 4 maxpoll 10
server ntp5.aliyun.com iburst minpoll 4 maxpoll 10
server ntp6.aliyun.com iburst minpoll 4 maxpoll 10
server ntp7.aliyun.com iburst minpoll 4 maxpoll 10
driftfile /var/lib/chrony/drift
makestep 10 3
rtcsync
allow 0.0.0.0/0
local stratum 10
keyfile /etc/chrony.keys
logdir /var/log/chrony
stratumweight 0.05
noclientlog
logchange 0.5
EOF
7.1. 3、重启服务
systemctl restart chronyd;systemctl status chronyd
7.2 client
其他节点做为客户端,同步k8s-master01的时间
7.2.1、安装chrony软件
yum install -y chrony
7.2.2、修改配置文件
sudo bash -c 'cat > /etc/chrony.conf <<EOF
server k8s-master01 iburst
driftfile /var/lib/chrony/drift
makestep 10 3
rtcsync
local stratum 10
keyfile /etc/chrony.key
logdir /var/log/chrony
stratumweight 0.05
noclientlog
logchange 0.5
EOF'
7.2.3、重启服务
systemctl restart chronyd;systemctl status chronyd
7.2.4、跟踪和显示同步源
#显示本地主机与其对应的时间服务器之间的跟踪状态
chronyc tracking
#显示所有的可信赖来源列表
chronyc sources -v
# 如果发现本地主机的时间与时间服务器不一致,可以使用以下命令强制更新时间:
chronyc makestep
# 然后等待一段时间,再次确认时间是否已同步。
另外,还可以设置自动同步频率:
chronyc sourcesstats --auto-sync-interval time interval_in_seconds
7.2.5、分发chrony.conf配制文件到其他节点
vim put-chrony-client.sh
#!/bin/bash
for i in k8s-master0{1..3} k8s-node0{1..3}
do
scp /etc/chrony.conf root@$i:/etc/
done
chmod +x [put-chrony-client.sh]
8. 内核更新
[[linux系统内核更新]]
CentOS 7.x 版本的系统默认内核是3.10,该版本的内核在Kubernetes社区有很多已知的Bug(如:内核内存泄漏错误),建议升级成4.17+版本以上
官方镜像仓库下载地址:Coreix Mirrors
阿里云镜像仓库: elrepo-kernel-el7-x86_64-RPMS安装包下载_开源镜像站-阿里云
8.1、查看系统默认内核版本
cat /etc/redhat-release
hostnamectl
uname -r
grub2-editenv list
eg:[root@k8s-master01 ~]# grub2-editenv list
saved_entry=CentOS Linux (3.10.0-1160.25.1.el7.x86_64) 7 (Core)
8.2、查看可升级的内核版本
curl http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/ |grep kernel-ml-6.6*
8.3、更新安装指定的内核
rpm -ivh http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-ml-6.6.9-1.el7.elrepo.x86_64.rpm
rpm -ivh http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-ml-devel-6.6.9-1.el7.elrepo.x86_64.rpm
8.4、查看内核启动顺序
awk -F \' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
eg:
[root@k8s-master01 ~]# awk -F \' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
0 : CentOS Linux (6.6.9-1.el7.elrepo.x86_64) 7 (Core)
1 : CentOS Linux (3.10.0-1160.25.1.el7.x86_64) 7 (Core)
2 : CentOS Linux (3.10.0-957.el7.x86_64) 7 (Core)
3 : CentOS Linux (0-rescue-7be69544cd044123946847dd8f992266) 7 (Core)
8.5、设置系统启动默认内核
grub2-set-default "CentOS Linux (6.6.9-1.el7.elrepo.x86_64) 7 (Core)"
8.6、设置系统内核启动配置文件
grub2-mkconfig -o /boot/grub2/grub.cfg
8.7、检查默认内核
grub2-editenv list
eg:[root@k8s-master01 ~]# grub2-editenv list
saved_entry=CentOS Linux (6.6.9-1.el7.elrepo.x86_64) 7 (Core)
8.8、重启系统
reboot
8.9、重启后检查
cat /etc/redhat-release
hostnamectl
uname -r
grub2-editenv list
eg:[root@k8s-master01 ~]# grub2-editenv list
saved_entry=CentOS Linux (6.6.9-1.el7.elrepo.x86_64) 7 (Core)
9. 安装常用软件
安装编译工具、常用工具等:
yum -y install gcc gcc-c++ make autoconf libtool-ltdl-devel gd-devel freetype-devel libxml2-devel libjpeg-devel libpng-devel openssh-clients openssl-devel curl-devel bison patch libmcrypt-devel libmhash-devel ncurses-devel binutils compat-libstdc++-33 elfutils-libelf elfutils-libelf-devel glibc glibc-common glibc-devel libgcj libtiff pam-devel libicu libicu-devel gettext-devel libaio-devel libaio libgcc libstdc++ libstdc++-devel unixODBC unixODBC-devel numactl-devel glibc-headers sudo bzip2 mlocate flex lrzsz sysstat lsof setuptool system-config-network-tui system-config-firewall-tui ntsysv ntp pv lz4 dos2unix unix2dos rsync dstat iotop innotop mytop telnet iftop expect cmake nc gnuplot screen xorg-x11-utils xorg-x11-xinit rdate bc expat-devel compat-expat1 tcpdump sysstat man nmap curl lrzsz elinks finger bind-utils traceroute mtr ntpdate zip unzip vim wget net-tools
10. 日志持久化配置
创建持久化保存日志的目录和配置文件。
mkdir /var/log/journal
mkdir /etc/systemd/journald.conf.d
cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF
[Journal]
#持久化保存到磁盘
Storage=persistent
#压缩历史日志
Compress=yes
SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000
#最大占用空间10G
SystemMaxUse=10G
#单日志文件最大 200M
SystemMaxFileSize=200M
#日志保存时间2周
MaxRetentionsSec=2week
#不将日志转发到syslog
ForwardToSyslog=no
EOF
systemctl restart systemd-journald
11. 开启IPVS
加载所需的模块并配置IPVS。
modprobe br_netfilter
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack
12. 系统优化
关闭swap、设置bridge-nf、调整内核参数等。
### 在所有节点上执行
# 关闭swap
swapoff -a
sed -i "s/^[^#].*swap/#&/g" /etc/fstab
# 启用bridge-nf功能
cat > /etc/modules-load.d/k8s.conf << EOF
overlay
br_netfilter
EOF
modprobe overlay && modprobe br_netfilter
# 设置内核参数
cat > /etc/sysctl.d/k8s.conf << EOF
# 配置转发 IPv4 并让 iptables 看到桥接流量
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
# 加强握手队列能力
net.ipv4.tcp_max_syn_backlog = 10240
net.core.somaxconn = 10240
net.ipv4.tcp_syncookies = 1
# 调整系统级别的能够打开的文件句柄的数量
fs.file-max=1000000
# 配置arp cache 大小
net.ipv4.neigh.default.gc_thresh1 = 1024
net.ipv4.neigh.default.gc_thresh2 = 4096
net.ipv4.neigh.default.gc_thresh3 = 8192
# 令TCP窗口和状态追踪更加宽松
net.netfilter.nf_conntrack_tcp_be_liberal = 1
net.netfilter.nf_conntrack_tcp_loose = 1
# 允许的最大跟踪连接条目,是在内核内存中netfilter可以同时处理的“任务”(连接跟踪条目)
net.netfilter.nf_conntrack_max = 10485760
net.netfilter.nf_conntrack_tcp_timeout_established = 300
net.netfilter.nf_conntrack_buckets = 655360
# 每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。
net.core.netdev_max_backlog = 10000
# 默认值: 128 指定了每一个real user ID可创建的inotify instatnces的数量上限
fs.inotify.max_user_instances = 524288
# 默认值: 8192 指定了每个inotify instance相关联的watches的上限
fs.inotify.max_user_watches = 524288
EOF
sysctl --system
# 修改文件打开数
ulimit -n 65545
cat >> /etc/security/limits.conf << EOF
* soft nproc 65535
* hard nproc 65535
* soft nofile 65535
* hard nofile 65535
EOF
sed -i '/nproc/ s/4096/65535/' /etc/security/limits.d/20-nproc.conf
13. 容器运行时安装
常用的 containerd or cri-docker
注: 本文使用cri-docker作为容器运行时
Kubernetes最新版本(v1.24+)移除了对Docker作为容器运行时的原生支持,但这并不意味着完全不支持Docker。
- Kubernetes仍然支持使用Docker镜像。所有现有的Docker镜像可以直接用在k8s集群中,不需要修改。
- Kubernetes已经全面拥抱容器运行时接口(CRI)。最新版本的kubelet将通过CRI管理容器,而不是直接通过Docker API。
- 用户可以继续使用Docker作为CRI运行时。只需要安装并配置Docker的CRI插件,即docker-containerd插件,kubelet就可以通过CRI控制Docker。
- 推荐的容器运行时是containerd。它功能丰富,性能好,资源消耗少。docker-containerd确保它可以与Docker镜像兼容。
- 切换到containerd后,节点上仍可以同时运行Docker引擎,用于构建镜像等场景。
- Kubernetes移除Docker的依赖可以使其支持更多类型的容器运行时,提高其可移植性。
最新k8s版本只是去掉了直接通过Docker API管理容器的方式,但通过添加CRI层,用户仍可以继续使用Docker及其镜像。这带来更多可选择性及未来兼容性。 [[dockerce &cri-docker 与kubernetes版本对应关系]]
13.1、安装docker
[[CRI-Docker 安装指南]]
1、更新YUM源&升级系统
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
yum -y update
2、卸载已安装Docker
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
3、安装依赖包
yum -y install yum-utils device-mapper-persistent-data lvm2
4、创建docker yum仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum clean all
yum repolist
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
5、查看可用的docker版本
yum list docker-ce --showduplicates | sort -r
6、安装dockerCE
使用yum安装了最新版本的Docker CE社区版、命令行工具包及containerd.io容器运行时,完成了Docker CE的安装。
注意:docker和k8s版本有指定要求 可前往github查看对应版本 kubernetes/CHANGELOG at master · kubernetes/kubernetes · GitHub
yum install docker-ce-24.0.9-1.el7 -y
yum -y install docker-ce docker-ce-cli containerd.io
yum install -y docker-ce-3:24.0.9-1.el7 docker-ce-cli-3:24.0.9-1.el7 containerd.io docker-buildx-plugin docker-compose-plugin
7、添加docker仓库加速器
先使用“mkdir /etc/docker”创建docker目录,然后配置“daemon.conf”文件。
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": [
"https://pho7vcn8.mirror.aliyuncs.com",
"https://hub-mirror.c.163.com",
"https://reg-mirror.qiniu.com"
],
"exec-opts":["native.cgroupdriver=systemd"],
"log-driver":"json-file",
"log-opts":{
"max-size":"100m"
}
}
EOF
8、重新加载守护进程
sudo systemctl daemon-reload
9、配置docker开机启动
[[Q 启动docker时报错 unknown option overlay2]] 注:如启动docker时报错,可查看
sudo systemctl enable docker --now && systemctl restart docker
docker info
13.2、安装cri-docker
1、下载安装包
cri-docker github地址: [https://github.com/Mirantis/cri-dockerd]
wget -c https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.13/cri-dockerd-0.3.13-3.el7.x86_64.rpm
注: 如使用 wget 无法下载,可自行登录上面网址,下载后导入到服务器安装,并使用scp命令下发软件到各节点
for i in k8s-master0{1..3} k8s-node0{1..3}; do scp /root/cri-dockerd-0.3.13-3.el7.x86_64.rpm root@$i:/root/; done
2、RPM包安装
rpm -ivh cri-dockerd-0.3.13-3.el7.x86_64.rpm
3、配置沙箱(pause)镜像
配置沙箱(pause)镜像
[root@k8s-master01 ~]# sed -i '/ExecStart/s#dockerd#& --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9#' /usr/lib/systemd/system/cri-docker.service
---示例样本--
vim /usr/lib/systemd/system/cri-docker.service
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket
[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
vim /usr/lib/systemd/system/cri-docker.socket
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service
[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker
[Install]
WantedBy=sockets.target
4、重新加载并启动cri-docker
systemctl daemon-reload
systemctl enable cri-docker.socket cri-docker --now
eg:
[root@k8s-master01 ~]# systemctl enable cri-docker.socket cri-docker --now
Created symlink from /etc/systemd/system/sockets.target.wants/cri-docker.socket to /usr/lib/systemd/system/cri-docker.socket.
Created symlink from /etc/systemd/system/multi-user.target.wants/cri-docker.service to /usr/lib/systemd/system/cri-docker.service.
14. 操作系统初始化完成
在完成所有配置后,对VM进行快照操作。