容器服务已经对节点网络参数进行了优化和适配,能够满足大部分场景。如果默认的内核参数不适合您的业务场景,支持用户根据自身业务场景对节点或 Pod 的网络参数进行进一步的自定义优化。
注意
在容器场景中,非 hostNetwork 类型的容器运行在独立的网络命名空间中。因此,容器集群中的内核网络参数主要分为 节点级别的网络参数 和 Pod 级别的网络参数。本文介绍如何修改节点和 Pod 的网络内核参数。
说明
创建或修改节点池时,支持通过节点池启动脚本配置新增节点的网络内核参数。本文以创建节点池的步骤为例。
执行脚本内容举例如下:
#!/bin/bash # 为节点池添加网络内核参数,实际使用时,需要替换为实际的值。 # 这里有多少条配置修改,就添加多少条配置。 echo "kernel_parameter1 = value1" >> /etc/sysctl.conf echo "kernel_parameter2 = value2" >> /etc/sysctl.conf echo "kernel_parameter3 = value3" >> /etc/sysctl.conf # 应用更改 sysctl -p echo "end"
说明
上述配置中,kernel_parameter1
代表内核参数名,value1
代表内核参数值。具体内核参数说明请参见 网络内核参数说明。
说明
该方式不适用弹性容器实例(VCI)场景。
支持创建工作负载或 Pod 时,通过添加initContainer
配置,来定义 Pod 网络内核参数。举例如下:
apiVersion: v1 kind: Pod metadata: name: sysctl-example-init spec: initContainers: - image: busybox command: - sh - -c - | sysctl -w kernel_parameter1 = value1 imagePullPolicy: Always name: netsysctl securityContext: privileged: true containers: ...
在 Kubernetes 中,支持通过 Pod 的 sysctl 安全上下文(Security Context)对内核参数进行配置。详情请参考 官方文档。
Kubernetes 将 sysctl 参数分为 安全 和 非安全。其中,安全 的 sysctl 参数可以直接配置,主要参数包括:
net.ipv4.ip_local_port_range
net.ipv4.tcp_syncookies
net.ipv4.ping_group_range
(从 Kubernetes 1.18 开始)net.ipv4.ip_unprivileged_port_start
(从 Kubernetes 1.22 开始)net.ipv4.ip_local_reserved_ports
(从 Kubernetes 1.27 开始,需要 kernel 3.16+)net.ipv4.tcp_keepalive_time
(从 Kubernetes 1.29 开始,需要 kernel 4.5+)net.ipv4.tcp_fin_timeout
(从 Kubernetes 1.29 开始,需要 kernel 4.6+)net.ipv4.tcp_keepalive_intvl
(从 Kubernetes 1.29 开始,需要 kernel 4.5+)net.ipv4.tcp_keepalive_probes
(从 Kubernetes 1.29 开始,需要 kernel 4.5+)除上面提及的参数外,其他的参数均为 非安全 的 sysctl 参数,默认禁用。
说明
如需配置 非安全的 sysctl 参数,必须由集群管理员在每个节点上分别手动开启。如未开启,配置了非安全 sysctl 参数的 Pod 仍会被调度,但无法正常启动。
如需启用 非安全 的 sysctl 参数,请在每个节点上执行如下 kubelet 命令。
kubelet --allowed-unsafe-sysctls \ 'kernel.msg*,net.core.somaxconn' ...
在节点上启用 非安全 的 sysctl 参数后,允许通过如下配置,修改 Pod 的网络内核参数。
apiVersion: v1 kind: Pod metadata: name: sysctl-example spec: securityContext: sysctls: - name: net.ipv4.tcp_keepalive_time value: "60" ...
注意
Kubernetes 安全上下文(Security Context)提供的配置参数比较有限,配置时需要注意:
net.ipv4.ip_local_port_range
和 net.ipv4.tcp_syncookies
除外)都支持通过安全上下文的方式进行配置,详情请参见 配置安全上下文。常见网络内核参数的说明,如下表所示。
参数 | 配置范围 | 参数说明 | 配置建议 |
---|---|---|---|
net.core.netdev_max_backlog | 节点级别 | 用于设置每个网络接口的最大接收数据包队列长度。当网络接口接收到数据包时,这些数据包首先被放置到接收队列(receive queue)中等待软中断处理。如果接收队列已满,新的数据包将被丢弃。 | 当主机侧的处理性能相对不足时,可以适当调高该值。 |
net.core.optmem_max | 节点级别 | 该参数为 Linux 内核参数,用于设置系统中所有套接字默认的最大的套接字缓冲区大小,以字节为单位。 | 可以根据业务情况,适当提高该值,以提高 socket 的缓冲区大小。 |
net.ipv4.neigh.default.gc_stale_time | 节点级别 |
| 这几个内核参数用于设置节点 ARP 表项的回收和阀值。在容器服务的 VPC-CNI 网络集群中,流量的访问会依赖系统 ARP 表。 说明 容器服务集群已经对内核参数进行了调优,默认值分别为:
在更大规模的集群中,您可以根据需求再对这些值进行调整。 |
net.ipv4.tcp_mem | 节点级别 | 用于设置 TCP 的总缓冲区大小/范围。格式为
| 该值根据不同规格,系统默认值一般不同。作为节点的 TCP 缓冲全局性配置,可以根据场景和规格调高该值。 |
net.core.somaxconn | Pod 级别 | 用于设置系统中每一个端口的最大监听队列长度,这是个全局的参数,默认值为 128。限制了每个端口接收新 TCP 连接监听队列的大小。 | 调大此参数可以一定程度上避免高并发服务遇到突发流量导致失败。 |
net.ipv4.tcp_max_syn_backlog | Pod 级别 | 最大 TCP 半连接队列/SYN 队列大小,默认值为 1024。 | 可以根据业务场景,调大该值,提高服务端的并发连接数。 |
net.ipv4.tcp_rmem | Pod 级别 | 用于设置接收缓冲区大小和范围,格式为
| 可以根据 Pod 的业务场景,调节该值,提高并发连接性能。 |
net.ipv4.tcp_wmem | Pod 级别 | 用于设置发送缓冲区大小和范围,格式为
| 可以根据 Pod 的业务场景,调节该值,提高并发连接性能。 |
net.ipv4.tcp_max_tw_buckets | Pod 级别 | 用于设置处于 | 当系统的连接数多时,可能就需要根据需要调高该值。该参数值过大时易耗尽节点资源。 |
net.ipv4.tcp_tw_reuse | Pod 级别 | 用于设置是否复用处于 | 对于大量客户端连接的请求的场景,可以打开该配置,也就是设置成 1,提高性能。 |
net.ipv4.tcp_fin_timeout | Pod 级别 | 指定主动关闭连接方等待被动关闭连接方返回 FIN 报文(第三次挥手)的最长时间,也就是设置主动关闭连接方处于FIN-WAIT-2 状态的最长时间,默认为 60 秒。 | 调小该参数,以便加快系统关闭处于FIN_WAIT2 状态的 TCP 连接。对于 Server 端服务,如果客户端长时间不关闭连接,会长时间挤FIN_WAIT2 状态,进而导致内核 Crash。 |
net.ipv4.tcp_keepalive_time | Pod 级别 | 该参数是 TCP 协议中的一个参数,表示 TCP 连接的空闲时间。当一个 TCP 连接在这个时间内没有任何数据传输时,系统会发送一个探测包来检测连接是否还存活。默认值为 7200 秒(2 小时),可以通过修改系统的配置文件来修改参数。 | TCP 内核超时时间配置,可以根据业务需求进行调整。 |
net.ipv4.tcp_keepalive_intvl | Pod 级别 | 探测消息未获得响应时,重发该消息的间隔时间,单位为秒。 | TCP 内核超时时间配置,可以根据业务需求进行调整。 |
net.ipv4.tcp_keepalive_probes | Pod 级别 | 在认定 TCP 连接失效之前,最多发送多少个 keepalive 探测消息。 | TCP 内核超时时间配置,可以根据业务需求进行调整。 |
net.netfilter.nf_conntrack_buckets | Pod 级别 | 设置 Linux 系统中连接跟踪表(Connection Tracking Table)的哈希桶(buckets)数量。 | 连接跟踪表容量,可视业务场景调整。 |
net.netfilter.nf_conntrack_max | Pod 级别 | 连接跟踪表的大小。 默认值为net.netfilter.nf_conntrack_buckets * 4 。 | 连接跟踪表最大条数,可视业务场景调整。当连接跟踪表满时,会出现无法连接的现象。 |