容器场景要选择什么 Linux 版本?
容器的底层实现深度依赖于内核的众多特性,如 overlay 文件系统,namespace, cgroup 等,因此内核的功能和稳定性,在很大程度上,决定了整个容器PaaS平台的功能和稳定性。从 TKE 上线三年多以来,上万集群,数十万个节点的运营经验来看,内核问题约占所有节点问题的三分之一。
那么容器场景选择哪个Linux版本最好呢?在腾讯云,这个答案是 Tencent Linux。

这时候大家应该会有很多的疑问,接下来的 FAQ 会尽力解答大家的疑问。
Tencent Linux是谁维护的? 基于什么发行版的?
是腾讯内核和虚拟化团队负责维护的。Tencent Linux 2.4 基于CentOS 7, 用户态软件包保持与最新版 CentOS 7 兼容,CentOS 7 版本的软件包可以直接在 Tencent Linux 2.4 中使用
Tencent Linux跟CentOS有什么区别?
关键的区别在内核版本,本文后面会详细介绍。 用户态有少量调整,如 YUM 源的配置等,详情请参考官方介绍文档:https://cloud.tencent.com/document/product/213/38027
内核是什么版本?
Tencent Linux 2.4 目前是4.14内核。
代码和 rpm 包在 GitHub 可以获取: https://github.com/Tencent/TencentOS-kernel。
年底会推出5.4版本。
Tencent Linux跟TKE的Optimized镜像是什么关系?
它们的内核是一样的,但Tencent Linux 2.4 是CVM公共镜像, TKE Optimized镜像是市场镜像。
TKE将使用Tencent Linux2.4来替代CentOS 7.6 TKE Optimized以及Ubuntu18.04 TKE Optimized。已经在使用CentOS 7.6 TKE Optimized和Ubuntu18.04 TKE Optimized的集群还可以继续使用,但以后新建集群将不再支持这两种镜像。
预计11月下旬起,TKE用户可以自行在控制台操作,将集群新创建的节点的OS镜像切换为Tencent Linux2.4,操作入口如下图(把操作系统修改为Tencent Linux2.4):

相比 CentOS 和 Ubuntu 等发行版有什么优势?
主要优势如下, 后文会详细介绍:
- 经过腾讯大量内部业务多年的验证和打磨。
- 顶级内核专家团队的支持。
- 包含一些关键的性能优化和针对容器场景的定制特性。
腾讯内部业务多年的验证和打磨
Tencent Linux 从 2010 年启动研发,在腾讯内部已经上线运营了 10 年,总部署量已经是百万级,在腾讯内部 Linux 系统里占比 99%,覆盖了腾讯所有的业务,同时腾讯有着国内最种类繁多的业务生态,从社交,游戏,到金融支付,AI, 安全等, 所以对底层操作系统的稳定性,性能,兼容性等都有更强的要求。
对于容器场景来讲,腾讯大量核心业务几乎已经部分或全部容器化,例如微信所有的逻辑业务全部容器化, 针对微信业务特点,进行系列优化,顺利保障了每年春节的红包高峰运营,同时在数据安全方面,也跟微信紧密合作,提供解决方案。
内核专家团队的支持
目前有三十多位全职内核专家为这个内核版本提供支持。其中有 kvm 维护者,还有很多内核网络,存储,cgroup,调度等各个子系统的专家。
支持力度也体现在版本更新节奏和热补丁服务。
从版本记录(https://github.com/Tencent/TencentOS-kernel/releases) 可以看到,从 7 月到 10 月, Tencent Linux 4.14 内核系列发布了 5 个版本。腾讯内部业务和腾讯云外部客户碰到的绝大多数问题,都能及时得到定位和修复。
另外我们针对一些重要的修复,会提供内核热补丁的在线修复方式。热补丁的安装和生效,不需要重启机器,在不中断客户业务的情况下,提升客户业务的时延 SLA。
对于漏洞修复,Tencent Linux 有着全套的热补丁方案,包括:应用程序级热补丁,内核级热补丁等。每年发布 100 多个热补丁。 大多数漏洞在一周内提供修复方案。
性能优化
Tecent Linux 在根据内部与外部的用户在大规模落地实践中遇到的问题,针对容器场景也做了大量性能优化,包括但不限于:
- 解决 IPVS 模式高并发场景下,连接复用引发连接异常的问题 (#81775)。
- 解决 IPVS 模式在高配节点 (核数多) 下 IPVS 规则过多引发网络毛刺的问题。
- 解决在容器密集场景下(单节点上容器数量较多),cAdvisor 读取 memcg 陷入内核态过久引发网络毛刺的问题。
- 解决大 Pod (占用核数多,单核占用高) 在高配节点 (核数多) 场景下,CPU 负载均衡引发网络毛刺的问题。
- 解决高并发场景下的 TCP 连接监控(比如单独部署 cAdvisor 配置监控 TCP 连接) 引发网络周期性抖动问题。
- 优化网络收包软中断,提升网络性能。
这些针对各种容器场景的优化效果非常显著,以第 3 点为例,ping 时延监控效果图如下 (11:00 之后是优化后):

容器定制特性
容器资源展示隔离
很多 golang, java 程序的高效运行依赖于正确获取进程可用的 CPU 和内存资源。但这类程序在容器中获取到的是节点的 CPU 和内存资源, 与实际容器所分配的资源并不匹配,往往会造成进程的线程池等参数不合理,从而带来问题。
社区主流的解决方案是通过部署 FUSE 实现的 LXCFS 来实现/proc/cpuinfo, /proc/meminfo等资源展示按容器隔离。这个方案需要在节点部署 LXCFS 文件系统, 也需要往 POD sepc 中插入相关 volume 和挂载点的配置。详情可以参考:Kubernetes Demystified: Using LXCFS to Improve Container Resource Visibility
Tencnet Linux内核中实现了类似 LXCFS 特性,用户无需在节点部署 LXCFS 文件系统, 也无需修改 POD spec。只需在节点开启一个全局开关(sysctl -w kernel.stats_isolated=1), 容器中读取 /proc/cpuinfo, /proc/meminfo 等文件获取的就是按容器隔离的,就是这么简单。
另外,考虑到有些特殊容器, 比如节点监控组件, 可能就是需要读取节点级的信息。为了解决这个问题,专门增加了容器级的开关kernel.container_stats_isolated。在主机级开关开启的情况下,只需要在容器的启动脚本里面,关闭容器级的开关(sysctl -w kernel.container_stats_isolated=0),以后在这个容器里面读取 /proc/cpuinfo, /proc/meminfo 等文件获取的就是主机的信息了。(注: 容器级开关必须在容器中设置,才能对本容器生效)
请参考详细使用文档:容器内CPU、内存、进程、磁盘等信息隔离
更多内核参数的隔离
- net.ipv4.tcp_max_orphans
- net.ipv4.tcp_workaround_signed_windows
- net.ipv4.tcp_rmem
- net.ipv4.tcp_wmem
- vm.max_map_count
这些内核参数都是业务经常需要定制修改的。但是社区内核里面并没有对这些参数做 namespace 化隔离。一个容器对以上参数的修改,会对主机以及所有其他容器都起作用。 Tencent Linux根据内外部客户的需求,实现了这些内核参数的 namespace 化隔离,业务容器可以放心的对这些参数进行个性化设置而不用担心对其他业务的干扰了。
容器缺省内核参数优化
在高并发的情况下,可能会发生半连接队列满而丢包, 可以通过调大 net.core.somaxconn 来缓解问题。但是容器网络 namespace 里面的 net.core.somaxconn 缺省值只有 128,而且是代码写死的。 在 Tencent Linux 内核中,我们把这个缺省值调整到 4096, 从而可以减少高并发情况下半连接队列满的丢包问题。
在 TKE 如何使用 Tencent Linux
如果希望 TKE 集群的节点使用 Tencent Linux 的操作系统,需要在创建 TKE 集群时,操作系统选择 Tencent Linux 的:

注: Tencent Linux 除了支持普通的云服务器机型外,还支持黑石物理机与 Nvidia GPU 的机型。
参考资料
【腾讯云原生】云说新品、云研新术、云游新活、云赏资讯,扫码关注同名公众号,及时获取更多干货!!
容器场景要选择什么 Linux 版本?的更多相关文章
- 使用Linux的alternatives命令替换选择软件的版本
上周在安装搜索引擎Elasticsearch时,要求安装比较新的java 版本,我选择了java 1.8.0,安装java 成功后使用java -version 发现使用的版本仍旧是1.6.0, 查询 ...
- 如何选择适合自己的Linux版本
如何选择适合自己的Linux版本: 1.Linux桌面系统,首选Ubuntu; 2.服务器端的Linux系统,首选RHEL或CentOS,这两种中首选CentOS,如果公司有钱,不在乎成本也可以选择R ...
- 这么多Linux版本,你究竟该怎么选择?
Linux有非常多的版本,比如世面上常见的有 Ubuntu.RedHat.Fedora.Centos等等,这么多的版本我们究竟该选哪一个呢?今天我带大家对各个版本进行一下分析和比较,帮助大家来做出更好 ...
- 如何选择linux 版本
1.linux 桌面系统,首先选择Ubuntu2.服务器断的linux系统,首选RHEL 或者Centos3.如果对安全性能比较高,选择Debian 或FreeBSD4.需要使用数据库高级服务和电子邮 ...
- .NET Core开发日志——Linux版本的SQL Server
SQL Server 2017版本已经可以在Linux系统上安装,但我在尝试.NET Core跨平台开发的时候使用的是Mac系统,所以这里记录了在Mac上安装SQL Server的过程. 最新的SQL ...
- .NET 微服务 1. Docker 容器简介和选择
容器特点 1. 容器可以将应用程序的依赖性和配置(抽象为 Mainfest 文件并部署)打包成一个容器镜像,可以让多次部署操作中的环境保持一致 2. 可以让IT人员很少或者不做修改就可以跨环境部署软件 ...
- Docker商业版受限,胖容器是个选择
前情概要 8月13日,Docker 公司更新了网站服务协议,条款申明,禁止禁运国家和被列入「美国实体清单」的组织和个人使用带有该服务协议链接的 Docker 网站和所有相关网站.这一更新协议迅速引起了 ...
- 使用VS+VisualGDB编译Linux版本RCF
RPC通信框架--RCF介绍中说了,RCF本身是支持跨平台的,其代码放到Linux平台,是可以通过gcc.make等工具,编译通过的. 官方提供的源码中,只有cmake编译脚本,并没有提供Makefi ...
- 最稳定 性能最好 的 Linux 版本?
Ubuntu太他妈不稳定了,简直是一坨屎 CentOS.Ubuntu.Debian三个linux比较异同http://blog.csdn.net/educast/article/details/383 ...
随机推荐
- 使用Android进行VR图像处理
Source code at GitHub 介绍 VR或360图像,可以在耳机或在像谷歌街景这样的网站上观看是标准的JPG图像.你可以使用简单的Android图形处理技术,通过单独的移动设备或内部运行 ...
- devops构建IT服务供应链
1. devops构建IT服务供应链 1) 什么是devops devops是 "开发" 和"运维"的缩写 devops是一组最佳实践强调(IT研发.运维. ...
- 网络IO模型-异步选择模型(Delphi版)
其实关于这个模型,网络上也有一个案例说明 老陈使用了微软公司的新式信箱.这种信箱非常先进,一旦信箱里有新的信件,盖茨就会给老陈打电话:喂,大爷,你有新的信件了!从此,老陈再也不必频繁上下楼检查信箱了, ...
- tomcat 验证码显示问题
在Web开发中使用验证码时可能遇到的问题:java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11GraphicsE ...
- python中的对文件的读写
简单的实例 open函数获取文件,w是写权限,可以对文件进行io操作 file=open('C:/Users/Administrator/Desktop/yes.txt','w') file.writ ...
- 1T数据快速排序!十种经典排序算法总结
1 冒泡排序 每次循环都比较前后两个元素的大小,如果前者大于后者,则将两者进行交换.这样做会将每次循环中最大的元素替换到末尾,逐渐形成有序集合.将每次循环中的最大元素逐渐由队首转移到队尾的过程形似&q ...
- 【C语言C++编程学习笔记】一种很酷的 C 语言技巧,灵活运用编程技巧让你写代码事半功倍!
C语言常常让人觉得它所能表达的东西非常有限.它不具有类似第一级函数和模式匹配这样的高级功能.但是C非常简单,并且仍然有一些非常有用的语法技巧和功能,只是没有多少人知道罢了. ☆ 指定的初始化 很多人都 ...
- 【应用程序见解 Application Insights】使用Azure Monitor Application Insights Agent获取Azure VM中监控数据及IIS请求指标等信息
问题情形 为了使用Application Insights也可以监控Azure VM中的相关性能数据,如CPU, Memory,IIS Reuqest等信息,可以在VM中开始一个一个扩展插件: Azu ...
- Linux入门到放弃之八《任务计划管理》
任务计划管理 1.每周一下午5:50将/data目录下的所有目录和文件归档并压缩为:backup.tar.gz 放在/home/backup目录下. 先新建/data目录,并在目录中随意生成几个文件 ...
- Python语言应用解析,如何入门学Python?
Python在机器学习人工智能领域非常流行,可以说是算法工程师的标配编程语言.Python语言广泛应用在web开发.大数据开发.人工智能开发.机器学习.后端开发等领域之中,近几年Python语言的趋势 ...
