容器场景要选择什么 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 ...
随机推荐
- dockerfile解析过程
什么是dockerfile? DockerFile是用来构建docker镜像的文件,是由一系列命令和参数组成. 构建步骤? 1.编写dockerfile文件 2.docker build 3.dock ...
- springboot1.5和jpa利用HikariCP实现多数据源的使用
背景 现在已有一个完整的项目,需要引入一个新的数据源,其实也就是分一些请求到从库上去 技术栈 springboot1.5 (哎,升不动啊) 思路 两个数据源,其中一个设置为主数据源 两个事物管理器,其 ...
- 多测师讲解自动化测试 _RF关键字001_( 中)_高级讲师肖sir
1.关键字如下 1.1Get Text 1.2Get Value 2.#上下滑动(滚动条) Open Browser http://www.jd.com gc Maximize Browser Win ...
- MeteoInfoLab脚本示例:利用比湿、温度计算相对湿度
利用比湿和温度计算相对湿度的函数是qair2rh(qair, temp, press=1013.25),三个参数分别是比湿.温度和气压,气压有一个缺省值1013.25,因此计算地面相对湿度的时候也可以 ...
- Django的安装和项目的启动
一.安装(安装最新LTS版): 1.命令行安装 pip install django==1.11.18 -i 源 2.pycharm 安装 二.创建项目 1.命令行创建 下面的命令创建了一个名为 ...
- spring boot:actuator的安全配置:使用spring security做ip地址限制(spring boot 2.3.2)
一,actuator有哪些环节要做安全配置? actuator是应用广泛的监控工具, 但在生产环境中使用时,需要做严格的安全保障, 避免造成信息泄露等严重的安全问题 actuator可以采取的安全措施 ...
- python保存图片
#coding=utf-8 import requests url ="https://images.pexels.com/photos/1181767/pexels-photo-11817 ...
- 【Flutter 混合开发】与原生通信-MethodChannel
Flutter 混合开发系列 包含如下: 嵌入原生View-Android 嵌入原生View-iOS 与原生通信-MethodChannel 与原生通信-BasicMessageChannel 与原生 ...
- flutter——android报错建议Suggestion: add 'tools:replace="android:label"'
问题: 安装了一个新包,android出现了报错,建议add 'tools:replace="android:label"'. 原因: 项目application的label属性冲 ...
- poj2187 Beauty Contest (凸包 + 旋转卡壳)
Beauty Contest Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 38349 Accepted: 11851 ...