查看原文
其他

腾讯云云原生混合云-TKE发行版

​徐蓓 李波 腾讯云原生 2021-07-13

徐蓓,腾讯云专家工程师,深耕云计算、K8s、离在线混部领域,K8s 社区贡献者,Memory QoS with cgroups v2 KEP 作者。

李波,腾讯云后台研发工程师,负责 TKE 版本发布及k8s技术支持。

背景

TKE 发行版(TKE Kubernetes Distro)是由腾讯云 TKE 发布的 K8s 发行版本,用于帮助用户创建安全可靠的 K8s 集群。用户可依托 TKE 发行版在自建或者托管机房、物理机或者虚机上,运行与 TKE 完全一致的 K8s 服务。TKE 发行版集群可无缝与腾讯云 TKE 集成,进而组建混合云。用户可通过 TKE 发行版集群将云下业务扩展到云上,利用腾讯云 TKE、EKS 等云服务弹性能力,为业务提供强大的资源保障。

目前 TKE 发行版已在 GitHub 开源:[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 没有正确设置采集指标的 container name,导致不能被归类和分析。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 发行版的使用门槛。

编译和构建流程包括:

1. 拉取 patch 代码


git clone [https://github.com/tkestack/tke-k8s-distro](https://github.com/tkestack/tke-k8s-distro)

2. 编译组件


make

或者


make \<release\>

目前支持 1.20 版本。

3. 组件产出

编译过程中,源码路径为_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】




往期精选TKE系列文

① 手把手教你在容器服务 TKE 中使用动态准入控制器

② 腾讯云容器服务 TKE 拿下新加坡 MTCS 最高级别安全认证

③ TKE 容器网络中的 ARP Overflow 问题探究及其解决之道

④ 一文读懂 TKE 及 Kubernetes 访问权限控制

精彩持续更新中。。。



    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存