API Server 负载均衡问题被解决 | 云原生生态周报 Vol. 40
作者 | 何淋波、李鹏、陈俊、高相林、孙健波
业界要闻
由于新冠疫情影响,外国企业、开发者到访中国存在不确定性,加上召集演讲人、赞助商及参会者所遇到的困难,CNCF 宣布原定于 2020 年 7 月在上海举办的 KubeCon + CloudNativeCon + 开源峰会取消。
同时,原计划于 3 月 30 日 - 4 月 2 日在荷兰阿姆斯特丹举办的 KubeCon + CloudNativeCon 峰会欧洲场也因疫情影响,被推迟到 2020 年 7 月或 8 月举行。而 KubeCon + CloudNativeCon North America 2020 则将按计划在 2020 年 11 月 17 日至 20 日在波士顿举行。
可以基于 Kubernetes 高效地构建、训练和部署AI应用。此次发布中包括的核心组件如下:
- Jupyter Notebook controller: 用户可以方便使用 Jupyter Notebook 开发工具来开发新的机器学习模型;
- TFJob and PyTorch Operator:用于模型训练;
- kfctl:用于部署和管理 Kubeflow;
- KFServing:机器学习模型的部署和管理;
- Kubeflow UI:集中仪表板。
阿里云 ACK 整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。Gartner 竞争格局国内唯一入选,Forrester 报告国内排名第一。欢迎试用!欢迎广大读者前来试用!
上游重要进展
Kubernetes
由于 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)。
给 kubelet 增加 cgroups v2 的支持。
针对 proxy connection upgrade 请求,强制采用 http1.1 协议。
Service ExternalIPs 遵守 ExternalTrafficPolicy=local 规则,从而达到保留 Client 源 IP 目的。
由于 kubelet 证书轮转机制要求给 kubelet 返回签发的证书时,同时也带上签发者的 CA 信息,用于解决 kube-controller-manager 和 kube-apiserver 的 CA 配置不一致的问题。该 PR 只解决 kube-controller-manager 这块的问题,后续 kubelet 还需要配合修改。
目前主要从容器的 eth device 获取容器 IP 信息,但是针对只使用 lo 和非 device(如: unix domain socket file)的容器当前的实现无法 cover,该 PR 利用 cni ADD 命令结果中返回的容器 IP 信息,而不从容器 eth device 获取 IP 信息。
Knative
Knative 当前轻松支持基于 HTTP 和事件驱动的容器扩缩容,但是为什么不往前一步支持 FaaS 呢? 别急,Knative 社区已经开始计划支持通过 Events 和 HTTP 触发“function”。
开源项目推荐
基于 grpc 的隧道实现,用于定制 kube-apiserver 的 proxy 请求转发。
新启动一个容器和目标 Pod 共享 pid/network/user/ipc 命名空间的方式,在新启动容器为目标 pod 定位问题。该工具可以以 kubectl plugin 方式运行。
本周阅读推荐
推荐使用 kubectl-plugin 的方式往 kubectl 扩展用户的需求和功能。
从微服务数量、导入的紧迫性以及时机等方面分析是否需要使用 Service Mesh。
本文将基于之前介绍的基本网络模型,进行了更深入的了解,希望给予读者一个更广更深的认知。
本文主要从三个方面对 Kubernetes 1.16 与 1.14 的性能进行了对比,分析了 1.16 版本和 1.14 版本的区别。
Kubernetes 1.16 版本相较于 1.14 版本有着众多演进和增强,本文对其一一进行了解读。
“阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的技术圈。”