K8s优化-大规模集群优化-大规模K8S优化-性能优化速查表-优化顺序-先阻塞瓶颈再性能瓶颈

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

六、优化优先级排序

  1. 紧急必做

    • conntrack调优(nf_conntrack_max=1000000
    • NodeLocal DNS部署
    • API Server资源提升
  2. 重要优化

    • etcd分离event存储
    • 调度器百分比调整
    • Pod DNS配置(ndots:2
  3. 高级优化

    • Cilium eBPF网络
    • 多集群联邦
    • 自定义调度器

核心原则:先解决阻塞性瓶颈(如conntrack满),再优化性能瓶颈(如网络延迟)。

相关推荐
KubeSphere 云原生2 小时前
在 KubeSphere 上运行 Moltbot(Clawdbot):自托管 AI 助手的云原生实践
docker·云原生·容器
你才是臭弟弟2 小时前
生产环境开箱即用的“Flink + Iceberg 数据湖容器搭建”(Docker)
docker·容器·jar
_运维那些事儿3 小时前
GitLabCI-CD入门
运维·ci/cd·容器·云计算·k8s·运维开发
摘星编程3 小时前
React Native + OpenHarmony:removeClippedSubviews性能优化
react native·react.js·性能优化
老友@3 小时前
JMeter 在 Linux 环境下进行生产级性能压测的完整实战指南
java·linux·jmeter·性能优化·系统架构·压测·性能瓶颈
Clarence Liu3 小时前
k8s 1.35 使用kubeadm部署高可用集群
云原生·容器·kubernetes
boy快快长大3 小时前
Docker简单服务迁移
运维·docker·容器
qq_428389043 小时前
尚硅谷k8s自己实践步骤
spring cloud·kubernetes
刘某的Cloud4 小时前
docker run 常用参数
linux·运维·docker·容器