伸缩Kubernetes到2500个节点中遇到的问题和解决方法

伸缩Kubernetes到2500个节点中遇到的问题和解决方法

作者:佚名 2018-04-25 07:35:07

云计算 Kubernetes自从1.6起便号称可以承载5000个以上的节点,但是从数十到5000的路上,难免会遇到问题。本片文章即分享Open API在kubernetes 5000之路上的经验,包括遇到的问题、尝试解决问题以及找到真正的问题。

Kubernetes自从1.6起便号称可以承载5000个以上的节点,但是从数十到5000的路上,难免会遇到问题。

本片文章即分享Open API在kubernetes 5000之路上的经验,包括遇到的问题、尝试解决问题以及找到真正的问题。

[[227083]]

遇到的问题以及如何解决

问题一:1 ~ 500个节点之后

问题:

kubectl 有时会出现 timeout(p.s. kubectl -v=6 可以显示所有API细节指令)

尝试解决:

  • 一开始以为是kube-apiserver服务器负载的问题,尝试增加proxy做replica协助进行负载均衡
  • 但是超过10个备份master的时候,发现问题不是因为kube-apiserver无法承受负载,GKE通过一台32-core VM就可以承载500个节点

原因:

排除以上原因,开始排查master上剩下的几个服务(etcd、kube-proxy)

  • 开始尝试调整etcd
  • 通过使用datadog查看etcd吞吐量,发现有异常延迟(latency spiking ~100 ms)
  • 通过Fio工具做性能评估,发现只用到10%的IOPS(Input/Output Per Second),由于写入延迟(write latency 2ms)降低了性能
  • 尝试把SSD从网络硬盘变为每台机器有个local temp drive(SSD)
  • 结果从~100ms —> 200us

问题二:~1000个节点的时候

问题:

发现kube-apiserver每秒从etcd上读取500mb

尝试解决:

  • 通过Prometheus查看container之间的网络流量

原因:

  • 发现Fluentd和Datadog抓取每个节点上资料过于频繁
  • 调低两个服务的抓取频率,网络性能从500mb/s降低到几乎没有

etcd小技巧:通过–etcd-servers-overrides可以将Kubernetes Event的资料写入作为切割,分不同机器处理,如下所示

  1. --etcd-servers-overrides=/events#https://0.example.com:2381;https://1.example.com:2381;https://2.example.com:2381 

问题三:1000 ~ 2000个节点

问题:

无法再写入数据,报错cascading failure

kubernetes-ec2-autoscaler在全部的etcd都停掉以后才回传问题,并且关闭所有的etcd

尝试解决:

  • 猜测是etcd硬盘满了,但是检查SSD依旧有很多空间
  • 检查是否有预设的空间限制,发现有2GB大小限制

解決方法:

  • 在etcd启动参数中加入–quota-backend-bytes
  • 修改kubernetes-ec2-autoscaler逻辑——如果超过50%出现问题,关闭集群

各种服务的优化

Kube masters 的高可用

一般来说,我们的架构是一个kube-master(主要的 Kubernetes 服务提供组件,上面有kube-apiserver、kube-scheduler 和kube-control-manager)加上多個slave。但是要达到高可用,要参考一下方式实现:

  • kube-apiserver要设置多个服务,并且通过参数–apiserver-count重启并且设定
  • kubernetes-ec2-autoscaler可以帮助我们自动关闭idle的资源,但是这跟Kubernetes scheduler的原则相悖,不过通过这些设定,可以帮助我们尽量集中资源。

 

  1. "kind" : "Policy"
  2. "apiVersion" : "v1"
  3. "predicates" : [ 
  4.   {"name" : "GeneralPredicates"}, 
  5.   {"name" : "MatchInterPodAffinity"}, 
  6.   {"name" : "NoDiskConflict"}, 
  7.   {"name" : "NoVolumeZoneConflict"}, 
  8.   {"name" : "PodToleratesNodeTaints"
  9.   ], 
  10. "priorities" : [ 
  11.   {"name" : "MostRequestedPriority""weight" : 1}, 
  12.   {"name" : "InterPodAffinityPriority""weight" : 2} 
  13.   ] 

以上为调整kubernetes scheduler范例,通过调高InterPodAffinityPriority的权重,达到我们的目的。更多示范参考范例.

需要注意的是,目前Kubernetes Scheduler Policy并不支持动态切换,需要重启kube-apiserver(issue: 41600)

调整scheduler policy造成的影响

OpenAI使用了KubeDNS ,但不久后发现——

问题:

经常出现DNS查询不到的情况(随机发生)

超过 ~200QPS domain lookup

尝试解决:

  • 尝试查看为何有这种状态,发现有些node上跑了超过10个KuberDNS

解决方法:

  • 由于scheduler policy造成了许多POD的集中
  • KubeDNS很轻量,容易被分配到同一节点上,造成domain lookup的集中
  • 需要修改POD affinity(相关介绍),尽量让KubeDNS分配到不同的node之上

 

  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 

新建节点时Docker image pulls缓慢的问题

问题:

每次新节点建立起来,docker image pull都要花30分钟

尝试解决:

  • 有一个很大的container image Dota,差不多17GB,影响了整个节点的image pulling
  • 开始检查kubelet是否有其他image pull选项

解决方法:

  • 在kubelet增加选项–serialize-image-pulls=false来启动image pulling,让其他服务可以更早地pull
  • 这个选项需要docker storgae切换到overlay2
  • 并且把docker image存放到SSD,可以让image pull更快一些

补充:source trace

 

  1. // serializeImagePulls when enabled, tells the Kubelet to pull images one 
  2. // at a time. We recommend *not* changing the default value on nodes that 
  3. // run docker daemon with version  < 1.9 or an Aufs storage backend. 
  4. // Issue #10959 has more details. 
  5. SerializeImagePulls *bool `json:"serializeImagePulls"`   

提高docker image pull的速度

此外,还可以通过以下方式来提高pull的速度

  • kubelet参数–image-pull-progress-deadline要提高到30mins
  • docker daemon参数max-concurrent-download调整到10才能多线程下载

网络性能提升

Flannel性能限制

OpenAI节点间的网络流量,可以达到10-15GBit/s,但是由于Flannel所以导致流量会降到 ~2GBit/s

解决方式是拿掉Flannel,使用实际的网络

  • hostNetwork: true
  • dnsPolicy: ClusterFirstWithHostNet

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/295721.html<

(0)
管理的头像管理
上一篇2025-05-21 16:30
下一篇 2025-05-21 16:31

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注