如何进行TKE集群组建的最佳实践

这篇文章给大家介绍如何进行TKE集群组建的最佳实践,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

Kubernetes 版本

Kubernetes 版本迭代比较快,新版本通常包含许多 bug 修复和新功能,旧版本逐渐淘汰,建议创建集群时选择当前 TKE 支持的最新版本,后续出新版本后也是可以支持 Master 和节点的版本升级的。

网络模式: GlobalRouter vs VPC-CNI

GlobalRouter 模式架构:

如何进行TKE集群组建的最佳实践

  • 基于 CNI 和 网桥实现的容器网络能力,容器路由直接通过 VPC 底层实现;

  • 容器与节点在同一网络平面,但网段不与 VPC 网段重叠,容器网段地址充裕。

VPC-CNI 模式架构:

如何进行TKE集群组建的最佳实践

  • 基于 CNI 和 VPC 弹性网卡实现的容器网络能力,容器路由通过弹性网卡,性能相比 Global Router 约提高 10%;

  • 容器与节点在同一网络平面,网段在 VPC 网段内;

  • 支持 Pod 固定 IP。

网络模式对比:

如何进行TKE集群组建的最佳实践

支持三种使用方式:

  • 创建集群时指定 GlobalRouter 模式;

  • 创建集群时指定 VPC-CNI 模式,后续所有 Pod 都必须使用 VPC-CNI 模式创建;

  • 创建集群时指定 GlobalRouter 模式,在需要使用 VPC-CNI 模式时为集群启用 VPC-CNI 的支持,即两种模式混用。

选型建议:

  • 绝大多数情况下应该选择 GlobalRouter,容器网段地址充裕,扩展性强,能适应规模较大的业务;

  • 如果后期部分业务需要用到 VPC-CNI 模式,可以在 GlobalRouter 集群再开启 VPC-CNI 支持,也就是 GlobalRouter 与 VPC-CNI 混用,仅对部分业务使用 VPC-CNI 模式;

  • 如果完全了解并接受 VPC-CNI 的各种限制,并且需要集群内所有 Pod 都用 VPC-CNI 模式,可以创建集群时选择 VPC-CNI 网络插件。

参考官方文档 《如何选择容器服务网络模式》: https://cloud.tencent.com/document/product/457/41636

运行时: Docker vs Containerd

Docker 作为运行时的架构:

如何进行TKE集群组建的最佳实践

  • kubelet 内置的 dockershim 模块帮傲娇的 docker 适配了 CRI 接口,然后 kubelet 自己调自己的 dockershim (通过 socket 文件),然后 dockershim 再调 dockerd 接口 (Docker HTTP API),接着 dockerd 还要再调 docker-containerd (gRPC) 来实现容器的创建与销毁等。

  • 为什么调用链这么长?Kubernetes 一开始支持的就只是 Docker,后来引入了 CRI,将运行时抽象以支持多种运行时,而 Docker 跟 Kubernetes 在一些方面有一定的竞争,不甘做小弟,也就没在 dockerd 层面实现 CRI 接口,所以 kubelet 为了让 dockerd 支持 CRI,就自己为 dockerd 实现了 CRI。docker 本身内部组件也模块化了,再加上一层 CRI 适配,调用链肯定就长了。

Containerd 作为运行时的架构:

如何进行TKE集群组建的最佳实践

  • containerd 1.1 之后,支持 CRI Plugin,即 containerd 自身这里就可以适配 CRI 接口。

  • 相比 Docker 方案,调用链少了 dockershim 和 dockerd。

运行时对比:

  • containerd 方案由于绕过了 dockerd,调用链更短,组件更少,占用节点资源更少,绕过了 dockerd 本身的一些 bug,但 containerd 自身也还存在一些 bug (已修复一些,灰度中)。

  • docker 方案历史比较悠久,相对更成熟,支持 docker api,功能丰富,符合大多数人的使用习惯。

选型建议: