Kubernetes 内核配置
下面是一套 生产级 Kubernetes(K8S)宿主机内核配置总表,适用于 AlmaLinux 9 / RHEL 9 / Rocky 9 / CentOS Stream 9,同时说明 为什么要配、哪些是必须、哪些是场景可选,避免“玄学调参”。
按 Kubernetes 依赖关系 -> 内核子系统 -> 场景分类 来讲。
Kubernetes 本质依赖:
- cgroups:资源隔离(CPU / 内存 / IO)
- namespaces:进程 / 网络 / 挂载隔离
- netfilter / conntrack:Service / NAT / Pod 网络
- overlayfs:容器镜像
- sysctl:网络、内存、进程数量控制
👉 所以 K8S 内核配置 重点在:网络 + 内存 + cgroups + 文件句柄
Kubernetes 不支持 swap(除非特殊 kubelet 参数)
swapoff -a
sed -i '/swap/d' /etc/fstab
vm.swappiness = 0
原因: K8S 调度和 QoS 依赖 内存可预期性,swap 会破坏 OOM 判断
net.ipv4.ip_forward = 1
Pod、Service、CNI 都依赖
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-arptables = 1
并加载模块:
modprobe br_netfilter
net.netfilter.nf_conntrack_max = 262144
net.netfilter.nf_conntrack_buckets = 65536
不配置会出现:
- Service 访问异常
- NodePort 偶发超时
- kube-proxy 不稳定
fs.file-max = 2097152
kernel.pid_max = 1048576
## TCP 队列
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 16384
## TCP 缓冲
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
## TIME_WAIT 优化
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
## 端口范围(Pod 高并发)
net.ipv4.ip_local_port_range = 1024 65535
vm.overcommit_memory = 1
避免容器频繁触发 OOM Killer
vm.dirty_ratio = 20
vm.dirty_background_ratio = 10
vm.dirty_expire_centisecs = 1000
vm.dirty_writeback_centisecs = 100
vm.zone_reclaim_mode = 0
vm.vfs_cache_pressure = 100
vm.max_map_count = 262144
Elasticsearch / OpenSearch / some JVM 应用
- cgroups v2 ✅
- kubelet、containerd、crio 完全支持
确认:
stat -fc %T /sys/fs/cgroup
## cgroup2fs
--cgroup-driver=systemd
--runtime-cgroups=/system.slice/containerd.service
--kubelet-cgroups=/system.slice/kubelet.service
- 不禁用 IPv6 内核
- 不使用 IPv6 网络
❌ 不推荐:
net.ipv6.conf.all.disable_ipv6 = 1
✅ 推荐:
- 交给 CNI / NetworkManager 控制
- 避免 rpcbind / kubelet / systemd socket 异常
kernel.numa_balancing = 1
- 单 NUMA 节点
- 明确使用
numactl - 数据库裸跑在节点上
kernel.numa_balancing = 0
普通 K8S Node 不需要手动 numactl
👉 /etc/sysctl.d/99-kubernetes.conf
## ---- Kubernetes Core ----
net.ipv4.ip_forward = 1
vm.swappiness = 0
vm.overcommit_memory = 1
## ---- Netfilter ----
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-arptables = 1
## ---- Conntrack ----
net.netfilter.nf_conntrack_max = 262144
net.netfilter.nf_conntrack_buckets = 65536
## ---- Network ----
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 16384
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
## ---- Memory ----
vm.max_map_count = 262144
vm.zone_reclaim_mode = 0
vm.vfs_cache_pressure = 100
## ---- Files / PIDs ----
fs.file-max = 2097152
kernel.pid_max = 1048576
加载:
sysctl --system
- conntrack:中等
- 网络稳定优先
- swap 必须关
- conntrack 要大
- 文件句柄要高
- 网络参数更重要
- 建议 独立节点
- 明确 CPU / 内存绑核
- 不建议与普通 Pod 混用
Kubernetes 内核配置的核心目标不是“跑得快”,而是:网络稳定、内存可预测、资源可控、行为一致。