大规模集群优化

    官方标准如下:

    • 不超过 5000 个节点
    • 不超过 150000 个 pod
    • 不超过 300000 个容器
    • 每个节点不超过 100 个 pod

    ETCD 优化

    部署一个高可用ETCD集群可以参考官方文档:

    提高磁盘 IO 性能

    ETCD 对磁盘写入延迟非常敏感,对于负载较重的集群建议磁盘使用 SSD 固态硬盘。可以使用 diskbench 或 fio 测量磁盘实际顺序 IOPS。

    提高 ETCD 的磁盘 IO 优先级

    由于 ETCD 必须将数据持久保存到磁盘日志文件中,因此来自其他进程的磁盘活动可能会导致增加写入时间,结果导致 ETCD 请求超时和临时 leader 丢失。当给定高磁盘优先级时,ETCD 服务可以稳定地与这些进程一起运行:

    默认 ETCD 空间配额大小为 2G,超过 2G 将不再写入数据。通过给 ETCD 配置 --quota-backend-bytes 参数增大空间配额,最大支持 8G。

    分离 events 存储

    配置 kube-apiserver:

      减小网络延迟

      如果有大量并发客户端请求 ETCD leader 服务,则可能由于网络拥塞而延迟处理 follower 对等请求。在 follower 节点上的发送缓冲区错误消息:

      可以通过在客户端提高 ETCD 对等网络流量优先级来解决这些错误。在 Linux 上,可以使用 tc 对对等流量进行优先级排序:

      1. $ tc qdisc add dev eth0 root handle 1: prio bands 3
      2. $ tc filter add dev eth0 parent 1: protocol ip prio 1 u32 match ip sport 2380 0xffff flowid 1:1
      3. $ tc filter add dev eth0 parent 1: protocol ip prio 1 u32 match ip dport 2380 0xffff flowid 1:1
      4. $ tc filter add dev eth0 parent 1: protocol ip prio 2 u32 match ip sport 2379 0xffff flowid 1:1
      5. $ tc filter add dev eth0 parent 1: protocol ip prio 2 u32 match ip dport 2379 0xffff flowid 1:1

      GCE 推荐配置:

      • 1-5 节点: n1-standard-1
      • 6-10 节点: n1-standard-2
      • 11-100 节点: n1-standard-4
      • 101-250 节点: n1-standard-8
      • 251-500 节点: n1-standard-16
      • 超过 500 节点: n1-standard-32

      AWS 推荐配置:

      • 1-5 节点: m3.medium
      • 6-10 节点: m3.large
      • 11-100 节点: m3.xlarge
      • 101-250 节点: m3.2xlarge
      • 251-500 节点: c4.4xlarge
      • 超过 500 节点: c4.8xlarge

      对应 CPU 和内存为:

      • 1-5 节点: 1vCPU 3.75G内存
      • 6-10 节点: 2vCPU 7.5G内存
      • 11-100 节点: 4vCPU 15G内存
      • 101-250 节点: 8vCPU 30G内存
      • 超过 500 节点: 32vCPU 120G内存

      kube-apiserver 优化

      • 方式一: 启动多个 kube-apiserver 实例通过外部 LB 做负载均衡。
      • 方式二: 设置 --apiserver-count--endpoint-reconciler-type,可使得多个 kube-apiserver 实例加入到 Kubernetes Service 的 endpoints 中,从而实现高可用。

      控制连接数

      kube-apiserver 以下两个参数可以控制连接数:

      1. --max-requests-inflight int The maximum number of non-mutating requests in flight at a given time. When the server exceeds this, it rejects requests. Zero for no limit. (default 400)

      节点数量在 1000 - 3000 之间时,推荐:

      节点数量大于 3000 时,推荐:

      1. --max-requests-inflight=3000
      2. --max-mutating-requests-inflight=1000

      高可用

      kube-controller-manager 和 kube-scheduler 是通过 leader election 实现高可用,启用时需要添加以下参数:

      1. --leader-elect=true
      2. --leader-elect-lease-duration=15s
      3. --leader-elect-renew-deadline=10s
      4. --leader-elect-resource-lock=endpoints
      5. --leader-elect-retry-period=2s

      与 kube-apiserver 通信的 qps 限制,推荐为:

      集群 DNS 高可用

      设置反亲和,让集群 DNS (kube-dns 或 coredns) 分散在不同节点,避免单点故障:

      1. affinity:
      2. requiredDuringSchedulingIgnoredDuringExecution:
      3. - weight: 100
      4. labelSelector:
      5. matchExpressions:
      6. - key: k8s-app
      7. operator: In
      8. values:
      9. topologyKey: kubernetes.io/hostname