优化K8s网络延迟需从网络架构、CNI插件、kube-proxy配置、内核参数、节点资源、DNS解析等多维度入手,以下是具体可操作的步骤:
CNI插件是K8s网络的核心,直接影响延迟。优先选择Calico(支持BGP模式,路由性能更优)或Cilium(基于eBPF,低延迟、高吞吐)替代Flannel(性能较弱)。配置时需注意:
CALICO_NETWORKING_BACKEND=bgp),避免路由表频繁更新导致的延迟。kube-proxy负责Service的负载均衡,其性能直接影响Service访问延迟:
kubectl edit cm -n kube-system kube-proxy
将mode字段改为ipvs,并重启kube-proxy Pod;--conntrack-max(默认131072,可根据节点内存调整至1048576),避免连接数满导致的延迟;设置--conntrack-tcp-timeout-established=3600(秒),延长已建立连接的超时时间,减少重复跟踪。优化内核参数可提升网络吞吐量和延迟稳定性:
/etc/sysctl.conf添加:net.ipv4.tcp_fastopen = 3
执行sysctl -p生效;net.core.rmem_max(接收缓冲区最大值)、net.core.wmem_max(发送缓冲区最大值),例如:net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
同时开启时间等待连接复用(net.ipv4.tcp_tw_reuse = 1),减少TIME_WAIT状态的连接占用。setenforce 0)或调整为permissive模式,关闭firewalld(systemctl stop firewalld),减少安全机制对网络的处理开销(生产环境需评估安全风险)。podAntiAffinity将关联Pod调度到同一节点或可用区,降低跨节点延迟;启用拓扑感知路由(Topology-aware Routing),让流量优先在本地节点或可用区内转发;NetworkPolicy限制Pod间的通信,仅允许必要的端口和协议,减少背景噪声。DNS解析慢会导致Service访问延迟,需优化CoreDNS配置:
/etc/coredns/Corefile)中添加缓存插件,设置缓存时间(如cache 30,缓存30秒);apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nodelocaldns
namespace: kube-system
spec:
selector:
matchLabels:
k8s-app: nodelocaldns
template:
metadata:
labels:
k8s-app: nodelocaldns
spec:
containers:
- name: nodelocaldns
image: k8s.gcr.io/nodelocaldns:1.21.0
args:
- -localip=169.254.25.10
- -conf=/etc/Coredns/Corefile
- -upstreamsvc=kube-dns.kube-system.svc.cluster.local:53
volumeMounts:
- name: config-volume
mountPath: /etc/coredns
- name: localtime
mountPath: /etc/localtime
volumes:
- name: config-volume
configMap:
name: nodelocaldns
items:
- key: Corefile
path: Corefile
- name: localtime
hostPath:
path: /etc/localtime
应用后,CoreDNS会将查询转发到NodeLocal DNS Cache,提升解析速度。使用Prometheus+Grafana监控网络性能指标(如节点间延迟、CNI插件延迟、kube-proxy连接跟踪数、CoreDNS查询延迟),及时发现瓶颈。例如:
kube_node_status_condition监控节点网络不可用状态;process_cpu_seconds_total监控kube-proxy、CoreDNS的CPU使用率,过高时需扩容或优化配置。以上策略需根据集群规模(如节点数、Pod数)、工作负载类型(如CPU密集型、网络密集型)和网络环境(如云厂商、物理网络)调整,建议在测试环境验证后再应用于生产。