API Server 负载均衡问题被解决 | 云原生生态周报 Vol. 40

作者 | 何淋波、李鹏、陈俊、高相林、孙健波

业界要闻

  1. CNCF 宣布 2020 年中国 KubeCon 取消

由于新冠疫情影响,外国企业、开发者到访中国存在不确定性,加上召集演讲人、赞助商及参会者所遇到的困难,CNCF 宣布原定于 2020 年 7 月在上海举办的 KubeCon + CloudNativeCon + 开源峰会取消。

同时,原计划于 3 月 30 日 – 4 月 2 日在荷兰阿姆斯特丹举办的 KubeCon + CloudNativeCon 峰会欧洲场也因疫情影响,被推迟到 2020 年 7 月或 8 月举行。而 KubeCon + CloudNativeCon North America 2020 则将按计划在 2020 年 11 月 17 日至 20 日在波士顿举行。

  1. Kubeflow 1.0 发布

可以基于 Kubernetes 高效地构建、训练和部署AI应用。此次发布中包括的核心组件如下:

  • Jupyter Notebook controller: 用户可以方便使用 Jupyter Notebook 开发工具来开发新的机器学习模型;
  • TFJob and PyTorch Operator:用于模型训练;
  • kfctl:用于部署和管理 Kubeflow;
  • KFServing:机器学习模型的部署和管理;
  • Kubeflow UI:集中仪表板。
  1. 阿里云 ACK 1.16 版本正式灰度上线

阿里云 ACK 整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。Gartner 竞争格局国内唯一入选,Forrester 报告国内排名第一。欢迎试用!欢迎广大读者前来试用!

上游重要进展

Kubernetes

  1. 阿里经济体工程师解决困扰 K8s 社区多年的 API Server 负载均衡问题

由于 API Server 和 client 是使用 HTTP2 协议连接,HTTP2 的多个请求都会复用底层的同一个 TCP 连接并且长时间不断开。而在 API Server 发生 RollingUpdate 或者某个 API Server 实例重启时,又或者 API Server 使用 MaxSurge=Replica 方式升级后, Load Balance 没有及时的将所有副本挂载完毕,client 能敏感的感知到连接的断开并立刻发起新的请求,这时候很容易引起较后启动(或者较后挂载 Load Balance)的 API Server 没有一点流量,并且可能永远都得不到负载均衡。

蚂蚁金服的同学对这个问题做了修复,增加了一种通用的 HTTP filter,API Server 概率性(建议 1/1000)的随机关闭和 Client 的链接(向 Client 发送 GOAWAY)。关闭是优雅的关闭,不会影响  API Server 和 client 正在进行中的长时间请求(如 Watch 等),但是收到 GOAWAY 之后,client 新的请求就会重新建立一个新的 TCP 链接去访问 API Server 从而能让 Load Balance 再做一次负载均衡。

这个修复增加了通用的 HTTP filter,能轻易的 port 回老版本的 Kubernetes,其它 HTTP2 server 也有类似问题也可以快速 port 这个通用的 filter(只依赖较新版本 golang.org/x/net package)。

  1. add KEP for cgroups v2 support

给 kubelet 增加 cgroups v2 的支持。

  1. Disable HTTP2 while proxying a “Connection: upgrade” request

针对 proxy connection upgrade 请求,强制采用 http1.1 协议。

  1. Fix ExternalTrafficPolicy support for Service ExternalIPs

Service ExternalIPs 遵守 ExternalTrafficPolicy=local 规则,从而达到保留 Client 源 IP 目的。

  1. Allow signing controller to return intermediate certs

由于 kubelet 证书轮转机制要求给 kubelet 返回签发的证书时,同时也带上签发者的 CA 信息,用于解决 kube-controller-manager 和 kube-apiserver 的 CA 配置不一致的问题。该 PR 只解决 kube-controller-manager 这块的问题,后续 kubelet 还需要配合修改。

  1. Use ip address from CNI output

目前主要从容器的 eth device 获取容器 IP 信息,但是针对只使用 lo 和非 device(如: unix domain socket file)的容器当前的实现无法 cover,该 PR 利用 cni ADD 命令结果中返回的容器 IP 信息,而不从容器 eth device 获取 IP 信息。

Knative

  1. Knative Functions 支持

Knative 当前轻松支持基于 HTTP 和事件驱动的容器扩缩容,但是为什么不往前一步支持 FaaS 呢? 别急,Knative 社区已经开始计划支持通过 Events 和 HTTP 触发“function”。

开源项目推荐

  1. apiserver-network-proxy

基于 grpc 的隧道实现,用于定制 kube-apiserver 的 proxy 请求转发。

  1. kubectl-debug

新启动一个容器和目标 Pod 共享 pid/network/user/ipc 命名空间的方式,在新启动容器为目标 pod 定位问题。该工具可以以 kubectl plugin 方式运行。

本周阅读推荐

  1. 《Bring your ideas to the world with kubectl plugins》

推荐使用 kubectl-plugin 的方式往 kubectl 扩展用户的需求和功能。

  1. 《When You Do (and Don’t Need) a Service Mesh》

从微服务数量、导入的紧迫性以及时机等方面分析是否需要使用 Service Mesh。

  1. 《从零开始入门 K8s | Kubernetes 网络模型进阶》

本文将基于之前介绍的基本网络模型,进行了更深入的了解,希望给予读者一个更广更深的认知。

  1. 《Kubernetes 1.16 与 1.14 性能对比》

本文主要从三个方面对 Kubernetes 1.16 与 1.14 的性能进行了对比,分析了 1.16 版本和 1.14 版本的区别。

  1. 《Kubernetes Release Note 解读(1.15, 1.16)》

Kubernetes 1.16 版本相较于 1.14 版本有着众多演进和增强,本文对其一一进行了解读。

阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的技术圈。”

K8S中文社区微信公众号

评论 抢沙发

登录后评论

立即登录