腾讯云云原生混合云-TKE发行版
背景
TKE 发行版(TKE Kubernetes Distro)是由腾讯云 TKE 发布的 K8S 发行版本,用于帮助用户创建安全可靠的 K8S 集群。用户可依托 TKE 发行版在自建或者托管机房、物理机或者虚机上,运行与 TKE 完全一致的 K8S 服务。TKE 发行版集群可无缝与腾讯云 TKE 集成,进而组建混合云。用户可通过 TKE 发行版集群将云下业务扩展到云上,利用腾讯云 TKE、EKS 等云服务弹性能力,为业务提供强大的资源保障。目前 TKE 发行版已在 GitHub 开源:[https://github.com/tkestack/tke-k8s-distro](https://github.com/tkestack/tke-k8s-distro)。
使用场景与定位
在混合云场景下,不同的云服务商提供的 K8S 并不完全相同。并且用户在云服务商以外的环境只能使用社区版 K8S,而运行环境的任何微小差异都可能导致业务故障,因此,如何尽可能地保障多环境中基础组件的一致性变得尤为重要。 TKE 发行版便是解决这个问题的一个不错的选择,用户无需花费精力去关注不同环境下 K8S 的能力差异,以及自行修复 K8S 中的遇到的问题。
依赖 TKE 发行版,用户现在可以编译和构建与腾讯云 TKE 相同的 K8S 版本。这意味着用户现在可以手动部署可靠和安全的集群,而无需持续测试和跟踪 K8S 更新、依赖关系和安全补丁。每一个 TKE 发行版都遵循腾讯云 TKE 和 K8S 社区标准新版本兼容性的流程。
TKE 发行版在保证兼容性的基础上,对 K8S 进行了扩展,并且与腾讯云 TKE 服务保持版本一致。用户可以在自己的 IDC 或者混合云上部署 TKE 发行版,使用已有企业用户大规模验证的可靠安全的 K8S 服务。
TKE 发行版的每个版本都会通过 K8S 社区官方一致性测试,保证兼容性,同时以 patch 形式提供源代码,并提供构建工具帮助用户进行编译。TKE 发行版目前支持 v1.20 版本。
我们的优势
大规模生产集群验证
TKE 发行版提供与腾讯云 TKE 相同的可安装版本和开源代码,功能和稳定性经过大量企业用户、公有云及自研云锤炼。用户可以使用提供的源代码和编译工具进行构建和部署。
无缝集成公有云TKE
TKE 发行版可支持用户在自建或者托管机房,物理机或者虚机上,运行与腾讯云 TKE 完全一致的 K8S 服务。并且可以无缝与腾讯云 TKE 集成,组建混合云集群。
更长支持周期
TKE 发行版的支持周期比社区版更长。在社区版停止支持后,TKE 发行版将继续得到支持,包括重要问题以及安全漏洞的修复。
更多实用能力增强
TKE 发行版结合腾讯自身业务特点和经验,针对部分场景(弹性扩容、离在线混部、资源隔离等)实现了能力增强。并且 TKE 发行版紧跟社区趋势,主导或深度参与社区 KEP 设计与实现。对于有实用价值 KEP 会先于社区支持,让用户提前享受到云原生技术进步。
功能增强
支持弹性扩容到腾讯云 EKS 服务
EKS 是腾讯云的弹性容器服务,用户无须购买节点即可部署工作负载,非常适合突发等临时的扩容需求。在需要临时扩容时,可以秒级快速把工作负载从 TKE 发行版集群扩容到 云上 EKS,应对突发和临时流量,提高资源利用率,降低运维和资金成本。
支持动态修改 kube-controller-manager 日志级别
在运维 K8S 生产集群中,我们一般设置较低日志级别(0~2),而在问题排查时我们需要提高日志级别。TKE 发行版实现了动态修改日志级别功能,从而避免因组件重启导致关键日志丢失。目前 K8S 官方版本支持 kube-apiserver、kubelet 和 kube-scheduler 设置,TKE 发行版额外实现了 kube-controller-manager 组件的日志动态调级。
该 feature 已提交社区:https://github.com/kubernetes/kubernetes/pull/98262
支持 Memory QoS with cgroups v2 特性(进行中)
Memory QoS with cgroups v2 是 TKE 团队设计实现的内存 QoS 功能,它利用 v2 memory controller 中 memory.min/memory.high
为 pod/container/node 提供全方位的内存保护。
目前该 KEP 已被 K8S 社区接受,预计在 v1.22 中实现 alpha 版。TKE 发行版会先于社区支持该特性,为用户 Pod、集群节点等提供更好的内存保护。
Memory QoS with cgroups v2:https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/2570-memory-qos
支持 TencentOS QoS 特性(进行中)
TencentOS 是腾讯针对云场景研发的 Linux 操作系统,专门针对容器场景提供了原生优先级支持及资源隔离增强,包括 CPU、内存、磁盘 IO 和网络 IO 等。TKE 发行版内置了对 TencentOS QoS 特性的支持,将 K8S 资源隔离和 QoS 分级 offload 到 TencentOS 实现。该特性在开发中,预计下个版本支持。
TencentOS:https://github.com/Tencent/TencentOS-kernel
稳定性增强
TKE 发行版依据大量生产经验,修复众多生产级 bug,支持千万核集群在腾讯稳定运行。主要 bugfix 包括:
1. 修复使用 containerd 时集群监控指标缺失问题
在 containerd 作为 container runtime 的集群中,kubelet 没有正确设置采集指标的containername,导致不能被归类和分析。TKE 发行版本修复了该问题,提交社区 PR:https://github.com/kubernetes/kubernetes/pull/90260
2. 修复删除 Pod 后立即创建并调度到同一个节点可能导致无法挂载成功的问题
K8S statefulset pod 在删除后重新创建,如果 pod 调度到同一个节点,会因为卷挂载失败而导致启动失败。TKE 发行版修复了该问题,提交社区 PR:https://github.com/kubernetes/kubernetes/pull/72914
3. 修复 CentOS 下创建容器会导致 cgroup 泄露的问题
TKE 发行版关闭了 kernel memory accouting 以避免 cgroup 泄露。
4. 修复 kubectl describe deployment <xxx>
NewReplicaSet 显示为 <none> 的问题
kubectl describe
在获取 deployment 对象后,会对 volume 进行排序,有时会导致无法匹配到最新 replicaset。TKE 发行版修复了该问题,提交社区 PR:https://github.com/kubernetes/kubernetes/pull/97752
5. 修复 Pod 容器镜像有多 tag 时,Pod status 镜像 tag 会不匹配问题
Pod 容器一镜像有多 tag 时,会导致 pod spec 容器镜像 tag 与 kubelet 上报不符。TKE 发行版 backport 社区 PR 修复此问题:https://github.com/kubernetes/kubernetes/pull/94833
6. 修复 aws credential provider 导致 kubelet 启动 20s 延迟问题
AWS credential provider 在初始化时会尝试连接 AWS 元数据服务,会导致非 AWS 集群出现最长 20s 启动延迟。TKE 发行版上报了 bug https://github.com/kubernetes/kubernetes/issues/92162,并 backport 社区 PR https://github.com/kubernetes/kubernetes/pull/93260
7. 修复 Ubuntu16.04 lxcfs 升级造成 pod 退出问题
K8S 集群在 Ubuntu16.04 下默认安装低版本 lxcfs,在对 lxcfs 升级后,会导致 pod 无法正常运行。原因是低版本 lxcfs 挂载 cgroupfs,kubelet 在启动时会使用 lxcfs 已挂载 cgroupfs,而非系统 /sys/fs/cgroup。lxcfs 在升级新版本后,旧 cgroupfs 会被解挂,导致 kubelet 对 pod cgroup 操作失败。TKE 发行版修复了该问题。
如何使用 TKE 发行版
TKE 发行版提供了安装工具脚本,帮助用户自动编译和构建发行版镜像,极大降低了 TKE 发行版的使用门槛。
编译和构建流程包括:
- 拉取 patch 代码
git clone [https://github.com/tkestack/tke-k8s-distro](https://github.com/tkestack/tke-k8s-distro)
- 编译组件
make
或者
make \<release\>
目前仅支持1.20版本。
- 组件产出
编译过程中,源码路径为_src/<release>
,编译产出路径为 _output/<release>
,组件包括kubeadm
, kube-apiserver
, kube-controller-manager
, kubectl
, kubelet
, kube-proxy
, kube-scheduler
。
下一步
TKE 发行版的推出,使得用户线下 IDC 与腾讯云上 TKE 的融合成为可能。我们期望 TKE 发行版未来能成为混合云与多云的基石,让用户在混合云环境中,可随时随地享受到和云上 TKE 一致的体验。
TKE 发行版未来会以开源方式运作,用户可以通过 GitHub 提供任何反馈,不仅限于 Issue 和 PR。
GitHub:[https://github.com/tkestack/tke-k8s-distro](https://github.com/tkestack/tke-k8s-distro)