背景
最近很多伙伴想使用银河麒麟高级服务器系统v10来部署最新版本的k8s集群,可能遇到了各式各样的问题,于是准备使用kylinOS v10重温一遍kubeadm部署最新版本k8s的流程,也是替大家踩踩坑。
在进行服务器基础配置优化时,到内核参数修改这一步,引发了一些新的思考。
过程
在修改内核参数时,我很熟练的执行了以下命令:
bash
cat > /etc/sysctl.d/k8s.conf << EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.conf.all.route_localnet = 1
vm.overcommit_memory=1
vm.panic_on_oom=0
vm.swappiness = 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.tcp_max_syn_backlog = 16384
net.ipv4.tcp_timestamps = 0
net.core.somaxconn = 16384
EOF
然后:
bash
sysctl -p
然后随便验证了一个ip_forward的参数,发现其值还是0:
bash
cat /proc/sys/net/ipv4/ip_forward
0
突然就想到,我执行sysctl -p
在不加任何参数的情况下,是同步/etc/sysctl.conf
文件的,而kylinOS v10默认的/etc/sysctl.conf
文件中,ip_forward的值设置为0,所以其参数值并没有被修改。
引发的思考
既然我执行sysctl -p
时仅同步/etc/sysctl.conf
文件,那如果我reboot
后,其最终生效的文件是哪个呢?
以前没有深究过系统重启后内核参数的加载顺序问题,正好趁这次机会,好好学习一下完整的加载流程。
系统版本说明
bash
# nkvers
############## Kylin Linux Version #################
Release:
Kylin Linux Advanced Server Release V10 (Trading)
Kernel:
4.19.90-89.18.v2401.ky10.x86_64
Build:
Kylin Linux Advanced Server
Release V10 SP3 2403/(Trading)-x86_64-Build03/20240813
#################################################
内核参数加载顺序的深究
通过一些官方的相关文档和前辈的指导,基本摸清了重启后的加载顺序,详情如下。
内核参数加载的相关服务
系统重启后,与内核参数加载的服务,一共有两个,分别是systemd-sysctl.service
和tuned.service
。
查看服务状态:
bash
# systemctl status systemd-sysctl.service
● systemd-sysctl.service - Apply Kernel Variables
Loaded: loaded (/usr/lib/systemd/system/systemd-sysctl.service; static; vendor preset: disabled)
# systemctl status tuned.service
● tuned.service - Dynamic System Tuning Daemon
Loaded: loaded (/usr/lib/systemd/system/tuned.service; enabled; vendor preset: enabled)
一般情况下,这两个服务都会生效,有时tuned.service
会被设置为disable
,不让其开启自启,我们先来介绍以下这两个服务单元的生效规则和配置文件范围。
systemd-sysctl.service服务
此服务时是系统初始化阶段sysinit.target
隐式调用的,会在系统启动时,自动执行一次,其加载配置文件路径为:
bash
/run/sysctl.d/*.conf
/etc/sysctl.d/*.conf
/usr/local/lib/sysctl.d/*.conf
/usr/lib/sysctl.d/*.conf
/lib/sysctl.d/*.conf
/etc/sysctl.conf
tuned.service服务
此服务可设置为开机自启,也可取消,自由控制,其加载配置文件路径为:
bash
/usr/lib/tuned/balanced/tuned.conf
/usr/lib/tuned/desktop/tuned.conf
/usr/lib/tuned/latency-performance/tuned.conf
/usr/lib/tuned/network-latency/tuned.conf
/usr/lib/tuned/network-throughput/tuned.conf
/usr/lib/tuned/powersave/tuned.conf
/usr/lib/tuned/recommend.d/50-tuned.conf
/usr/lib/tuned/throughput-performance/tuned.conf
/usr/lib/tuned/virtual-guest/tuned.conf
/usr/lib/tuned/virtual-host/tuned.conf
配置文件加载顺序
理论上软件包应将自带的配置文件安装在/usr/lib/目录下,/etc目录仅供系统管理员使用。
一般情况下,当tuned.service
服务设置为enable时,加载顺序是先加载systemd-sysctl.service
服务对应的配置文件,再加载tuned.service
服务的配置文件。
多个文件中有相同内核参数的配置时,后加载的会将先加载的值覆盖掉,这是一个固定的规则!
每个服务又有这么多的配置文件生效路径,那他们的加载顺序是怎样的呢?
systemd-sysctl.service加载顺序
- 配置文件必须符合filename.conf格式,不同目录下的同名配置文件,仅以优先级最高的目录中的配置文件为准。目录优先级顺序如下:/etc > /run > /usr/local/lib > /usr/lib > /lib
- 读取完以上目录下的配置后,最后读取/etc/sysctl.conf。虽然/etc/sysctl.conf的读取优先级最低,但由于相同内核参数下,后加载会覆盖先加载的值,故最终生效的是/etc/sysctl.conf文件的值
- 除了同名的配置文件,其他所有的配置文件与目录无关,统一按照文件名的字典顺序处理。为了便于排序,建议给配置文件都加上两位十进制数字的文件名前缀,这样会先加载数字小的,后加载数字大的文件,同样,相同参数后加载会覆盖先加载的
示例:
有以下几个配置文件:
bash
/usr/lib/sysctl.d/10-default-yama-scope.conf
/usr/lib/sysctl.d/50-pid-max.conf
/etc/sysctl.d/99-sysctl.conf
/usr/lib/sysctl.d/kylin.conf
读取顺序一定是:
/usr/lib/sysctl.d/10-default-yama-scope.conf
--> /usr/lib/sysctl.d/50-pid-max.conf
--> /etc/sysctl.d/99-sysctl.conf
--> /usr/lib/sysctl.d/kylin.conf
--> /etc/sysctl.conf
tuned.service加载顺序
-
如果tuned.service是enable状态,则其后于systemd-sysctl.service加载。
-
tuned分为多种模式,每种模式对应其配置文件,
tuned-adm active
可查看系统使用的哪种模式,tuned-adm list profiles
查看系统支持的模式,tuned-adm profile [name]
设置系统为某模式,例如,本系统为:bash# tuned-adm activeCurrent active profile: virtual-guest
则其对应加载的配置文件为:/usr/lib/tuned/virtual-guest/tuned.conf
-
对应的tuned.conf文件加载完毕后,tuned服务还会执行
sysctl --system
命令,如果配置的参数和之前加载的配置文件有相同内核参数,同样会覆盖。sysctl --system
执行加载顺序如下:bash# sysctl --system | grep Applying * Applying /usr/lib/sysctl.d/10-default-yama-scope.conf ... * Applying /usr/lib/sysctl.d/50-coredump.conf ... * Applying /usr/lib/sysctl.d/50-default.conf ... * Applying /usr/lib/sysctl.d/50-libkcapi-optmem_max.conf ... * Applying /usr/lib/sysctl.d/50-pid-max.conf ... * Applying /etc/sysctl.d/99-sysctl.conf ... * Applying /etc/sysctl.d/k8s.conf ... * Applying /usr/lib/sysctl.d/kylin.conf ... * Applying /etc/sysctl.conf ...
临时主动加载配置文件
系统中还可以使用sysctl -p
来主动加载指定内核参数配置文件生效,其后不指定任何文件时,默认加载/etc/sysctl.conf
,若指定文件,则表示加载指定文件,例如:
bash
sysctl -p /etc/sysctl.d/k8s.conf
银河麒麟系统中需要注意的点
银河麒麟系统中默认有个/usr/lib/sysctl.d/kylin.conf
内核参数配置文件,其中已经配置诸多优化参数,其命名规则加载顺序较为靠后,所以在配置与其文件相同的参数项时,需要注意:
- 将文件命名修改为在kylin.conf其后加载
- 也可以选择直接修改kylin.conf中的配置
- 直接配置到/etc/sysctl.conf中
总结
- tuned.service后于systemd-sysctl.service加载
- 不同目录同名配置文件取目录优先级高的,非同名统一按照文件名的字典顺序加载
- 优先级越高越先加载,越低越后加载,
/etc/sysctl.conf
最后加载 - 别忘记
/usr/lib/sysctl.d/kylin.conf
文件 - 别忘记相同参数覆盖的问题