K8s集群运行时网络拥堵限流调度优化实操
K8s集群运行时网络拥堵限流调度优化实操
|
项目 |
内容 |
|
适用版本 |
Kubernetes v1.28.15 + Calico v3.26.x + containerd 1.7.x + Rocky Linux 8.6 |
|
优化目标 |
降低网络延迟、消除拥堵、保障关键业务带宽、提升调度效率 |
|
编写日期 |
2026-08-18 |
|
文档版本 |
v1.0 |
1. 操作环境与前置准备
1.1 硬件要求
|
角色 |
CPU |
内存 |
硬盘 |
网卡 |
|
Worker |
8核+ |
16GB+ |
200GB SSD |
万兆×1(推荐) |
|
监控节点 |
4核+ |
8GB+ |
500GB SSD |
千兆×1 |
网络优化场景建议万兆网卡,千兆环境瓶颈在物理带宽,优化效果有限。
1.2 软件版本矩阵
|
组件 |
版本 |
说明 |
|
内核 |
4.18.0-372+ |
需支持多队列、BPF |
|
Kubernetes |
v1.28.15 |
集群版本 |
|
containerd |
1.7.11+ |
容器运行时 |
|
Calico |
v3.26.x |
CNI网络插件 |
|
kube-proxy |
IPVS模式 |
负载均衡 |
|
iproute2 |
5.x+ |
流量控制工具 |
|
iperf3 |
3.x+ |
网络压测 |
|
netdata/Prometheus |
最新稳定版 |
监控采集 |
1.3 节点规划
|
主机名 |
IP地址 |
角色 |
网卡 |
|
k8s-worker01 |
192.168.10.21 |
Worker |
ens192(万兆) |
|
k8s-worker02 |
192.168.10.22 |
Worker |
ens192(万兆) |
|
k8s-worker03 |
192.168.10.23 |
Worker |
ens192(万兆) |
|
k8s-monitor |
192.168.10.40 |
监控 |
ens192(千兆) |
1.4 网络拓扑说明
┌─────────────┐
│ 核心交换机 │ 万兆
└──────┬──────┘
│
┌────────────────┼────────────────┐
│ │ │
┌──────▼──────┐ ┌──────▼──────┐ ┌──────▼──────┐
│ Master │ │ Worker01-03│ │ Monitor │
│ 192.168.10 │ │ 192.168.10 │ │ 192.168.10 │
└─────────────┘ └─────────────┘ └─────────────┘
- Pod CIDR:10.244.0.0/16
- Service CIDR:10.96.0.0/12
- Calico模式:BGP(万兆环境推荐,无封装开销)
2. 网络拥堵与调度优化原理
2.1 K8s网络拥堵成因分析
|
拥堵层级 |
成因 |
表现 |
|
内核层 |
conntrack表满、TCP参数不合理 |
连接超时、重传率高 |
|
CNI层 |
Calico路由表过大、封装开销 |
跨节点延迟高、CPU占用高 |
|
kube-proxy层 |
iptables规则过多、IPVS配置不当 |
Service访问慢、连接失败 |
|
Pod层 |
无带宽限制、QoS等级混乱 |
个别Pod抢占全部带宽 |
|
调度层 |
Pod分布不均、热点节点 |
部分节点网络过载、部分空闲 |
|
应用层 |
连接池不合理、超时过长 |
连接堆积、资源耗尽 |
2.2 优化体系架构
┌─────────────────────────────────────────────────┐
│ 应用层(业务侧) │
│ 连接池优化 │ 超时配置 │ 重试策略 │ 熔断降级 │
├─────────────────────────────────────────────────┤
│ 调度层(K8s调度器) │
│ 资源限制 │ 亲和反亲和 │ 拓扑分布 │ 污点容忍 │
├─────────────────────────────────────────────────┤
│ 网络策略层(CNI/NetworkPolicy) │
│ 带宽限流 │ 访问控制 │ QoS等级 │ 流量隔离 │
├─────────────────────────────────────────────────┤
│ 内核层(系统调优) │
│ TCP参数 │ conntrack │ 多队列 │ offload │
├─────────────────────────────────────────────────┤
│ 物理层(硬件/网卡) │
│ 万兆网卡 │ 交换机QoS │ 网卡绑定 │ 中断亲和 │
└─────────────────────────────────────────────────┘
2.3 优化层级与手段对照
|
优化目标 |
手段 |
配置位置 |
|
提升并发连接数 |
调大conntrack、TCP参数 |
内核sysctl |
|
防止单Pod占满带宽 |
Pod带宽annotations + CNI限速 |
Pod YAML |
|
保障关键业务 |
QoS Guaranteed + 高优先级 |
Pod YAML |
|
调度均衡 |
Pod拓扑分布约束 + 资源请求 |
Deployment YAML |
|
减少iptables开销 |
kube-proxy切换IPVS模式 |
kube-proxy配置 |
|
提升网卡吞吐 |
多队列 + RPS/RFS + offload |
网卡/内核 |
|
控制东西向流量 |
NetworkPolicy + GlobalNetworkPolicy |
K8s资源 |
3. 网络监控与拥堵检测
3.1 节点网络指标采集
# 实时查看网卡流量
sar -n DEV 1 5
# 查看网卡吞吐量(需安装sysstat)
yum install -y sysstat
sar -n DEV --iface=ens192 1 10
# 查看TCP连接统计
ss -s
# 查看conntrack使用情况
sysctl net.netfilter.nf_conntrack_count
sysctl net.netfilter.nf_conntrack_max
cat /proc/net/nf_conntrack | wc -l
# 查看网卡队列与中断
ethtool -l ens192
cat /proc/interrupts | grep ens192
# 查看网络丢包与错误
ifconfig ens192 | grep -E 'RX|TX'
ip -s link show ens192
3.2 Pod级网络流量监控
# 查看Pod网络使用(需metrics-server)
kubectl top pods -A --sort-by=memory
# 使用Calico查看端点流量
calicoctl get workloadendpoints -o wide
# 进入Pod网络命名空间抓包
POD_NAME=<pod-name>
POD_NS=<namespace>
PID=$(kubectl get pod ${POD_NAME} -n ${POD_NS} -o jsonpath='{.status.containerStatuses[0].state.running.pid}')
nsenter -t ${PID} -n tcpdump -i any -w /tmp/pod-capture.pcap
# 使用crictl查看Pod网络
crictl inspectp <pod-id> | jq '.info.runtimeSpec.network'
3.3 拥堵检测脚本
创建 /opt/network-check.sh:
#!/bin/bash
# K8s节点网络拥堵检测脚本
echo "========== 网络拥堵检测 =========="
echo "[1] 网卡流量统计:"
sar -n DEV 1 3 | grep -E 'ens192|Average'
echo ""
echo "[2] TCP连接状态分布:"
ss -ant | awk 'NR>1{print $1}' | sort | uniq -c | sort -rn
echo ""
echo "[3] Conntrack使用率:"
COUNT=$(sysctl -n net.netfilter.nf_conntrack_count)
MAX=$(sysctl -n net.netfilter.nf_conntrack_max)
PERCENT=$(echo "scale=2; $COUNT*100/$MAX" | bc)
echo "当前: $COUNT / 最大: $MAX (使用率: ${PERCENT}%)"
if (( $(echo "$PERCENT > 80" | bc -l) )); then
echo " ⚠ WARNING: conntrack使用率超过80%,需调大!"
fi
echo ""
echo "[4] 网卡丢包/错误:"
ip -s link show ens192 | grep -A1 'RX:' | grep -v 'RX:'
echo ""
echo "[5] 重传率检测:"
nstat -az | grep -E 'TcpRetransSegs|TcpExtTCPLostRetransmit'
echo ""
echo "[6] 监听端口与队列:"
ss -lnt | head -20
echo ""
echo "========== 检测完成 =========="
执行:
chmod +x /opt/network-check.sh
/opt/network-check.sh
3.4 网络瓶颈定位
# 定位高带宽占用进程
nethogs ens192 # 需安装 nethogs
# 定位高连接数进程
ss -antp | grep ESTAB | awk '{print $6}' | sort | uniq -c | sort -rn | head
# 跨节点延迟测试
ping -c 100 -i 0.01 192.168.10.22 | tail -5
# 路由跟踪
traceroute 192.168.10.22
# DNS解析延迟
dig @10.96.0.10 kubernetes.default.svc.cluster.local +stats
4. CNI网络插件调优(Calico)
4.1 Calico BGP与VXLAN模式选择
|
模式 |
封装开销 |
适用场景 |
性能 |
|
VXLAN |
有(UDP封装) |
跨三层、云环境 |
中等 |
|
IPIP |
有(IP封装) |
跨三层、简单环境 |
中等 |
切换为BGP模式:
# 修改Calico配置
kubectl patch installation default --type=merge -p '{
"spec": {
"calicoNetwork": {
"ipPools": [{
"cidr": "10.244.0.0/16",
"encapsulation": "None",
"natOutgoing": "Enabled",
"nodeSelector": "all()"
}],
"bgp": "Enabled"
}
}
}'
# 验证
calicoctl get ippool -o yaml | grep -E 'cidr|encapsulation'
4.2 Calico Felix参数调优
创建 calico-felix-config.yaml:
apiVersion: projectcalico.org/v3
kind: FelixConfiguration
metadata:
name: default
spec:
# 日志级别(生产用info,调试用debug)
logSeverityScreen: Info
# Prometheus指标
prometheusMetricsEnabled: true
prometheusMetricsPort: 9091
# 连接跟踪
conntrackLimitsEnabled: true
# 路由表刷新间隔
routeRefreshInterval: 90s
# 端点同步
endpointReportingEnabled: false
# 外部流量管理
externalNodesList: ""
# 接口前缀
interfacePrefix: cali
# MTU自动检测
wireguardEnabled: false
# IPTables后台刷新
iptablesRefreshInterval: 60s
# 批量插入iptables规则
iptablesInsertMode: insert
# 连接跟踪清理
conntrackCleanupInterval: 600s
# 健康检查
healthPort: 9099
# 资源限制
reportInterval: 30s
reportingInterval: 30s
# 关闭不必要的特性
policySyncPathPrefix: ""
# 优化大规模endpoint
endpointsPerHost: 0
应用:
calicoctl apply -f calico-felix-config.yaml
4.3 Calico IPIP隧道优化
如必须使用IPIP/VXLAN,优化MTU:
# 查看当前MTU
ip link show | grep -E 'tunl0|vxlan|calico'
# 设置Calico MTU(VXLAN模式:物理MTU - 50;IPIP模式:物理MTU - 20)
# 万兆网卡MTU=9000时,VXLAN MTU=8950,IPIP MTU=8980
kubectl patch installation default --type=merge -p '{
"spec": {
"calicoNetwork": {
"mtu": 8950
}
}
}'
# 验证
kubectl get installation default -o jsonpath='{.spec.calicoNetwork.mtu}'
4.4 大规模集群端点优化
# 关闭endpoint reporting减少API Server压力
calicoctl patch felixconfiguration default --type=merge \
-p '{"spec":{"endpointReportingEnabled":false}}'
# 增大BGP保持时间
calicoctl patch bgpconfiguration default --type=merge \
-p '{"spec":{"keepOriginalNextHop":true,"nodeToNodeMeshEnabled":true}}'
# 启用路由聚合(减少路由表条目)
calicoctl patch ippool default-ipv4-ippool --type=merge \
-p '{"spec":{"blockSize":26}}'
5. 内核网络参数优化
5.1 连接跟踪与背压参数
创建 /etc/sysctl.d/99-k8s-network-optimize.conf:
# ========== Conntrack连接跟踪 ==========
net.netfilter.nf_conntrack_max = 1048576
net.netfilter.nf_conntrack_tcp_timeout_established = 86400
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 30
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
net.netfilter.nf_conntrack_buckets = 262144
net.nf_conntrack_max = 1048576
# ========== 端口范围 ==========
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.ip_local_reserved_ports = 30000-32767
# ========== 背压与队列 ==========
net.core.netdev_max_backlog = 16384
net.core.somaxconn = 32768
net.core.default_qdisc = fq
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_syncookies = 1
# ========== 内存 ==========
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.udp_rmem_min = 8192
net.ipv4.udp_wmem_min = 8192
5.2 TCP协议栈调优
追加到同一文件:
# ========== TCP协议栈 ==========
# 开启TCP快速打开
net.ipv4.tcp_fastopen = 3
# 拥塞控制算法(BBR需内核4.9+,高延迟高带宽推荐)
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
# TCP窗口缩放
net.ipv4.tcp_window_scaling = 1
# 时间戳(NAT环境建议关闭以避免连接异常)
net.ipv4.tcp_timestamps = 1
# 选择确认
net.ipv4.tcp_sack = 1
# 复用TIME_WAIT连接
net.ipv4.tcp_tw_reuse = 1
# FIN超时
net.ipv4.tcp_fin_timeout = 15
# keepalive参数
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 5
# 最大孤儿连接
net.ipv4.tcp_max_orphans = 65536
# MTU探测
net.ipv4.tcp_mtu_probing = 1
# 自动调整接收缓冲区
net.ipv4.tcp_moderate_rcvbuf = 1
生效:
sysctl --system
# 验证BBR
sysctl net.ipv4.tcp_congestion_control
# 应输出 bbr
# 验证conntrack
sysctl net.netfilter.nf_conntrack_max
5.3 网卡多队列与RPS/RFS
# 查看网卡队列数
ethtool -l ens192
# Combined: 8(当前) / 8(最大)
# 调大队列数(如支持)
ethtool -L ens192 combined 8
# 配置RPS(Receive Packet Steering)- 软件多队列
# 获取网卡rx队列对应的CPU掩码
QUEUES=$(ls /sys/class/net/ens192/queues/ | grep rx- | wc -l)
CPUS=$(nproc)
for i in $(seq 0 $((QUEUES-1))); do
# ffffffff表示所有CPU参与,根据实际CPU数设置
echo ffffffff > /sys/class/net/ens192/queues/rx-${i}/rps_cpus
echo 4096 > /sys/class/net/ens192/queues/rx-${i}/rps_flow_cnt
done
# 配置RFS(Receive Flow Steering)
echo 32768 > /proc/sys/net/core/rps_sock_flow_entries
# 持久化RPS配置(创建udev规则或systemd服务)
cat > /etc/systemd/system/rps-config.service << 'EOF'
[Unit]
Description=Configure RPS/RFS for network interfaces
After=network.target
[Service]
Type=oneshot
ExecStart=/bin/bash -c 'for q in /sys/class/net/ens192/queues/rx-*; do echo ffffffff > $q/rps_cpus; echo 4096 > $q/rps_flow_cnt; done; echo 32768 > /proc/sys/net/core/rps_sock_flow_entries'
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF
systemctl enable rps-config.service
5.4 网卡offload特性
# 查看当前offload状态
ethtool -k ens192
# 开启常用offload
ethtool -K ens192 tx on rx on sg on tso on gso on gro on lro on
# 开启校验和卸载
ethtool -K ens192 tx-checksum-ipv4 on tx-checksum-ip-generic on
# 查看网卡ring buffer
ethtool -g ens192
# 调大ring buffer(如支持)
ethtool -G ens192 rx 4096 tx 4096
# 中断亲和(将网卡中断绑定到特定CPU,避免CPU0瓶颈)
# 查看中断号
grep ens192 /proc/interrupts
# 设置中断亲和掩码(示例:绑定到CPU 4-7)
# echo f0 > /proc/irq/<中断号>/smp_affinity
6. Pod网络QoS与带宽限流
6.1 K8s QoS等级机制
|
QoS等级 |
条件 |
资源保障 |
驱逐优先级 |
|
Burstable |
requests < limits 或只设requests |
中等 |
中等 |
|
BestEffort |
不设requests和limits |
最低 |
最先被驱逐 |
Guaranteed示例:
apiVersion: v1
kind: Pod
metadata:
name: critical-app
spec:
containers:
- name: app
image: harbor.local/app/myapp:v1
resources:
requests:
cpu: "2"
memory: "4Gi"
# 网络带宽请求(K8s 1.27+ alpha特性,需特性门控)
# networking.kubernetes.io/request: "1G"
limits:
cpu: "2"
memory: "4Gi"
# networking.kubernetes.io/limit: "2G"
priorityClassName: high-priority
6.2 Pod带宽限制(annotations)
Calico支持通过annotations限制Pod带宽:
apiVersion: v1
kind: Pod
metadata:
name: bandwidth-limited-pod
annotations:
# 入口带宽限制(下载)
kubernetes.io/ingress-bandwidth: 100M
# 出口带宽限制(上传)
kubernetes.io/egress-bandwidth: 50M
spec:
containers:
- name: app
image: harbor.local/library/nginx:1.25
Deployment级批量限流:
apiVersion: apps/v1
kind: Deployment
metadata:
name: limited-app
spec:
replicas: 3
template:
metadata:
annotations:
kubernetes.io/ingress-bandwidth: 200M
kubernetes.io/egress-bandwidth: 100M
spec:
containers:
- name: app
image: harbor.local/app/myapp:v1
6.3 基于CNI的带宽限速
Calico带宽插件配置:
# 确认Calico带宽插件已启用
kubectl get pods -n kube-system -l k8s-app=calico-node -o yaml | grep -A5 bandwidth
# 如未启用,修改Calico DaemonSet
kubectl set env daemonset/calico-node -n kube-system \
FELIX_BANDWIDTH_MANAGEMENT_ENABLED=true
# 验证限速规则(在节点上)
tc qdisc show dev cali<容器ID>
# 应看到 tbf 队列规则
6.4 关键业务带宽保障
通过优先级 + 资源预留 + 带宽限制组合保障关键业务:
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: high-priority
value: 1000000
globalDefault: false
description: "关键业务高优先级"
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: payment-service
namespace: prod
spec:
replicas: 3
template:
metadata:
annotations:
# 保障最低带宽,限制峰值带宽
kubernetes.io/ingress-bandwidth: 1G
kubernetes.io/egress-bandwidth: 1G
spec:
priorityClassName: high-priority
containers:
- name: payment
image: harbor.local/app/payment:v2
resources:
requests:
cpu: "4"
memory: "8Gi"
limits:
cpu: "4"
memory: "8Gi"
# 节点亲和:调度到网络条件好的节点
nodeSelector:
network: 10ge
# 拓扑分布:跨节点分散
topologySpreadConstraints:
- maxSkew: 1
topologyKey: kubernetes.io/hostname
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: payment-service
7. NetworkPolicy网络策略
7.1 默认拒绝策略
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
namespace: prod
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
7.2 命名空间隔离策略
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: namespace-isolation
namespace: prod
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
# 只允许同命名空间访问
- from:
- podSelector: {}
# 允许监控命名空间访问
- from:
- namespaceSelector:
matchLabels:
name: monitoring
7.3 精细化流量控制
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: app-traffic-control
namespace: prod
spec:
podSelector:
matchLabels:
app: backend
policyTypes:
- Ingress
- Egress
ingress:
# 只允许前端服务的8080端口访问
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 8080
# 允许监控端口
- from:
- namespaceSelector:
matchLabels:
name: monitoring
ports:
- protocol: TCP
port: 9090
egress:
# 允许访问数据库
- to:
- podSelector:
matchLabels:
app: database
ports:
- protocol: TCP
port: 3306
# 允许DNS解析
- to:
- namespaceSelector: {}
ports:
- protocol: UDP
port: 53
- protocol: TCP
port: 53
7.4 全局网络策略(GlobalNetworkPolicy)
Calico全局策略,作用于所有命名空间:
apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
name: deny-egress-to-internal
spec:
order: 100
selector: all()
types:
- Egress
egress:
# 禁止Pod访问内网管理网段
- action: Deny
destination:
nets:
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
- action: Allow
destination:
notNets:
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
应用:
calicoctl apply -f global-policy.yaml
8. 调度器优化
8.1 资源请求与限制规范
强制规范:所有Pod必须设置requests和limits,避免BestEffort。
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
spec:
replicas: 5
template:
spec:
containers:
- name: web
image: harbor.local/app/web:v1
resources:
requests:
cpu: "500m"
memory: "512Mi"
limits:
cpu: "2"
memory: "2Gi"
资源超售比例建议:
|
业务类型 |
CPU超售比 |
内存超售比 |
|
普通业务 |
1:2 ~ 1:3 |
1:1.5 |
|
测试环境 |
1:4 ~ 1:5 |
1:2 |
8.2 节点亲和与反亲和
节点亲和(调度到指定节点):
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: network
operator: In
values: ["10ge"]
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
preference:
matchExpressions:
- key: disktype
operator: In
values: ["ssd"]
Pod反亲和(避免同节点部署):
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values: ["web-app"]
topologyKey: kubernetes.io/hostname
8.3 Pod拓扑分布约束
K8s 1.19+稳定特性,比podAntiAffinity更灵活:
spec:
topologySpreadConstraints:
# 跨节点均匀分布
- maxSkew: 1
topologyKey: kubernetes.io/hostname
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: web-app
# 跨可用区均匀分布(如有zone标签)
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: ScheduleAnyway
labelSelector:
matchLabels:
app: web-app
8.4 污点与容忍调度
# 为高网络节点打污点,只允许关键业务调度
kubectl taint nodes k8s-worker01 network=highspeed:NoSchedule
# Pod容忍该污点
spec:
tolerations:
- key: "network"
operator: "Equal"
value: "highspeed"
effect: "NoSchedule"
8.5 调度器参数调优
创建 kube-scheduler-config.yaml:
apiVersion: kubescheduler.config.k8s.io/v1beta3
kind: KubeSchedulerConfiguration
profiles:
- schedulerName: default-scheduler
plugins:
score:
enabled:
- name: NodeResourcesBalancedAllocation
weight: 5
- name: NodeResourcesFit
weight: 3
- name: PodTopologySpread
weight: 5
- name: InterPodAffinity
weight: 2
- name: TaintToleration
weight: 1
pluginConfig:
- name: NodeResourcesFit
args:
scoringStrategy:
type: MostAllocated
resources:
- name: cpu
weight: 1
- name: memory
weight: 1
- name: PodTopologySpread
args:
defaultingType: List
defaultConstraints:
- maxSkew: 3
topologyKey: kubernetes.io/hostname
whenUnsatisfiable: ScheduleAnyway
应用:
# 修改kube-scheduler静态Pod配置
cp /etc/kubernetes/manifests/kube-scheduler.yaml /etc/kubernetes/manifests/kube-scheduler.yaml.bak
# 在command中添加 --config=/etc/kubernetes/scheduler-config.yaml
# 挂载配置文件
8.6 自定义调度策略
基于网络资源的调度(Descheduler):
# 安装Descheduler
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/descheduler/master/kubernetes/deployment.yaml
# 配置重调度策略
cat > descheduler-policy.yaml << 'EOF'
apiVersion: descheduler/v1alpha2
kind: DeschedulerPolicy
strategies:
RemovePodsViolatingTopologySpreadConstraint:
enabled: true
params:
includeSoftConstraints: true
LowNodeUtilization:
enabled: true
params:
nodeResourceUtilizationThresholds:
thresholds:
cpu: 30
memory: 30
pods: 20
targetThresholds:
cpu: 70
memory: 70
pods: 50
RemoveDuplicates:
enabled: true
EOF
9. 运行时网络配置优化
9.1 containerd网络配置
编辑 /etc/containerd/config.toml:
[plugins."io.containerd.grpc.v1.cri"]
# 禁用streaming服务的TLS(内网)
enable_tls_streaming = false
stream_server_address = "127.0.0.1"
stream_server_port = "0"
# 最大并发镜像下载
max_concurrent_downloads = 5
# 禁用selinux
enable_selinux = false
[plugins."io.containerd.grpc.v1.cri".cni]
bin_dir = "/opt/cni/bin"
conf_dir = "/etc/cni/net.d"
max_conf_num = 1
# 网络插件配置
conf_template = ""
[plugins."io.containerd.grpc.v1.cri".containerd]
# 快照器
snapshotter = "overlayfs"
# 默认运行时
default_runtime_name = "runc"
9.2 Pod网络命名空间优化
# 查看Pod网络命名空间
ls -la /var/run/netns/
# 优化网络命名空间创建(通过kubelet配置)
cat > /var/lib/kubelet/config.yaml << 'EOF'
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
clusterDomain: cluster.local
clusterDNS:
- 10.96.0.10
# 最大Pod数(影响网络端点数量)
maxPods: 110
# PodCIDR
podCIDR: 10.244.0.0/16
# 网络插件
networkPluginName: cni
# 关闭非必要的指标采集
enableControllerAttachDetach: true
EOF
systemctl restart kubelet
9.3 conntrack与端口范围
# 确保conntrack模块加载
modprobe nf_conntrack
modprobe nf_conntrack_ipv4
# 持久化
cat > /etc/modules-load.d/conntrack.conf << 'EOF'
nf_conntrack
nf_conntrack_ipv4
EOF
# 验证
lsmod | grep conntrack
sysctl net.netfilter.nf_conntrack_count
9.4 kube-proxy模式优化(IPVS)
# 查看当前模式
kubectl get configmap kube-proxy -n kube-system -o jsonpath='{.data.config\.conf}' | grep mode
# 修改为IPVS模式
kubectl edit configmap kube-proxy -n kube-system
# 将 mode: "" 改为 mode: "ipvs"
# 或通过patch
kubectl patch configmap kube-proxy -n kube-system --type merge \
-p '{"data":{"config.conf":"mode: ipvs\nipvs:\n scheduler: rr\n excludeCIDRs: []\n strictARP: false\n syncPeriod: 30s\n minSyncPeriod: 5s\n"}}'
# 重启kube-proxy
kubectl rollout restart daemonset kube-proxy -n kube-system
# 验证IPVS规则
ipvsadm -Ln
# IPVS调度算法选择
# rr: 轮询(默认,均匀)
# wrr: 加权轮询
# lc: 最少连接
# wlc: 加权最少连接(推荐,高并发场景)
# sh: 源地址哈希(会话保持)
# dh: 目标地址哈希
修改IPVS调度器为最少连接(高并发推荐):
kubectl patch configmap kube-proxy -n kube-system --type merge \
-p '{"data":{"config.conf":"mode: ipvs\nipvs:\n scheduler: lc\n syncPeriod: 30s\n"}}'
kubectl rollout restart daemonset kube-proxy -n kube-system
10. Service与Ingress流量控制
10.1 Service会话保持与连接参数
apiVersion: v1
kind: Service
metadata:
name: app-service
spec:
selector:
app: web-app
ports:
- port: 80
targetPort: 8080
# 会话保持(ClientIP模式)
sessionAffinity: ClientIP
sessionAffinityConfig:
clientIP:
timeoutSeconds: 10800
type: ClusterIP
10.2 Ingress限流配置
Nginx Ingress限流:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-ingress
annotations:
# 每秒请求数限制(按客户端IP)
nginx.ingress.kubernetes.io/limit-rps: "100"
# 每分钟请求数限制
nginx.ingress.kubernetes.io/limit-rpm: "6000"
# 连接数限制
nginx.ingress.kubernetes.io/limit-connections: "50"
# 限流白名单
nginx.ingress.kubernetes.io/limit-allowlist: "10.0.0.0/8"
# 上游连接超时
nginx.ingress.kubernetes.io/proxy-connect-timeout: "10"
nginx.ingress.kubernetes.io/proxy-read-timeout: "30"
nginx.ingress.kubernetes.io/proxy-send-timeout: "30"
# 上游连接池
nginx.ingress.kubernetes.io/upstream-keepalive-connections: "320"
nginx.ingress.kubernetes.io/upstream-keepalive-timeout: "60"
spec:
rules:
- host: app.company.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app-service
port:
number: 80
10.3 负载均衡算法调优
# IPVS模式下修改Service调度算法(需kube-proxy支持)
# 通过Service annotation(需启用feature gate)
# service.kubernetes.io/ipvs-scheduler: "wlc"
# 查看当前Service的IPVS虚拟服务
ipvsadm -Ln | grep -A5 <ClusterIP>
# 手动调整(临时,kube-proxy会覆盖)
ipvsadm -E -t <ClusterIP>:80 -s wlc
10.4 连接池与超时配置
应用层连接池建议:
|
参数 |
建议值 |
说明 |
|
连接超时 |
3-5s |
建立连接超时 |
|
读取超时 |
10-30s |
读数据超时 |
|
写入超时 |
10-30s |
写数据超时 |
|
空闲回收 |
60s |
空闲连接回收 |
|
最大重试 |
2-3次 |
失败重试 |
kubelet API连接优化:
# /var/lib/kubelet/config.yaml
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
# API Server连接
kubeAPIQPS: 50
kubeAPIBurst: 100
# 事件记录
eventBurst: 50
eventRecordQPS: 50
# 序列化并发
serializeImagePulls: false
maxParallelImagePulls: 3
11. 验证与压测流程
11.1 网络基准测试
# 安装iperf3
yum install -y iperf3
# 节点间带宽测试(服务端)
iperf3 -s -p 5201
# 节点间带宽测试(客户端)
iperf3 -c 192.168.10.22 -p 5201 -t 60 -P 8
# 预期结果:万兆网卡应达到 9-10 Gbits/sec
# 延迟测试
ping -c 1000 -i 0.001 192.168.10.22 | tail -5
# 预期:同机房 < 1ms
11.2 带宽压测
# Pod间带宽测试
# 启动服务端Pod
kubectl run iperf-server --image=harbor.local/library/network-multitool:latest -- sleep 3600
kubectl exec -it iperf-server -- iperf3 -s
# 启动客户端Pod
kubectl run iperf-client --image=harbor.local/library/network-multitool:latest -- sleep 3600
kubectl exec -it iperf-client -- iperf3 -c <iperf-server-pod-ip> -t 30 -P 4
# 测试带限速的Pod(验证限流生效)
# 创建带100M限速的Pod,iperf测试应不超过100Mbps
11.3 并发连接压测
# 使用wrk压测HTTP服务
kubectl run wrk --image=harbor.local/library/wrk:latest -- \
wrk -t8 -c1000 -d60s http://app-service.prod.svc.cluster.local
# 参数说明:-t8 8线程,-c1000 1000并发连接,-d60s 持续60秒
# 监控conntrack使用
watch -n1 'sysctl net.netfilter.nf_conntrack_count; ss -s'
# 监控节点CPU/网络
sar -n DEV 1 60
top
11.4 调度均衡性验证
# 查看Pod分布
kubectl get pods -A -o wide | awk '{print $7}' | sort | uniq -c | sort -rn
# 查看节点资源使用率
kubectl top nodes
# 查看Pod资源请求占比
kubectl describe nodes | grep -A5 "Allocated resources"
# 验证拓扑分布
kubectl get pods -l app=web-app -o wide
# 应均匀分布在不同节点
更多推荐

所有评论(0)