这是看到一个INFOQ上的文章《如何用Kubernetes管理超过2500个节点的集群》,所作的摘要:
原网址:https://blog.openai.com/scaling-kubernetes-to-2500-nodes/?utm_source=digg
1ï¼Â 在集群中超过500个节点的时候,kubectl操作集群出现超时的情况。
开始,通过增加kube master节点(API Server)的情况来临时解决。
然后,发现etcd使用串行I/O,改用SSD磁盘,写延迟可降低到200微秒。
2ï¼Â 当集群中超过1000个节点时,etcd出现了很高的延迟。
现象在于apiserver从etcd读取数据的速度超过了500MB/s。(搭建了prometheus监控kube-apiservers,设置了—audit-log-path和—audit-log-maxbackup),是因为很多慢查询和大量对Events的List API的请求。这是由于部份程序频繁的去apiserver查询各种信息所导致的(Fluentd, Datadog….)。解决办法有两个:
一是修改这些程序的设置,让它们去apiserver的查询频率降低。
二是将kubernetes Events存储在一个单独的ectd集群里。
在节点超过1000节点时,还会触发etcd的硬盘存储上限(2G)。
这时,就需要通过—quota-backend-bytes增加存储大小。同时,如果有autoscaler配置的话,要让autoscaler支持基础(sanity)检查。在发现要终止集群里超过50%的workers时,放弃这个操作。
我们在同一台机器上安装了 kube-apiserver,kube-controller-manager 和 kube-scheduler processes。为了高可用,我们一直有至少两个 masters,并将 --apiserver-count 设置为我们正在运行的 apiservers 数量(否则 Prometheus 可能会混淆这些实例)。
在更改 Kubernetes 的调度系统策略(policy)之后,也要防止kubeDNS成为服务热点而成为性能瓶颈,此时也要注意调度DNS节点分布。这两个配置参考如下:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- weight: 100
labelSelector:
matchExpressions:
- key: k8s-app
operator: In
values:
- kube-dns
topologyKey: kubernetes.io/hostname
3, Docker拉取镜像问题
当新节点和新镜像很多很大时(超过10G),很多pod都处于pending状态。
解决办法是将kubelet的—serialize-image-pulls设置为false,并且使用overlay2文件系统(不可为AUFS!!!),将docker的根存储目录最好也要迁移到SSD本地盘上。
然后将kubelet的—image-pull-progress-deadline设置为30分钟,将docker的max-concurrent-downloads为10。
对于不能实时通过外网下载的镜像,如gcr.io,可以先下载下来进行预加载。
4, 网络问题
当网络中的机器数据越来越多时,机器之间的吞吐量大约在 10-15Gbit/s, 但是我们基于 Flannel 的 Pods 之间的最大吞吐量仅仅只有 2Gbit/s。
解决这个问题的办法是使用两个不同的设置来让pods绕过flannel网络。hostNetwork设置为true,dnsPolicy设置为ClusterFirstWithHostNet(作之前先看警告,获知后果)
5, ARP缓存
当机器节点增多时,内核的ARP栈也可能爆掉(用完了缓存空间)。这时,需要更改/etc/sysctl.conf的设置(这种修改在HPC集群中常见)。
net.ipv4.neigh.default.gc_thresh1 = 80000
net.ipv4.neigh.default.gc_thresh2 = 90000
net.ipv4.neigh.default.gc_thresh3 = 100000
当kubernetes的版本升级到1.8.4后,官方已支持5,000个节点的集群!