Kubernetes 大规模集群

Kubernetes v1.9 单集群最大支持 5000 个节点,也就是说 Kubernetes 最新稳定版的单个集群支持

  • 不超过 5000 个节点
  • 不超过 150000 个 Pod
  • 不超过 300000 个容器
  • 每台 Node 上不超过 100 个 Pod

公有云配额

对于公有云上的 Kubernetes 集群,规模大了之后很容器碰到配额问题,需要提前在云平台上增大配额。这些需要增大的配额包括

  • 虚拟机个数
  • vCPU 个数
  • 内网 IP 地址个数
  • 公网 IP 地址个数
  • 安全组条数
  • 路由表条数
  • 持久化存储大小

Etcd 存储

除了常规的 Etcd 高可用集群配置、使用 SSD 存储等,还需要为 Events 配置单独的 Etcd 集群。即部署两套独立的 Etcd 集群,并配置 kube-apiserver

  1. --etcd-servers="http://etcd1:2379,http://etcd2:2379,http://etcd3:2379" --etcd-servers-overrides="/events#http://etcd4:2379,http://etcd5:2379,http://etcd6:2379"

另外,Etcd 默认存储限制为 2GB,可以通过 --quota-backend-bytes 选项增大。

Master 节点大小

可以参考 AWS 配置 Master 节点的大小:

  • 1-5 nodes: m3.medium
  • 6-10 nodes: m3.large
  • 11-100 nodes: m3.xlarge
  • 101-250 nodes: m3.2xlarge
  • 251-500 nodes: c4.4xlarge
  • more than 500 nodes: c4.8xlarge

为扩展分配更多资源

Kubernetes 集群内的扩展也需要分配更多的资源,包括为这些 Pod 分配更大的 CPU 和内存以及增大容器副本数量等。当 Node 本身的容量太小时,还需要增大 Node 本身的 CPU 和内存(特别是在公有云平台上)。

以下扩展服务需要增大 CPU 和内存:

以下扩展服务需要增大副本数:

另外,为了保证多个副本分散调度到不同的 Node 上,需要为容器配置 AntiAffinity。比如,对 kube-dns,可以增加如下的配置:

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

Kubelet 配置

  • 设置 --image-pull-progress-deadline=30m
  • 设置 --serialize-image-pulls=false(需要 Docker 使用 overlay2 )

Docker 配置

  • 设置 max-concurrent-downloads=10
  • 使用 SSD 存储 graph=/ssd-storage-path
  • 预加载 pause 镜像,比如 docker image save -o /opt/preloaded_docker_images.tardocker image load -i /opt/preloaded_docker_images.tar

节点配置

增大内核选项配置 /etc/sysctl.conf

  1. fs.file-max=1000000
  2. net.ipv4.ip_forward=1
  3. net.netfilter.nf_conntrack_max=10485760
  4. net.netfilter.nf_conntrack_tcp_timeout_established=300
  5. net.netfilter.nf_conntrack_buckets=655360
  6. net.core.netdev_max_backlog=10000
  7. net.ipv4.neigh.default.gc_thresh1=1024
  8. net.ipv4.neigh.default.gc_thresh2=4096
  9. net.ipv4.neigh.default.gc_thresh3=8192
  10. net.netfilter.nf_conntrack_max=10485760
  11. net.netfilter.nf_conntrack_tcp_timeout_established=300
  12. net.netfilter.nf_conntrack_buckets=655360
  13. net.core.netdev_max_backlog=10000

参考文档