Skip to main content
☘️ Septvean's Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Kubernetes 内核配置

下面是一套 生产级 Kubernetes(K8S)宿主机内核配置总表,适用于 AlmaLinux 9 / RHEL 9 / Rocky 9 / CentOS Stream 9,同时说明 为什么要配、哪些是必须、哪些是场景可选,避免“玄学调参”。

Kubernetes 依赖关系 -> 内核子系统 -> 场景分类 来讲。


一、Kubernetes 对 Linux 内核的核心要求(先给结论)

Kubernetes 本质依赖:

  • cgroups:资源隔离(CPU / 内存 / IO)
  • namespaces:进程 / 网络 / 挂载隔离
  • netfilter / conntrack:Service / NAT / Pod 网络
  • overlayfs:容器镜像
  • sysctl:网络、内存、进程数量控制

👉 所以 K8S 内核配置 重点在:网络 + 内存 + cgroups + 文件句柄


二、Kubernetes 必须配置(不配会出问题)

1️⃣ 禁用 swap(强制)

Kubernetes 不支持 swap(除非特殊 kubelet 参数)

关闭 swap

swapoff -a
sed -i '/swap/d' /etc/fstab

内核参数

vm.swappiness = 0

原因: K8S 调度和 QoS 依赖 内存可预期性,swap 会破坏 OOM 判断


2️⃣ 网络转发(必须)

net.ipv4.ip_forward = 1

Pod、Service、CNI 都依赖


3️⃣ netfilter(K8S 官方硬要求)

net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-arptables = 1

并加载模块:

modprobe br_netfilter

4️⃣ conntrack(非常关键)

net.netfilter.nf_conntrack_max = 262144
net.netfilter.nf_conntrack_buckets = 65536

不配置会出现:

  • Service 访问异常
  • NodePort 偶发超时
  • kube-proxy 不稳定

5️⃣ 文件句柄 & 进程数

fs.file-max = 2097152
kernel.pid_max = 1048576

三、Kubernetes 推荐网络内核配置(生产)

## 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

四、内存管理(K8S 非常敏感)

1️⃣ 内存超分配策略(推荐)

vm.overcommit_memory = 1

避免容器频繁触发 OOM Killer


2️⃣ 脏页控制(防止 I/O 抖动)

vm.dirty_ratio = 20
vm.dirty_background_ratio = 10
vm.dirty_expire_centisecs = 1000
vm.dirty_writeback_centisecs = 100

3️⃣ 内存碎片与回收

vm.zone_reclaim_mode = 0
vm.vfs_cache_pressure = 100

4️⃣ max_map_count(某些组件必须)

vm.max_map_count = 262144

Elasticsearch / OpenSearch / some JVM 应用


五、cgroups(K8S 关键点)

RHEL / AlmaLinux 9 默认

  • cgroups v2
  • kubelet、containerd、crio 完全支持

确认:

stat -fc %T /sys/fs/cgroup
## cgroup2fs

kubelet 推荐参数(不是 sysctl,但很重要)

--cgroup-driver=systemd
--runtime-cgroups=/system.slice/containerd.service
--kubelet-cgroups=/system.slice/kubelet.service

六、IPv6 策略(重要但容易踩坑)

✅ 推荐做法(生产最稳)

  • 不禁用 IPv6 内核
  • 不使用 IPv6 网络

sysctl(不要禁用 IPv6)

❌ 不推荐:

net.ipv6.conf.all.disable_ipv6 = 1

✅ 推荐:

  • 交给 CNI / NetworkManager 控制
  • 避免 rpcbind / kubelet / systemd socket 异常

七、NUMA(是否需要)

大多数 K8S 节点

kernel.numa_balancing = 1

以下情况可以考虑关闭

  • 单 NUMA 节点
  • 明确使用 numactl
  • 数据库裸跑在节点上
kernel.numa_balancing = 0

普通 K8S Node 不需要手动 numactl


八、推荐 sysctl 文件(完整示例)

👉 /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

九、按节点角色给建议

🧱 Master 节点

  • conntrack:中等
  • 网络稳定优先
  • swap 必须关

⚙ Worker 节点

  • conntrack 要大
  • 文件句柄要高
  • 网络参数更重要

🗄 跑数据库的 Node(不推荐)

  • 建议 独立节点
  • 明确 CPU / 内存绑核
  • 不建议与普通 Pod 混用

十、总结

Kubernetes 内核配置的核心目标不是“跑得快”,而是:网络稳定、内存可预测、资源可控、行为一致。