1、设置时区并同步时间
2、禁用selinx
3、清空防火墙默认策略
4、历史命令显示操作时间
5、禁止root远程登录
6、禁止定时任务发送邮件
7、设置最大打开文件数
8、减少Swap使用
9、系统内核参数优化
10、安装系统性能分析工具及其他工具
#!/bin/bash
# 设置时区并同步时间
timedatectl set-timezone Asia/Shanghai
if ! crontab -l | grep ntpdate &</dev/null ; then
(echo "* 1 * * * ntpdate time.windows.com >/dev/null 2>&1";crontab -l) | crontab
fi
# 禁用selinux
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/sysconfig/selinux
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
systemctl disable --now NetworkManager
# 关闭防火墙
if egrep "7.[0-9]" /etc/redhat-release &>/dev/null;then
systemctl stop firewalld
systemctl disable firewalld
elif egrep "6.[0-9]" /etc/redhat-release &>/dev/null;then
service iptables stop
chkconfig iptables off
fi
# 历史命令显示操作时间
if ! grep HISTTIMEFORMAT /etc/bashrc; then
echo 'export HISTTIMEFORMAT="%F %T `whoami` "' >>/etc/bashrc
fi
# SSH超时时间
if ! grep "TMOUT=600" /etc/profile &>/dev/null; then
echo "export TMOUT=600" >> /etc/profile
fi
# 关闭ssh解析,禁止root远程登录
#sed -i.bak 's@#UseDNS yes@UseDNS no@g;s@^GSSAPIAuthentication yes@GSSAPIAuthentication no@g' /etc/ssh/sshd_config
# 禁止定时任务发送邮件
sed -i 's/^MAILTO=root/MAILTO=""/' /etc/crontab
#关闭邮件服务
systemctl stop postfix && systemctl disable postfix
# 设置最大打开文件数
if ! grep "* soft nofile 65535" /etc/security/limits.conf &>/dev/null; then
cat >> /etc/security/limits.conf <<EOF
* soft nofile 65536 #可打开的文件描述符的最大数
* hard nofile 131072 #可打开的文件描述符的最大数
* soft nproc 65535 #单个用户可用的最大进程数量
* hard nproc 655350 #单个用户可用的最大进程数量
* soft memlock unlimited #系统硬限制无上限
* hard memlock unlimited #系统软限制无上限
EOF
fi
# 系统内核优化
cat >> /etc/sysctl.conf <<EOF
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_tw_buckets = 20480
net.ipv4.tcp_max_syc_backlog = 20480
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_fin_timeout = 20
EOF
# 减少SWAP使用
swapoff -a && sysctl -w vm.swappiness=0
sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab
# 安装阿里yum源
yum -y install wget
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum repolist && yum makecache fast
# 安装系统性能分析工具及其他
yum -y install gcc make autoconf vim net-tools ntpdate sysstat iftop iotop lrzsz glances htop
一、cgroups是什么?
对于容器技术而言,它实现资源层面上的限制和隔离,依赖于 Linux 内核所提供的 cgroup 和 namespace 技术。简单来说 Namespace 可以让每个进程有独立的 PID, IPC 和网络空间。cgroup 可以控制进程的资源占用,比如 CPU ,内存和允许的最大进程数等等。cgroup 是在 2008 年进入的Linux内核,到目前为止有两个大版本:cgroup v1 和 cgroup v2 。
cgroups子系统
cgroups 的全称是control groups,cgroups为每种可以控制的资源定义了一个子系统。典型的子系统介绍如下:
- cpu 子系统,主要限制进程的 cpu 使用率。
- cpuacct 子系统,可以统计 cgroups 中的进程的 cpu 使用报告。
- cpuset 子系统,可以为 cgroups 中的进程分配单独的 cpu 节点或者内存节点。
- memory 子系统,可以限制进程的 memory 使用量。
- blkio 子系统,可以限制进程的块设备 io。
- devices 子系统,可以控制进程能够访问某些设备。
- net_cls 子系统,可以标记 cgroups 中进程的网络数据包,然后可以使用 tc 模块(traffic control)对数据包进行控制。
- freezer 子系统,可以挂起或者恢复 cgroups 中的进程。
- ns 子系统,可以使不同 cgroups 下面的进程使用不同的 namespace。
二、cgroups版本
目前 cgroups 有 cgroupv1 和 cgroupv2 两种文件系统,目前内核中两种文件系统的功能都支持,用户可以根据自己的需求选择使用其中的一种或者选择兼容的模式。
1、cgroupv1 与 cgroupv2 的差异
如下表所示:
cgroupv1 | cgroupv2 |
---|---|
进程可以存在于任一节点中 | 进程只能存在与根节点和叶子节点中,中间节点用来对资源进行控制,实现了 cgroups 代表进程分组,子系统应用于资源控制 |
各个子系统单独工作,很难实现协同合作(writeback 功能) | 所有子系统挂在统一层级,可以实现多系统协同工作 |
memcg 资源限制手段简单,仅有 limit_in_bytes 的限制,实际业务无法很好平衡 | 采用分级管理的调节手段,可以提高性能,解决临时内存峰值的情况,缓解不同业务之间的性能影响 |
不支持 rootless | 支持 rootless |
不支持 PSI 功能 | 支持 PSI 功能 |
注:
rootless——Rootless containers,普通用户(不具备管理员权限、也不应该具备更多权限)可以创建、运行和管理的容器。
PSI——Pressure Stall Information,能够去统计由于资源短缺引起的系统停滞的这些信息,准确反映资源(cpu,memory,io)压力,并根据压力情况采取措施,比如不再调度,kill低优先级任务等等,减轻整个系统的压力。
cgroups v2自Linux内核4.5版本加入支持,但并未作为默认使用,系统默认仍然使用cgroups v1版本;RHEL/Alma Linux 8默认内核4.18支持cgoups v2,但默认仍然为v1版本;RHEL/Alma Linux 9默认内核5.14支持cgroups v2,并且默认为v2版本。
Linux各发行版将cgroups v2作为默认的情况如下:
- Container-Optimized OS(从 M97 开始)
- Ubuntu(从 21.10 开始,推荐 22.04+)
- Debian GNU/Linux(从 Debian 11 Bullseye 开始)
- Fedora(从 31 开始)
- Arch Linux(从 2021 年 4 月开始)
- RHEL 和类似 RHEL 的发行版(从 9 开始)
2、查看Linux内核、cgroups版本及默认版本
RHEL/CentOS 7 内核3.10
# uname -a
Linux chefserver 3.10.0-693.11.6.el7.x86_64 #1 SMP Thu Jan 4 01:06:37 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
# RHEL/CentOS 7 内核3.10仅支持cgroups v1,默认那必然是cgroups v1。
# grep cgroup /proc/filesystems
nodev cgroup
# stat -fc %T /sys/fs/cgroup/
tmpfs # tmpfs,说明默认为 cgroups v1
RHEL/Alma Linux 8 内核4.18
# uname -a
Linux pxe 4.18.0-372.9.1.el8.x86_64 #1 SMP Tue May 10 08:57:35 EDT 2022 x86_64 x86_64 x86_64 GNU/Linux
# RHEL/Alma Linux 8 内核4.18支持cgroups v1 v2,默认为cgroups v1。
# grep cgroup /proc/filesystems
nodev cgroup
nodev cgroup2
# mount|grep cgroup
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/rdma type cgroup (rw,nosuid,nodev,noexec,relatime,rdma)
# stat -fc %T /sys/fs/cgroup/
tmpfs # tmpfs,说明默认为 cgroups v1
RHEL/Alma Linux 9 内核5.14
# stat -fc %T /sys/fs/cgroup/
cgroup2fs # cgroup2fs,说明默认为 cgroups v2
三、升级cgroup v2
1、升级内核
由于 centos 7 系统的 systemd-219 版本过于老旧,并不支持 cgroup v2。因此我尝试通过yum安装的方式将 systemd 升级到 234,再通过配置系统引导参数的方式将 systemd 默认 cgroup 版本切换到 v2。
# yum update -y --exclude=kernel*
# yum install libcap-devel libmount-devel xz-devel gperf wget -y
# wget https://copr.fedorainfracloud.org/coprs/jsynacek/systemd-backports-for-centos-7/repo/epel-7/jsynacek-systemd-backports-for-centos-7-epel-7.repo -O /etc/yum.repos.d/jsynacek-systemd-centos-7.repo
# yum -y update systemd
需要注意:升级
systemd 后如果重启服务器会导致网卡设备名称会发生变化,用户需要重新配置网卡信息。
wget http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-devel-4.19.12-1.el7.elrepo.x86_64.rpm
wget http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-4.19.12-1.el7.elrepo.x86_64.rpm
yum localinstall -y kernel-ml*
grub2-set-default 0 && grub2-mkconfig -o /etc/grub2.cfg
grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"
# grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=1"
# reboot
# uname -a # 确认内核
Linux jenkins 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
# grep cgroup /proc/filesystems # 确认内核是否支持
nodev cgroup
nodev cgroup2
# systemctl --version # 确认systemd版本
systemd 234
+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN
2、切换cgroup版本
验证系统的cgroup版本:
[root@localhost ~]# stat -fc %T /sys/fs/cgroup/
cgroup2fs # 对于 cgroup v2,输出为 cgroup2fs;对于 cgroup v1,输出为 tmpfs。
# docker info | grep -i cgroup
Cgroup Driver: systemd
Cgroup Version: 2
cgroupns
说明: 在版本 1.22 中,如果用户没有在 KubeletConfiguration
中设置 cgroupDriver
字段, kubeadm init
会将它设置为默认值 systemd
。
在k8s初始化中出现这个错误时
# kubeadm init --config /root/new.yaml --upload-certs
[init] Using Kubernetes version: v1.27.3
[preflight] Running pre-flight checks
[preflight] The system verification failed. Printing the output from the verification:
KERNEL_VERSION: 4.19.12-1.el7.elrepo.x86_64
CONFIG_NAMESPACES: enabled
CONFIG_NET_NS: enabled
CONFIG_PID_NS: enabled
CONFIG_IPC_NS: enabled
CONFIG_UTS_NS: enabled
CONFIG_CGROUPS: enabled
CONFIG_CGROUP_CPUACCT: enabled
CONFIG_CGROUP_DEVICE: enabled
CONFIG_CGROUP_FREEZER: enabled
CONFIG_CGROUP_PIDS: enabled
CONFIG_CGROUP_SCHED: enabled
CONFIG_CPUSETS: enabled
CONFIG_MEMCG: enabled
CONFIG_INET: enabled
CONFIG_EXT4_FS: enabled (as module)
CONFIG_PROC_FS: enabled
CONFIG_NETFILTER_XT_TARGET_REDIRECT: enabled (as module)
CONFIG_NETFILTER_XT_MATCH_COMMENT: enabled (as module)
CONFIG_FAIR_GROUP_SCHED: enabled
CONFIG_OVERLAY_FS: enabled (as module)
CONFIG_AUFS_FS: not set - Required for aufs.
CONFIG_BLK_DEV_DM: enabled (as module)
CONFIG_CFS_BANDWIDTH: enabled
CONFIG_CGROUP_HUGETLB: enabled
CONFIG_SECCOMP: enabled
CONFIG_SECCOMP_FILTER: enabled
OS: Linux
CGROUPS_CPU: enabled
CGROUPS_CPUSET: missing
CGROUPS_DEVICES: enabled
CGROUPS_FREEZER: enabled
CGROUPS_MEMORY: enabled
CGROUPS_PIDS: enabled
CGROUPS_HUGETLB: missing
CGROUPS_IO: enabled
[WARNING SystemVerification]: missing optional cgroups: hugetlb
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR SystemVerification]: missing required cgroups: cpuset
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher
需要进行以下操作
# vim /etc/default/grub
GRUB_CMDLINE_LINUX="cgroup_enable=cpu"
grub2-mkconfig -o /boot/grub2/grub.cfg
cat <<EOF | sudo tee /boot/cmdline.txt
cgroup_enable=cpu cgroup_cpu=1
EOF
# reboot
评论区