K8s 大规模集群性能优化速查表
一、核心瓶颈与优化方案
| 瓶颈点 | 表现 | 优化方案 | 具体命令/配置 |
|---|---|---|---|
| kube-apiserver | 延迟高,5xx错误,watch断开 | 1. 水平扩展 2. 聚合层分流 3. 客户端优化 4. 内存/缓存优化 | kube-apiserver --max-requests-inflight=3000 --watch-cache-sizes=1000 副本数:3-4个,8C16G |
| etcd | 写入延迟高,leader频繁切换 | 1. SSD/NVMe磁盘 2. 分离event存储 3. 压缩历史版本 4. 限流配置 | etcd --auto-compaction-retention=1h --quota-backend-bytes=8GB 专用硬件,万兆网络 |
| 网络 | Pod间延迟高,DNS间歇失败 | 1. 启用NodeLocal DNSCache 2. conntrack调优 3. CNI优化 4. Pod配置优化 | nf_conntrack_max=1000000 ndots:2 Calico BGP/Cilium eBPF |
| 调度器 | 调度延迟,Pod长时间Pending | 1. 百分比调度 2. 调度器Profile 3. 缓存优化 | --percentage-of-nodes-to-score=30 大规模集群用VolumeScheduling |
| kubelet | Pod启动慢,镜像拉取慢 | 1. 镜像预热 2. 并行镜像拉取 3. 资源预留 | --serialize-image-pulls=false --image-pull-progress-deadline=30s |
| 容器运行时 | 容器启停慢,资源泄露 | 1. 升级containerd 2. 调优GC策略 3. 限制资源 | containerd config default 启用SystemdCgroup |
二、具体优化配置命令
1. API Server 优化
bash
# 查看当前性能
kubectl get --raw="/metrics" | grep apiserver_request_duration_seconds
# 修改配置
vim /etc/kubernetes/manifests/kube-apiserver.yaml
# 添加参数:
# --max-requests-inflight=3000
# --max-mutating-requests-inflight=1000
# --watch-cache-sizes=1000
# --enable-aggregator-routing=true
2. etcd 优化
bash
# 检查状态
etcdctl endpoint status --write-out=table
etcdctl endpoint health
# 备份与压缩
etcdctl snapshot save backup.db
etcdctl defrag
# 关键参数
# --auto-compaction-retention=1h
# --quota-backend-bytes=8589934592 (8GB)
# --max-request-bytes=10485760 (10MB)
3. 网络优化(一键脚本)
bash
# NodeLocal DNS部署
kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/dns/nodelocaldns/nodelocaldns.yaml
# 内核参数优化
cat > /etc/sysctl.d/99-k8s.conf <<EOF
net.core.somaxconn=32768
net.ipv4.tcp_max_syn_backlog=8192
net.ipv4.ip_local_port_range=1024 65535
net.netfilter.nf_conntrack_max=1000000
net.netfilter.nf_conntrack_buckets=250000
net.ipv4.tcp_tw_reuse=1
EOF
sysctl -p /etc/sysctl.d/99-k8s.conf
4. 调度器优化
bash
# 查看调度延迟
kubectl get --raw="/metrics" | grep scheduler_scheduling_algorithm_duration_seconds
# 修改调度器配置
vim /etc/kubernetes/manifests/kube-scheduler.yaml
# 添加:
# --percentage-of-nodes-to-score=30
# --kube-api-burst=100
三、监控指标与告警阈值
| 组件 | 关键指标 | 警告阈值 | 严重阈值 |
|---|---|---|---|
| API Server | apiserver_request_duration_seconds (P95) | > 1s | > 3s |
| apiserver_request_total{code=~"5..."} | > 0.1% | > 1% | |
| etcd | etcd_disk_wal_fsync_duration_seconds (P99) | > 50ms | > 100ms |
| etcd_server_leader_changes_seen_total | > 1次/小时 | > 5次/小时 | |
| 网络 | coredns_dns_request_duration_seconds (P95) | > 100ms | > 500ms |
| node_netstat_TcpExt_TCPTimeouts | > 10次/分钟 | > 100次/分钟 | |
| 调度器 | scheduler_scheduling_algorithm_duration_seconds (P95) | > 500ms | > 2s |
| kubelet | kubelet_pod_start_duration_seconds (P95) | > 30s | > 60s |
四、规模分级优化建议
| 集群规模 | 节点数 | API Server | etcd | 网络方案 | 关键优化 |
|---|---|---|---|---|---|
| 小型 | < 50 | 2副本,4C8G | 单盘SSD | Calico IPIP | NodeLocal DNS |
| 中型 | 50-200 | 3副本,8C16G | RAID SSD | Calico BGP | 分离event存储 |
| 大型 | 200-500 | 4副本,16C32G | NVMe SSD | Cilium eBPF | 聚合层+调度器优化 |
| 超大型 | > 500 | 负载均衡+多集群 | 独立集群 | 定制方案 | 联邦/多集群 |
五、常见问题快速诊断
问题:Pod 启动慢
bash
# 诊断步骤
kubectl describe pod <pod-name> # 看事件
kubectl get events --sort-by='.lastTimestamp' # 集群事件
journalctl -u kubelet -f # kubelet日志
kubectl get cs # 组件健康状态
问题:网络不通
bash
# 诊断命令
kubectl run net-test --image=nicolaka/netshoot --rm -it -- sh
# 在容器内:
ping <pod-ip>
nslookup kubernetes.default.svc.cluster.local
tcpdump -i any port 53 # DNS抓包
问题:etcd 延迟高
bash
# 检查命令
etcdctl endpoint status --write-out=table
etcdctl check perf
iostat -x 1 # 磁盘IO
六、优化优先级排序
-
紧急必做:
- conntrack调优(
nf_conntrack_max=1000000) - NodeLocal DNS部署
- API Server资源提升
- conntrack调优(
-
重要优化:
- etcd分离event存储
- 调度器百分比调整
- Pod DNS配置(
ndots:2)
-
高级优化:
- Cilium eBPF网络
- 多集群联邦
- 自定义调度器
核心原则:先解决阻塞性瓶颈(如conntrack满),再优化性能瓶颈(如网络延迟)。