Kubernetes学习指南:保姆级实操手册04—主机系统初始化

四、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进行快照操作。

  • 23
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值