TKE 集群组建最佳实践

Kubernetes 版本

Kubernetes 版本迭代比较快,新版本通常包含许多 bug 修复和新功能,旧版本逐渐淘汰,建议创建时选择当前 TKE 支持的最新版本,后续出新版本后也是{ W U } w : ?可以支持 Master 和节点c k - l F K的版本升级的。

网络模式: GlobalRo| C j Q Outer vs VPC-CNI

GlobalRoutY r = Der 模式架构:

TKE 集群组建最佳实践

  • 基于 CNIr D + f ^ Y * q 和 网桥实现的容器网络能力,容器路由直接通过 VPC 底层实现;
  • 容器与节点在! ^ ^同一网络平面,但网段不与 VPC 网段重叠,容器网段地址充裕。

VPC-CNw ^ $ ?I 模式架构:

TKE 集群组建最佳实践

  • 基于t 3 # } P w ^ H n CNI 和 VPC 弹性网卡实现的容8 * ^器网络能力,容器路: O p i ^由通过弹性网卡,性能相比 Global Router 约提高 10%;
  • 容器与节点在同一网. O 3 0平面,网段z v ( 0 w 7 B w k在 V@ , 2 UPC 网段内;
  • 支持 Pod 固定 IP。

网络模式对比:

TKE 集群组建最佳实践

支持三种使用方式:

  • 创建时指定 GlobalRouter 模式;
  • 创建集群时指定 VPC-CNI 模式,后续所有 Pod 都必须使用 VPC-CNI 模式创建;
  • 创建集群时指定 GlobalRouter 模式,在需要使用 VPCS l [ q ` ( % 5-CNI 模式时为集群启用 VPC-CNI 的支持,即两种模式混用。

c 0 X l z E : 7 4型建议:

  • 绝大多数情况下应该选择 GlobalRouter,容器网段地i ` F f z U y 7址充裕,扩展性强,能适应规模较大的业务;
  • 如果后期部分业务需要用U u r到 VPC-CNI 模式,可以在 Ga / 9 alobalRouter 集群再开启 VPC-CNI 支持,也就是 GlobalRouQ @ D 8ter 与 VPC-CNI 混用,仅对部分业务使用 VPC-CNI 模式;
  • 如果完全了解并接受 VPC-CNI 的i , @ X各种限制,并且需要集群内所有 Pod 都用 VPC-CNI 模4 D 1 c 6 0 G式,可} , | D Z Z j以创建集群时选择 VPC-CNI 网络插件。

参考官方文档 《如何选择容器服务网络模式》: https://cloud.tencent.com/document/product6 5 P c r -/457/416X 4 736

运行时: Docker vs Containerd

Docker 作为运行时的架构:

TKE 集群组建最佳实践

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

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

Containerd 作为运行时的架构:n 3 E

TKE 集群组建最佳实践

  • containerd 1.1 之后,支持 CRI Plugin,即 containerd 自身这里就可以适配 CRI 接口。
  • 相比 Docker 方案,调用链少了 docker( ? v ^shim 和 dockerd。

运行时对比k g i + l Y L o h

  • contain} . - G u xerd 方案由于绕过了 dockerd,调用链更短,组件更少,占用节. a Q 3 E o点资源更少,绕过了 dockerd 本身的一些 bug,但 containerd 自身也还存在一些 bug (已修复一些,灰度中)。
  • docker 方案历史比较5 w l , J |悠久,相对更成熟,支持 docker api,功能丰富S R 3 L X U } j ,,符合大多数人的使用习惯。

选型建议:

  • Docke_ % [ e P $r 方案 相比 containerd 更成熟Y o } S i,如果对稳定性要求很高,建议 docker 方案;

  • 以下场景只能使用 docker:

    • Docker in docker (通常在 CI 场景)
    • 节点上使用 docker 命令
    • 调用 docker API
  • 没有- . v ` # g J = t以上场景建议使用 containerd。

参考官方文档 《如何选择 Containerd 和Docker》:https://cloud.tencent.com/document/product/457/357473 O . 9 , # +

Service 转发模式: i. : A U y * R E nptables vs ipvs

先看看 Service 的转发原理:

TKE 集群组建最佳实践

  • 节点上的 kube-proxy 组件 watch apiseW j zrver,获取 Service 与 EnN E X a 0dpoint,根9 i y c ? 7 %据转发模式将其转化成 iptable* a # K rs 或 ipvs 规& [ u e u |则并写到节点上;
  • 集群内的 clienQ q yt 去访问 SeE ) $ r I lrvi 0 E u Y D ^ A zce (Cluster IP),会被 iptable/ipvs 规则负载均衡到I y q j M w Service 对应的后端 pod。

转发模式对比:

  • ipvs 模式性能更高,但也存在一些已知未解决的 bug;
  • iptables 模式@ I Q 6 ) _ b w !更成熟稳定。

选型建议:

  • 对稳定性要求极高且 service 数量小于 2000,选 iptables;
  • 其余场景首选 ipO U d ! Svs。

集群类型: 托管集群 vs 独立集群

托管集群:

  • Master 组件用户不可见,由腾讯托管
  • 很多新功能也是会率先支持托管的集群
  • Master 的计算资源会根据集群规模自动扩容
  • 用户不需要为 Master 付费g % w c

独立集群:

  • Master 组件O + F K %用户可以完全掌控
  • 用户需要为 Master 付费购买机器

选型建议:

  • 一般推荐托管集群o ( % I z q +
  • 如果希望能能k H G x Vq I * / `对 Master 完全掌控,可以使用独立集群 (比如对 Master 进行个性化定制实现高级功能)

节点操作系统

TKE 主要支持 Ubuntu 和 CentOS 两类发行版,带 “TKE-U i ; y ) P 5Optimized” 后缀用的是 TKE 定制优化版的内核,其它的是 li& 0 o C C L K g unux 社区官方开源内核:

TKE 集群组建最佳实践

TKE 集群组建最佳实践

TKE-Optimized 的优势:

  • 基于内核社区长期支持的 4.14.105) @ b H , * 版本定制
  • G 7 N 3对容器和场景进行优化
  • 计算、W 8 : ; k存储和网络子系统均经过性能优化
  • 对内核缺陷修复支持较好
  • 完全开源:https://gC ! i # { X 7 C :ithub.com/5 u QTencent/Te3 H ! Y O 4 # BncentOS-kernel

选型建议:

  • 推荐 “d m c ? / m PTKE-Optimized”,稳定性和技术支持都比较好
  • 如果需要更高版本内核,选非 “TKE-Optimized”版本的操作系统

节点E ~ 2 q F i M F x

此特性当前正在L 2 ;灰度中,可申请开白名单使用。主要可用于批量管理节点:

  • 节点 Label 与 Taint
  • 节点组件启动参数
  • 节点自定义启动脚本
  • 操作系统与运行时 (暂未支持)

产品文档:hts x L F t B $ O Ptps://cloud.tencent.com/document/product/] @ m Q / I [ # ^457/43719

适用场景:

  • 异构节点分组管理,减少管理成本
  • 让集群更好支持复杂的调e N i - 7 S S X t度规则 (Label, Tain[ X , /t)
  • 频繁扩缩容节点,减少操作成本
  • 节点日常维护(版本升级K } ^ L)

用法举例:

部分IO密集型业务需要高IO机型,为其创建一个节点池,配置8 4 J r ~ {机型并统一设置节点 Labek 4 ; A 5 Al 与 Taint,然后将 IOf g G 2 6 | k 密集型业务配置亲和性,d 5 9 Z R G选中 Label,使其调度到高 IO 机型的节点 (Taint 可以避免其它业务 Pod 调度上来)。

K x * 4 u } C p着时间的推移,业务量快速上升,该 IO 密集型业务也需要更多的计算资源,在业务高峰时段,Hs I U CPA 功能自动为该业务扩容了 Pod,而节点计算资源不够用,这时节点池的自动伸缩功能自动扩容了节点,扛住了流量高峰。

启动脚本

组件自定义参数

此特性当前也正] 6 K 3 2 G @在灰度中x o P,可申请开白名单使用。

  1. 创建集群时,可; C 3 C d ; s集群信息界面“高级设置”中自定义 Master 组件部分启动= X 7 J i M o f 3参数:

TKE 集群组建最佳实践

  1. 添加节点时,可在云服务器配置界/ H Q y C ! E D ,面的“高级设置”中自定义 kubelet 部分启动参数:

TKE 集群组建最佳实践

节点启动配置

  1. 新建集群时,可在云服务器配置界面` ; m Z I 8的“节点启动配置”选项处添加节点启动脚本:

TKE 集群组建最佳实践

  1. 添加节点时,可在云服务器配置界面的“高级设置”中通过自定义数据配置节点启动脚本 (可用于修改组件启动参数、内核参数等):

TKE 集群组建最佳实践