首页 > 其他分享 >Kubernetes学习指南:保姆级实操手册04——主机系统初始化

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

时间:2024-09-04 18:23:58浏览次数:17  
标签:学习指南 cri Kubernetes 04 devel etc docker k8s root

四、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+版本以上

官方镜像仓库下载地址:http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/

阿里云镜像仓库: https://mirrors.aliyun.com/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 安装指南]]

13.1.1、更新YUM源&升级系统
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo  
yum -y update
13.1.2、卸载已安装Docker
sudo yum remove docker \  
docker-client \  
docker-client-latest \  
docker-common \  
docker-latest \  
docker-latest-logrotate \  
docker-logrotate \  
docker-engine
13.1.3、安装依赖包
yum -y install yum-utils device-mapper-persistent-data lvm2
13.1.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
13.1.5、查看可用的docker版本
yum list docker-ce --showduplicates | sort -r
13.1.6、安装dockerCE

使用yum安装了最新版本的Docker CE社区版、命令行工具包及containerd.io容器运行时,完成了Docker CE的安装。
注意:docker和k8s版本有指定要求  可前往github查看对应版本  https://github.com/kubernetes/kubernetes/tree/master/CHANGELOG

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
13.1.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
13.1.8、重新加载守护进程
sudo systemctl daemon-reload
13.1.9、配置docker开机启动

[[Q 启动docker时报错 unknown option overlay2]] 注:如启动docker时报错,可查看

sudo systemctl enable docker --now && systemctl restart docker  

docker info

13.2、安装cri-docker

13.2.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
13.2.2、RPM包安装
rpm -ivh cri-dockerd-0.3.13-3.el7.x86_64.rpm
13.2.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
13.2.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进行快照操作。

标签:学习指南,cri,Kubernetes,04,devel,etc,docker,k8s,root
From: https://blog.51cto.com/u_4068847/11919529

相关文章

  • Kubernetes学习指南:保姆级实操手册05——配置集群HA负载均衡
    五、Kubernetes学习指南:保姆级实操手册05——配置集群HA负载均衡简介:Keepalived提供VRRP实现,并允许您配置Linux机器使负载均衡,预防单点故障。HAProxy提供可靠、高性能的负载均衡,能与Keepalived完美配合1、配置Keepalive官方文档提供了两种运行方式(此案例使用选项1):选项1:在......
  • Kubernetes从零到精通(03-资源对象)
    资源对象的种类今天我们开始研究Kubernetes中的资源对象,资源对象是Kubernetes这个软件定义的抽象逻辑概念,这些资源对象及其对应的属性(如资源对象之间的对应关系),都会保存到ectd数据库中并通过Kubernetes各控制组件实时更新,下面我们先看一下资源对象的分类和用途,然后再根据一个......
  • 【春秋云境】CVE-2020-26048(文件上传漏洞)
    点击路径,进入页面,尝试攻克。admin/admin弱口令成功登录寻找能进行文件上传的地方,点击“文件管理”尝试上传php后缀的一句话木马文件,发现失败上传png后缀的一句话木马文件,发现成功对文件重命名前打开bp,进行抓包,修改后缀名删除.htaccess文件(该文件具有重定向URL、......
  • 自我认知及软件工程学习指南
    目前我已经具备的专业知识:数据库、数据挖掘、机器学习、c、python、matlab等,会使用pytorch、tensorflow基础功能,了解深度学习的基础算法。会使用神经网络、森林灭火等数学建模常用算法我感兴趣的技术方向:联邦学习、大数据架构、跨学科领域交叉数据融合分析、大数据治理等我缺少......
  • 20240904:字符串选做
    P4555[国家集训队]最长双回文串题意:给定字符串\(s\),找到他最长双回文串\(t\)的长度。双回文串定义为存在一个\(i>1\)使得\(t[1,i)\)和\(t[i,n]\)都是回文串。\(\verts\vert\le10^5\)。二分哈希求出所有回文中心的半径,设以\(i\)为中心的最长回文串为\([l_i,......
  • day04_编译原理学习
    第四章语法分析自顶向下分析的概述处理文法的编译器大致分为三种类型:通用型,自顶向下型和自底向上型。编译器中常用的方法可以分为自顶向下和自底向上。自顶向下分析从分析树的顶部(根节点)向底部(叶节点)方向构造分析树可以看成是从文法开始符号S推导出词串w的过程。每一步推......
  • 2024-09-04:用go语言,给定一个长度为n的数组 happiness,表示每个孩子的幸福值,以及一个正
    2024-09-04:用go语言,给定一个长度为n的数组happiness,表示每个孩子的幸福值,以及一个正整数k,我们需要从这n个孩子中选出k个孩子。在筛选过程中,每轮选择一个孩子时,所有尚未选中的孩子的幸福值都会减少1。需要注意的是,幸福值不能降低到负数,只有在其为正数时才能减少。我们的目标是......
  • kubernetes初始化集群时报错
    报错:kubernetes初始化端口占用及文件存在(本人是之前初始化过一次)[root@master~]#kubeadminit--apiserver-advertise-address=192.168.20.200--image-repository=registry.aliyuncs.com/google_containers--kubernetes-version=v1.28.0--pod-network-cidr=10.244.0.0/16--......
  • 09--kubernetes持久化存储和StatefulSet控制器
    前言:本章是k8s持久化存储的详细笔记,由持久化引申出来的statefulset控制器和无头svc都会在本章有详细记录。1、K8s持久化存储PV和PVC在前面文章已经使用卷挂载的方式将pod文件持久化保存在宿主机中,但实际工作中pod往往会以多副本形式存在,此时需要每一个宿主机上都有对应的挂载......
  • D13 kubernetes 容器资源配额
    1、资源请求与资源限制 默认情况下,容器可以无限制的使用节点上所有的资源(如内存、cpu)。 假设在一个节点上运行多个pod,其中一个pod的访问量突然增加,该pod将不断请求节点资源。最终该pod占用大量资源,导致其他的资源缺乏足够的资源可用,从而引发访问速度非常慢,甚至无法正常提供服务......