腾讯云容器服务(Tencent Kubernetes Engine ,TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务。腾讯云容器服务完全兼容原生 kubernetes API ,扩展了腾讯云的云硬盘、负载均衡等 kubernetes 插件,为容器化的应用提供高效部署、资源调度、服务发现和动态伸缩等一系列完整功能,解决用户开发、测试及运维过程的环境一致性问题,提高了大规模容器集群管理的便捷性,帮助用户降低成本,提高效率。容器服务提供免费使用,涉及的其他云产品另外单独计费。

腾讯云容器服务(Tencent Kubernetes Engine,TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务。容器可以简单理解为一个轻量、小型的虚拟机,一个容器里面建议只运行一个业务程序。

容器相比传统的虚拟机有如下几点优势:

  • 一是容器比虚拟机要小的多,镜像小,传统的一个虚拟机的镜像小的几G,大的上百G,而容器的镜像往往都是几十MB,轻量级的容器镜像意味着可以更方便的进行传输。

  • 二是可以更细粒度的划分CPU和内存等计算资源,虚拟机最小的也是1C1G,而容器可以划分成更小的单位比如 0.1核,128 MiB,非常适用与平时资源使用率不高的业务,因为容器做好了资源的隔离,通过容器在一台机器上混布,可以极大的提高资源利用率,降低成本。

  • 三是容器启动时间比虚拟机要快,虚拟机的启动时间是分钟级的,而容器理论上在1秒之内能启动成百上千个。非常适用于业务量动态变化快的业务。

容器技术改变应用交付,在以前应用程序的交付是通过源码或可执行文件交付,同时必须包含一个如何部署应用程序的说明文档。往往部署一个稍复杂点的程序,都需要两到三天的时间。容器可以将应用程序和依赖环境打包起来,只要应用程序的容器在一个环境运行起来,在其他任何环境下也能运行,从交付代码变成交付容器,从两到三天的时间缩短到 5 分钟,极大提高交付效率。

您可以使用控制台、命令行和 SDK 等多种管理工具来启动、监控或终止您的容器服务。


特色

基于 Kubernetes

腾讯云容器服务基于原生的 Kubernetes 进行适配和功能增强的,Kubernetes 是一款生产级别的容器管理系统,虽然容器有非常多的优点,但要将大量的容器管理起来尤为困难,而 Kubernetes 作为开源的软件,在 Docker 技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,能够帮助用户快速实现应用程序容器化的部署、扩展和管理。
对 kubernetes 熟悉或喜欢命令行的用户,可以通过 kubernetes 的 API 或者 Kubectl 直接操作 TKE 所创建的集群,同时腾讯云 TKE 适配了 CVM、CLB、CBS 的插件,你无须为各自插件问题而困扰。如果您不了解 kubernetes,您可以通过我们的入门指南,进行快速入门,登录到控制台实现应用程序容器化、微服务化。

Kubernetes 的优势

Kubernetes 采用优雅的软件工程设计,通过模块化、微服务的方式,实现模块化设计,使得用户可以根据自己的使用场景,通过灵活插拔方式,采用自定义的网络、存储、调度、监控、日志等模块。
Kubernetes 项目的社区秉承开源、开放的心态,可以支持容器、网络、存储实施方案。
对比其他容器编排工具 Swarm 和 Mesos 如下:

  • 对比 Swarm:从功能上 Kubernetes 的概念更多,分层更细,功能更多,支持一些高级功能如秘钥管理、配置管理、自动拓容等。

  • 对比 Mesos: Mesos 注重资源调度,而 Kubernetes 则更是面向分布式应用、微服务和大规模集群管理(其中融入了谷歌独有的“集群管理”不仅仅是资源调度和编排的理念)。

功能

容器服务提供多种强大功能,包括集群管理、服务管理、配置管理和镜像管理。

集群管理

  • 支持集群动态伸缩,节点支持升降配。

  • 集群内节点跨可用区管理部署,服务内容器跨可用区调度。

  • 集群内节点监控指标丰富,支持自定义集群告警策略。

服务管理

提升服务部署效率

  • 通过模板控制服务版本,镜像保证环境一致,使服务迁移扩展更加迅速。

  • 支持服务发现,可通过负载均衡域名或服务名称加端口访问服务,可避免服务后端变化时 IP 变更带来的影响。

  • 支持微服务化,降低代码维护成本,适应快速变化的业务需求。

动态扩缩服务

  • 服务灵活水平扩展,应对业务快速变化。

  • 秒级部署服务容器,滚动升级不中断业务更新服务。

安全运行服务

  • 容器异常自动恢复,服务内容器跨地域部署,可快速迁移。

  • 有状态服务数据支持多种形式的持久化存储,保证用户数据安全。

快速运维服务

  • 丰富的监控数据,分析服务健康快速响应。

  • 支持自定义监控告警,及时获取服务状态信息。

配置管理

管理不同环境业务配置

  • 支持部署相同应用的不同环境,方便更新和回滚应用。

  • 支持多版本,只支持新增版本,不支持修改版本。

快捷便利

  • 支持将配置以文件形式导入容器,简单快捷。

镜像管理

dockerhub 官方镜像管理

  • 定期同步 dockerhub 官方镜像。

  • 提供 dockerhub 官方镜像加速拉取。

私有镜像管理

  • 提供安全、可靠的私有镜像仓库。

  • 内网快速实现镜像的上传下载。

  • 全地域、外网获取镜像。

  • 在保证集群内运行稳定的服务前提下,容器细粒度地划分宿主机资源,尽量多的跑容器,提高集群的资源利用率。

  • 腾讯云容器服务(Tencent Kubernetes Engine,TKE)是高度可扩展的高性能容器管理服务,您可以在托管的云服务器实例集群上轻松运行应用程序。使用该服务,您将无需安装、运维、扩展您的集群管理基础设施,只需进行简单的 API 调用,便可启动和停止 Docker 应用程序,查询集群的完整状态,以及使用各种云服务。您可以根据资源需求和可用性要求在集群中安排容器的置放,满足业务或应用程序的特定要求。

  • 腾讯云容器服务基于原生 Kubernetes 提供以容器为核心的解决方案,解决用户开发、测试及运维过程的环境问题、帮助用户降低成本,提高效率。腾讯云容器服务完全兼容原生 Kubernetes API,并扩展了腾讯云的云硬盘、负载均衡等 Kubernetes 插件,同时以腾讯云私有网络为基础,实现了高可靠、高性能的网络方案。

  • 名词解释

  • 使用腾讯云容器服务,会涉及到以下基本概念:

  • 集群:是指容器运行所需云资源的集合,包含了若干台云服务器、负载均衡器等云资源。

  • 应用:由多个服务组成一个完整的应用程序,可以通过模板快速部署。

  • 服务:由多个相同配置的实例(Pod)和访问这些实例(Pod)的规则组成的微服务。

  • 配置项:配置项是多个配置的集合,帮您管理不同环境和不同业务。

  • Ingress:Ingress 是用于将外部 HTTP(S) 流量路由到服务(Service)的规则集合。

  • 镜像仓库:用于存放 Docker 镜像,Docker 镜像用于部署容器服务。

  • 实例(Pod):由相关的一个或多个容器构成一个实例,这些容器共享相同的存储和网络空间。

  • 使用流程

  • 如下图所示,您只需要三步即可运行应用程序。

  • 创建集群

  • 创建服务/应用

  • 运行服务/应用

  • www.ksyuwei.cn

  • 产品定价

  • 容器服务暂不收取服务本身费用,用户只需要按实际使用的云资源进行付费。关于收费模式和具体价格,请参阅 计费说明。

  • 相关服务

  • 通过购买若干个云服务器组成容器服务集群,容器运行在云服务器中。有关更多信息,请参阅 云服务器产品文档。

  • 集群可以建立在私有网络下,集群内主机可以分配在不同可用区的子网下。有关更多信息,请参阅 私有网络产品文档。

  • 可以使用负载均衡,自动分配横跨多个云服务实例的客户端请求流量,转发至主机内容器。有关更多信息,请参阅 负载均衡产品文档。

  • 监控容器服务集群和容器实例的运行统计数据,可使用云监控。有关更多信息,请参阅 云监控产品文档。

编排优势

基于 Kubernetes

腾讯云容器服务是基于 Kubernetes(k8s)实现的,k8s 是 Google 开源的容器集群管理系统。在 Docker 技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。

Kubernetes 的优势

  • Kubernetes 采用优雅的软件工程设计,通过模块化、微服务的方式,实现模块化设计,使得用户可以根据自己的使用场景,通过灵活插拔方式,采用自定义的网络、存储、调度、监控、日志等模块。

  • Kubernetes 项目的社区秉承开源、开放的心态,可以支持容器、网络、存储实施方案。

腾讯云容器服务 TKE 对比自建容器服务

优势腾讯云容器服务(TKE)自建容器服务
简单易用简化集群管理
  • 腾讯云容器服务提供超大规模容器集群管理、资源调度、容器编排、代码构建,屏蔽了底层基础构架的差异,简化了分布式应用的管理和运维,您无需再操作集群管理软件或设计容错集群架构,因此也无需参与任何相关的管理或扩展工作。

  • 您只需启动容器集群,并指定想要运行的任务即可,腾讯云容器服务帮您完成所有的集群管理工作,让您可以集中精力开发 Docker 化的应用程序。

自建容器管理基础设施通常涉及安装、操作、扩展自己的集群管理软件、配置管理系统和监控解决方案,管理复杂。
灵活扩展灵活集群托管,集成负载均衡
  • 您可以使用容器服务灵活安排长期运行的应用程序和批量作业。您还可以使用 API 获得最新的集群状态信息,以便集成您自己的自定义计划程序和第三方计划程序。

  • 腾讯云容器服务与负载均衡集成,支持在多个容器之间分配流量。您只需指定容器配置和要使用的负载均衡器,容器服务管理程序将自动添加和删除。另外腾讯云容器服务可以自动恢复运行状况不佳的容器,保证容器数量满足您的需求,以便为应用程序提供支持。

需要根据业务流量情况和健康情况人工确定容器服务的部署,可用性和可扩展性差。
安全可靠资源高度隔离,服务高可用
  • 容器服务在您自己的云服务器中启动,不与其他客户共享计算资源。

  • 您的集群在私有网络中运行,因此您可以使用您自己的安全组和网络 ACL,这些功能为您提供了高隔离水平,并帮助您使用云服务器构建高度安全可靠的应用程序。

  • 容器服务采用分布式服务架构,保证服务的故障自动恢复、快速迁移;结合有状态服务后端的分布式存储,实现服务和数据的安全、高可用。

自建容器服务因其内核问题及 Namespace 不够完善,租户、设备、内核模块隔离性都比较差。
高效镜像快速部署,业务持续集成
  • 腾讯云容器服务运行在您的私有网络中,高品质的 BGP 网络保证镜像极速上传下载,轻松支持海量容器秒级启动,极大程度降低了运行开销,使您的部署更加专注于业务运行。

  • 您可以在腾讯云容器服务上部署业务,开发人员在 GitHub 或其他代码平台提交代码后,容器服务可立即进行构建、测试、打包集成,将集成的代码部署到预发布环境和现网环境上。

自建容器服务的网络无保证,因此无法保证使用镜像创建容器的效率。
低成本容器服务免费
腾讯云容器服务没有任何附加费用,您可以在容器中免费调用 API 构建您的集群管理程序。您只需为您创建的用于存储和运行应用程序的云服务资源(例如云服务器、云硬盘等)付费。
需要投入资金构建、安装、运维、扩展自己的集群管理基础设施,成本开销大。

腾讯云容器服务 TKE 监控对比自建容器监控

腾讯云容器服务监控为容器集群、服务、实例提供数据收集和数据展示功能。使用容器服务监控,您可以查看集群、节点、服务、实例、容器等近30个指标的监控统计数据,验证集群是否正常运行并创建相应告警,监控指标覆盖面广,并且在持续增加中。

优势腾讯云容器服务(TKE)自建容器服务
指标完整涉及到集群,服务,容器,Pod(实例) 等近30个指标指标不完整,很多需要开发
搭建成本低创建集群时自带人工搭建,成本高
运维成本低平台助力运维,保证数据准确性人工维护
存储成本低每个指标免费保存3个月数据根据存储大小计算
扩展性高平台侧会不断完善和增加新的指标项需要技术人员大量投入开发新指标
告警
问题排查手段控制台可以方便查看容器 log, 并与 webshell 结合一键登录容器快速排查问题需要手动登录到容器或者机器排查

总体架构

本节介绍容器服务系统的设计和实现,产品架构如下图所示:
www.ksyuwei.cn

架构说明

  1. 腾讯云容器服务基于原生 Kubernetes 进行适配和增加, 支持原生 Kubernetes 能力。

  2. 提供了腾讯云的 Kubernetes 插件,帮助用户快速在腾讯云上构建 Kubernetes 集群。

  3. 腾讯云容器服务在 Kubernetes 上层,提供了集群管理、应用管理、CI/CD 等进阶能力。

模块说明

  1. 容器服务控制台和云 API:用户通过控制台、Kubectl 或 API 操作集群与服务。

  2. 镜像服务 CCR 模块:腾讯云提供的镜像服务模块,用户可以上传镜像,或将镜像下载到本地。

  3. 容器服务 TKE 模块:容器服务核心模块,包括集群的增删改查、服务的增删改查等。

微服务架构

微服务架构适用于构建复杂的应用,将单体式应用从不同纬度拆分成多个微服务,每个微服务的内容使用一个 docker 镜像管理。

腾讯云容器服务部署微服务特点及优势

  • 简化了集群管理,无须安装、管理操作集群。

  • 无缝衔接了腾讯云的计算、网络、存储、监控、安全能力,直接使用腾讯云 IaaS 能力。

  • 支持服务编排,服务粒度管理应用,简单易懂,资源高度隔离、服务高可用。

微服务架构如下图所示:
www.ksyuwei.cn

持续集成与持续交付

通过持续集成与持续交付提供优秀的 DevOps 环境,极大提高软件发布效率。

持续集成

强调开发人员提交了新代码之后,立即进行构建、(单元)测试。根据测试结果,您可以确定新代码和原有代码能否正确地集成在一起。

持续交付

在持续集成的基础上,将集成后的代码部署到运行环境。

优势

通过在腾讯云容器服务上部署服务,开发人员在 Git 或其他代码平台提交新代码后,可立即进行构建、测试、打包集成。在持续集成的基础上,将集成的代码部署到预发布环境和现网环境上。

持续集成与持续交付过程如下图所示:
www.ksyuwei.cn

业务快速上云

个人或企业业务迁移到腾讯云上,可选择腾讯云的容器服务来简化上云配置,简化集群管理,提升业务交付速率。
腾讯云容器服务让您一键单击创建服务,快速实现应用容器化部署,同时也可达到弹性扩缩、按需部署、高可用、易扩容、开发友好、降低人力成本的效果。如下图所示:
www.ksyuwei.cn

集群管理

通过腾讯云容器服务可简单高效地管理您的容器集群,整个过程安全可靠,能够无缝衔接腾讯云计算、存储、网络。

模块功能点
集群构成
  • 支持 CVM 所有机型,可以新增和添加已有主机

  • 集群内主机支持跨可用区部署

  • 支持包年包月、按量计费两种计费模式

  • 用户独占集群、VPC 安全隔离

  • 自定义集群网络,容器网络灵活配置

集群管理
  • 支持集群动态伸缩,节点升降配

  • 丰富的监控指标,支持自定义告警策略

Kubernetes 管理
  • 支持 kubernetes 多版本,提供版本升级功能

  • Kubernetes 证书管理,kubectl 直接操作集群

  • 控制台简单管理 Namespace

应用管理

通过腾讯云容器服务提供的应用管理功能,能够帮助您一键快速创建多个服务, 部署不同环境应用。

模块功能点
应用构成
  • 支持 TKE 多种服务类型

  • 支持 Kubernetes Deployment、DaemonSet 等多种资源

应用管理
  • 应用支持我的模板、模板市场快速创建

  • 支持更新应用实时对比查看

  • 应用内服务一键部署/停止

模板管理
  • 支持我的模板、模板市场

  • 模板支持一键复制

服务管理

服务管理为您提供高效的容器管理方案,支持服务的快速创建、快速扩缩容、负载均衡、服务发现、服务监控、健康检查等特性,您可以通过服务管理方便快捷的管理您的容器。

模块功能点
服务部署
  • 支持单实例多容器的服务部署

  • 支持多种服务访问方式

  • 支持服务内实例跨可用区部署

  • 支持设置亲和性和反亲和性调度

服务管理
  • 支持服务的滚动更新和快速更新

  • 支持服务的动态扩缩容

  • 支持远程登录到服务内容器

服务运维
  • 支持查看服务详细的监控指标

  • 支持查看服务内容器的 stdout 和 stderr 日志

  • 支持设置服务告警策略

  • 支持设置存活检查和就绪检查两种健康检查方式

  • 容器异常自动恢复

配置项管理

配置项用来规定一些程序在启动时读入设定,提供了一种修改程序设置的方法, 针对不同的对象可以使用不同的配置项。

模块功能点
配置项管理
  • 配置项支持多版本

  • 支持可视化和 YAML 两种编辑形式

配置项使用
  • 配置项以数据卷的形式挂载到容器目录

  • 配置项导入成环境变量

  • 配置项替代应用模板变量

镜像管理

腾讯云镜像仓库包含了 Dockerhub 官方镜像和用户私有镜像,镜像管理可以让您快速创建镜像、快速部署服务。

模块功能点
镜像管理
  • 支持创建私有镜像仓库

  • 支持查看和使用 DockerHub 镜像仓库

  • 支持查看和使用 TencentHub 镜像仓库

  • 支持管理多个镜像命名空间

镜像使用
  • 提供高速的内网通道用于镜像创建服务

  • 支持公网上传下载镜像

CI/CD
  • 支持设置私有镜像自动构建

  • 支持设置镜像的触发器

  • www.ksyuwei.cnwww.ksyuwei.cnwww.ksyuwei.cnwww.ksyuwei.cnwww.ksyuwei.cnwww.ksyuwei.cnwww.ksyuwei.cnwww.ksyuwei.cnwww.ksyuwei.cn

  • Cluster Autoscaler 与基于监控指标的弹性伸缩的节点扩缩容有什么不同?

  • Cluster Autoscaler 确保集群中的所有 Pod 都可调度,不管具体的负载;而基于监控指标的节点弹性伸缩在自动扩缩时不关心 Pod,可能会添加一个没有任何 Pod 的节点,或者删除一个有一些系统关键 Pod 的节点,例如 kube-dns。Kubernetes 不鼓励这种自动缩容机制,故 Cluster Autoscaler 与基于监控指标的弹性伸缩的节点互相冲突,请不要同时启用。

  • CA 和伸缩组的对应关系是什么?

  • 启用 CA 的集群会根据选择的节点配置,创建一个启动配置和绑定此启动配置的伸缩组。绑定后,将会在此伸缩组内进行扩缩容,扩容后的 CVM 自动加入集群。自动扩缩容的节点都是按量计费的。伸缩组的相关文档请参见 弹性伸缩文档。

  • 容器服务控制台手动添加的节点是否会 CA 缩容?

  • 不会,CA 缩容的节点只限于伸缩组内的节点。在 容器服务控制台 添加的节点不会加入到伸缩组中。

  • 弹性伸缩控制台是否可以添加或者移出云主机?

  • 不可以,不建议您在 弹性伸缩控制台 进行任何修改操作。

  • 扩缩容会继承所选节点的哪些配置?

  • 创建伸缩组时,需要选择集群内的一个节点作为参考来创建 启动配置,参考的节点配置包括:

  • vCPU

  • 内存

  • 系统盘大小

  • 数据盘大小

  • 磁盘类型

  • 带宽

  • 带宽计费模式

  • 是否分配公网IP

  • 安全组

  • 私有网络

  • 子网

  • 如何使用多个伸缩组?

  • 根据服务的重要级别、类型等特点,您可以通过创建多个伸缩组,为伸缩组设置不同的 label,从而指定伸缩组扩容出节点的 label,来对服务进行分类。

  • 扩缩容最大值可以设置为多少?

  • 目前腾讯云用户每个可用区均有30个按量计费类型 CVM 配额,如果希望伸缩组有超过 30 台按量计费的 CVM,请提交工单申请。
    具体配额请参见您当前可用区的云服务器 实例数及配额。另外弹性伸缩也有最大值的限制,其最大值为200。如果弹性伸缩超过最大值,请提交工单申请。

  • 集群启用缩容是否安全?

  • 由于在缩容节点时会发生 Pod 重新调度的情况,所以服务必须可以容忍重新调度和短时的中断时再启用缩容。建议您为您的服务设置 PDB。PDB 可以在任何时候指定一个处于运行状态的 Pod 集合副本的最小数量或者最小百分比。有了 PodDisruptionBudget,应用部署者可以保证同一时间内主动移除 Pod 的集群操作不会销毁过多 Pod,避免了因销毁过多 Pod 导致数据丢失、服务中断或者无法接受的服务降级等影响。

  • 节点上有哪些类型的 Pod 时不会被缩容?

  • 当您设置了严格的 PodDisruptionBudget 的 Pod 不满足 PDB 时,不会缩容。

  • Kube-system 下的 Pod。

  • 节点上有非 deployment,replica set,job,stateful set 等控制器创建的 Pod。

  • Pod 有本地存储。

  • Pod 不能被调度到其他节点上。

  • 节点满足缩容条件后多长时间会触发缩容?

  • 10分钟。

  • 节点 Not Ready 后多长时间会触发缩容?

  • 20分钟。

  • 多长时间扫描一次是否需要扩缩容?

  • 10秒。

  • 需要多长时间才可以扩容出 CVM?

  • 一般在10分钟内,相关弹性伸缩的说明文档请参见 弹性伸缩。

  • 为什么有 Unschedulable 的 Pod,却未进行扩容?

  • 请确认以下原因:

  • Pod 的请求资源是否过大。

  • 是否设置了 node selector。

  • 伸缩组的最大值是否已经达到。

  • 帐号余额是否充足(帐号余额不足,弹性伸缩无法扩容),以及配额不足等 其他原因。

  • 如何防止 Cluster Autoscaler 缩容特定节点?

    # 可以在节点的annotations中设置如下信息kubectl annotate node <nodename> cluster-autoscaler.kubernetes.io/scale-down-disabled=true
  • 扩缩容事件如何反馈给用户?

  • 用户可在弹性伸缩控制台查询伸缩组的伸缩活动,也可查看 k8s 的事件。在以下三种资源上都会有对应的事件:

  • kube-system/cluster-autoscaler-status config map

    • ScaledUpGroup - CA 触发扩容。

    • ScaleDownEmpty - CA 删除了一个没有运行 Pod 的节点。

    • ScaleDown - CA 缩容。

  • node

    • ScaleDown - CA 缩容。

    • ScaleDownFailed - CA 缩容失败。

  • pod

    • TriggeredScaleUp - CA 由于此 Pod 触发扩容。

    • NotTriggerScaleUp - CA 无法找到可扩容的伸缩组使得此 Pod 可调度。

    • ScaleDown - CA 尝试驱逐此 Pod 来缩容节点。

创建集群常见问题

创建集群时,云服务器可以不选取公网 IP 么?

云服务器可以不选取公网 IP,无公网IP的云服务器只能拉取镜像仓库下我的镜像,不能拉取 dockerhub 以及第三方镜像。
无公网 IP,但有外网带宽的云服务器可以通过绑定弹性 IP 来访问 Internet。

创建集群时,选择所属网络的作用是什么?

选择的所属网络和子网,是集群内云服务器的所在子网,用户可以通过添加不同的云服务器到不同可用区的子网下进行跨可用区容灾。

创建集群支持什么类型的机型?

支持所有按量计费的系统盘是云盘的机型。

当前容器服务宿主机支持什么操作系统?

当前支持 Ubuntu 16.04、CentOS 7.2。如有其他操作系统需求可提工单或通过 QQ 群联系我们。

扩展云服务器常见问题

扩展云服务器有什么限制?

只能选择当前集群所在的地域,但可以选择不同的可用区,允许集群跨可用区部署。

云服务器的数量有限制么?

有,用户所有按量计费云服务器不能超过用户配额,具体详情请看 云服务概览页。

销毁云服务器常见问题

销毁云服务器后,该主机下部署的容器怎么办?

销毁云服务器时,该主机下的容器等资源也会随之销毁。若某服务的容器数量小于期望运行的容器数量时,集群将会在其他主机上启动容器,直到运行的容器数量等于期望运行容器数量为止。

运行时组件说明

容器运行时(Container Runtime)是 Kubernetes(k8s) 最重要的组件之一,负责管理镜像和容器的生命周期。Kubelet 通过 Container Runtime Interface (CRI) 与容器运行时交互,以管理镜像和容器。

TKE 支持用户选择 containerd 和 docker 作为运行时组件:

  • Containerd 调用链更短,组件更少,更稳定,占用节点资源更少。 建议选择 containerd。

  • 当您遇到以下情况时,请选择 docker 作为运行时组件:

    • 如需使用 docker in docker。

    • 如需在 TKE 节点使用 docker build/push/save/load 等命令。

    • 如需调用 docker API。

    • 如需 docker compose 或 docker swarm。

    • 如需在集群内创建 GPU 应用。

Containerd 和 Docker 组件常用命令

Containerd 不支持 docker API 和 docker CLI,但是可以通过 cri-tool 命令实现类似的功能。

镜像相关功能DockerContainerd
显示本地镜像列表docker imagescrictl ps
下载镜像docker pullcrictl pull
上传镜像docker push
删除本地镜像docker rmicrictl rmi
查看镜像详情docker inspectcrictl inspecti
容器相关功能DockerContainerd
显示容器列表docker pscrictl ps
创建容器docker createcrictl create
启动容器docker startcrictl start
停止容器docker stopcrictl stop
删除容器docker rmcrictl rm
查看容器详情docker inspectcrictl inspect
attachdocker attachcrictl attach
execdocker execcrictl exec
logsdocker logscrictl logs
statsdocker statscrictl stats
POD 相关功能DockerContainerd
显示 POD 列表crictl pods
查看 POD 详情crictl inspectp
运行 PODcrictl runp
停止 PODcrictl stopp

调用链说明

  • Docker 作为 k8s 容器运行时,调用关系如下:
    kubelet --> docker shim (在 kubelet 进程中) --> dockerd --> containerd

  • Containerd 作为 k8s 容器运行时,调用关系如下:
    kubelet --> cri plugin(在 containerd 进程中) --> containerd

其中 dockerd 虽增加了 swarm cluster、 docker build 、 docker API 等功能,但也会引入一些 bug,而与 containerd 相比,多了一层调用。

Stream 服务

说明:

Kubectl exec/logs 等命令需要在 apiserver 跟容器运行时之间建立流转发通道。

Stream 服务在 Containerd 中的使用及配置

Docker API 本身提供 stream 服务,kubelet 内部的 docker-shim 会通过 docker API 做流转发。
Containerd 的 stream 服务需要单独配置:

[plugins.cri]
stream_server_address = "127.0.0.1"
stream_server_port = "0"
enable_tls_streaming = false

k8s 1.11 前后版本配置区别

Containerd 的 stream 服务在 k8s 不同版本运行时场景下配置不同。

  • 在 k8s 1.11 之前:
    Kubelet 不会做 stream proxy,只会做重定向。即 Kubelet 会将 containerd 暴露的 stream server 地址发送给 apiserver,并让 apiserver 直接访问 containerd 的 stream 服务。此时,您需要给 stream 服务转发器认证,用于安全防护。

  • 在 k8s 1.11 之后:
    k8s1.11 引入了 kubelet stream proxy, 使 containerd stream 服务只需要监听本地地址即可。

其他差异

容器日志及相关参数

对比项DockerContainerd
存储路径如果 Docker 作为 k8s 容器运行时,容器日志的落盘将由 docker 来完成,保存在类似/var/lib/docker/containers/$CONTAINERID 目录下。Kubelet 会在 /var/log/pods 和 /var/log/containers 下面建立软链接,指向 /var/lib/docker/containers/$CONTAINERID 该目录下的容器日志文件。如果 Containerd 作为 k8s 容器运行时, 容器日志的落盘由 Kubelet 来完成,保存至 /var/log/pods/$CONTAINER_NAME 目录下,同时在 /var/log/containers 目录下创建软链接,指向日志文件。
配置参数在 docker 配置文件中指定: 
"log-driver": "json-file", 
"log-opts": {"max-size": "100m","max-file": "5"}
  • 方法一:在 kubelet 参数中指定: 
    --container-log-max-files=5
    --container-log-max-size="100Mi" 

  • 方法二:在 KubeletConfiguration 中指定:
    "containerLogMaxSize": "100Mi",
    "containerLogMaxFiles": 5,

把容器日志保存到数据盘把数据盘挂载到 “data-root”(缺省是 /var/lib/docker)即可。创建一个软链接 /var/log/pods 指向数据盘挂载点下的某个目录。 
在 TKE 中选择“将容器和镜像存储在数据盘”,会自动创建软链接 /var/log/pods。

CNI 网络

对比项DockerContainerd
谁负责调用 CNIKubelet 内部的 docker-shimContainerd 内置的 cri-plugin(containerd 1.1 以后)
如何配置 CNIKubelet 参数 --cni-bin-dir 和 --cni-conf-dirContainerd 配置文件(toml):
[plugins.cri.cni]
bin_dir = "/opt/cni/bin"
conf_dir = "/etc/cni/net.d"

创建服务常见问题

服务的名称为什么不能重复?

服务名称是当前集群下的服务的唯一标识,服务之间可以通过服务名称+访问端口的形式互相访问。

创建服务能否使用非腾讯云或 dockerhub 镜像的第三方镜像?

您可以通过登录到主机执行 docker login 命令登录到第三方镜像仓库拉取。

使用外网服务的有什么前置条件?

确保集群内的云服务器拥有外网带宽,否则外网服务将创建失败。

内存限制,CPU 限制如何填写?

详情参考 容器服务资源限制说明。

创建服务时的特权级是什么意思?

开启该选项会使得容器内程序具有真正的 root 权限。在容器内程序需要进行高级系统操作时建议开启,如搭建 nfs 服务器。

更新服务容器数量常见问题

更新容器数量需注意哪些问题?

需确认 CPU、内存资源充足,否则容器将创建失败。

能否将容器数量设为0?

可以,通过将容器数量设置为0,保存服务配置并且释放资源占用。

更新服务配置常见问题

更新服务是否支持滚动更新?

支持滚动更新和快速更新两种方式。

删除服务常见问题

删除服务后服务创建的负载均衡会自动销毁么?

删除服务会将该服务下的所有容器和外网负载均衡一并销毁,请提前备份好数据。

服务运行常见问题

如何设置容器系统时间为北京时间?

容器默认使用 UTC 时间,使用容器时经常碰到容器系统时间和北京时间差8小时的问题,解决方法是在 dockerfile 中创建时区文件。

RUN echo "Asia/shanghai" > /etc/timezone;

Dockerhub 部分镜像如 ubuntu、php 和 busybox 等在容器服务里运行异常怎么办?

运行异常是因为没有设置启动命令或者默认的启动命令为 bash,导致容器执行完启动程序就退出了。要使容器一直运行,容器里 PID 为1的进程必须是常驻进程,否则 PID 为1的进程一结束容器就退出了。对于部分镜像如 centos 等,可以使用 /bin/bash 作为运行命令, -c sleep 800000 作为运行参数来创建服务,在控制台填运行参数时 -c 和 sleep 800000 必须放在两行。

目前已知的使用默认参数启动不了服务的镜像包括这些:clearlinux、ros、mageia、amazonlinux、ubuntu、clojure、crux、gcc、photon、java、debian、oraclelinux、mono、bash、buildpack-deps、golang、sourcemage、swift、openjdk、centos、busybox、docker、alpine、ibmjava、php和python。

开通镜像仓库常见问题

命名空间有什么作用?

命名空间是标识用户私人镜像的地址前缀。

镜像仓库的账户是什么?

默认是用户的腾讯云账号(QQ 号)。

开通时创建的密码忘记了怎么办?

可以通过控制台重置密码。

创建镜像常见问题

创建镜像有配额限制么?

默认配额是100个镜像,可以通过工单申请配额。

创建的镜像可以分享给其他用户么?

暂不提供该功能。

创建的镜像如何使用?

需要先上传可用的镜像版本,通过具体的镜像版本来创建服务。

删除镜像常见问题

如何删除镜像某一个版本?

直接在控制台指定删除某一个具体的版本。

在镜像列表删除镜像会删除该镜像的所有版本么?

是的,删除镜像时会删除该镜像的所有镜像版本,请提前备份好数据。

容器里面没有 bash,怎么办?

如果发现没有 bash,您可以在命令行中输入您想执行的命令,屏幕会显示该命令的返回结果。您可以将命令行看做一个缺少自动补全等其他功能的精简版 bash。建议您先执行安装 bash 的命令,再执行后续操作。

为什么运行 apt-get 安装软件如此之慢?

如果您觉得安装太慢,可能因为机器访问国外软件源速度过慢的原因。

Ubuntu 16.04系统

对于系统为 Ubuntu 16.04的容器,您可以运行以下命令,将 apt 的源设置为腾讯云的源服务器。即复制以下命令粘贴到终端执行。

cat << ENDOF > /etc/apt/sources.list
deb http://mirrors.tencentyun.com/ubuntu/ xenial main restricted universe multiverse
deb http://mirrors.tencentyun.com/ubuntu/ xenial-security main restricted universe multiverse
deb http://mirrors.tencentyun.com/ubuntu/ xenial-updates main restricted universe multiverse
deb-src http://mirrors.tencentyun.com/ubuntu/ xenial main restricted universe multiverse
deb-src http://mirrors.tencentyun.com/ubuntu/ xenial-security main restricted universe multiverse
deb-src http://mirrors.tencentyun.com/ubuntu/ xenial-updates main restricted universe multiverse
ENDOF

CentOS 7系统

对于系统为 CentOS 7的容器,您可以执行以下操作,直接修改源地址提高安装速度。

  1. 将以下代码复制并粘贴至容器内运行:

    cat << ENDOF > /etc/yum.repos.d/CentOS-Base.repo
    [os]
    name=Qcloud centos os - \$basearch
    baseurl=http://mirrors.tencentyun.com/centos1/\$releasever/os/\$basearch/
    enabled=1
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    [updates]
    name=Qcloud centos updates - \$basearch
    baseurl=http://mirrors.tencentyun.com/centos1/\$releasever/updates/\$basearch/
    enabled=1
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7#[centosplus]#name=Qcloud centosplus - \$basearch#baseurl=http://mirrors.tencentyun.com/centos1/\$releasever/centosplus/\$basearch/#enabled=1#gpgcheck=1#gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7#[cloud]#name=Qcloud centos contrib - \$basearch#baseurl=http://mirrors.tencentyun.com/centos1/\$releasever/cloud/$basearch/openstack-kilo/#enabled=1#gpgcheck=1#gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7#[cr]#name=Qcloud centos cr - \$basearch#baseurl=http://mirrors.tencentyun.com/centos1/\$releasever/cr/\$basearch/#enabled=1#gpgcheck=1#gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7[extras]
    name=Qcloud centos extras - \$basearch
    baseurl=http://mirrors.tencentyun.com/centos1/\$releasever/extras/\$basearch/
    enabled=1
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7#[fasttrack]#name=Qcloud centos fasttrack - \basearch#baseurl=http://mirrors.tencentyun.com/centos1/\$releasever/fasttrack/\$basearch/#enabled=1#gpgcheck=1#gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7ENDOF
  2. 执行以下命令,清空并重建 YUM 缓存。

    yum clean all && yum clean metadata && yum clean dbcache && yum makecache

直接修改源地址为临时解决方案,当容器被重新调度后,您所作的修改将会失效,所以建议您在创建镜像时解决该问题。具体的操作方法如下:
修改创建容器镜像的 Dockerfile。
在 Dockerfile 的 RUN 字段中,根据系统的不同添加直接修改源地址。例如,在一个基于 Ubuntu 系统的镜像中,加入以下内容:

RUN cat << ENDOF > /etc/apt/sources.list
deb http://mirrors.tencentyun.com/ubuntu/ xenial main restricted universe multiverse
deb http://mirrors.tencentyun.com/ubuntu/ xenial-security main restricted universe multiverse
deb http://mirrors.tencentyun.com/ubuntu/ xenial-updates main restricted universe multiverse#deb http://mirrors.tencentyun.com/ubuntu/ xenial-proposed main restricted universe multiverse#deb http://mirrors.tencentyun.com/ubuntu/ xenial-backports main restricted universe multiversedeb-src http://mirrors.tencentyun.com/ubuntu/ xenial main restricted universe multiverse
deb-src http://mirrors.tencentyun.com/ubuntu/ xenial-security main restricted universe multiverse
deb-src http://mirrors.tencentyun.com/ubuntu/ xenial-updates main restricted universe multiverse#deb-src http://mirrors.tencentyun.com/ubuntu/ xenial-proposed main restricted universe multiverse#deb-src http://mirrors.tencentyun.com/ubuntu/ xenial-backports main restricted universe multiverseENDOF

对于 CentOS 系统的镜像类似。

当登录容器后,发现没有 vim,netstat 等工具,怎么办?

您可以通过 apt-get install vim, net-tools 等命令下载您所需要的工具(CentOS 下执行 yum install vim)。

为什么运行 apt-get install 命令,提示找不到工具?

您可以通过以下操作,安装软件。

  1. 执行以下命令,升级软件列表。

    apt-get update
  2. 执行以下命令, 安装软件(CentOS 下执行 yum updateinfo)。

    apt-get install

如果想在容器中使用自制的工具,怎么办?

您可以在进入远程终端页面后,单击右下方的文件助手,即可进行上传和下载操作。

如何拷贝现场文件,例如 dump 或者日志到本地分析?

您可以在进入远程终端页面后,单击右下方的文件助手,即可进行上传和下载操作。

为什么用不了文件上传到容器或者下载到本地功能?

可能因为您的容器镜像里没有安装 tar 程序,您可以通过 apt-get install vim, net-tools 等命令(CentOS 下执行 yum install vim)先安装 tar 程序再重试。

为什么之前安装的工具不见了?

可能因为 kubernetes 重新调度您的容器,调度过程中会拉取镜像生成新的容器,如果镜像里面没有您之前安装的工具,新的容器是不会包含这些工具的。建议您在制作镜像时,安装一些常用的排错工具。

怎么复制控制台里的文字?

只要选中您想复制的内容,即可复制被选中的文字。

怎么粘贴复制好的文字?

同时按下 Shift + insert 即可。

为什么会断开链接?

可能因为您在腾讯云其他页面对容器、云服务器进行操作更改了容器的状况,也有可能是长时间(3分钟)不进行任何操作,服务器断开了这个链接。

运行 top 命令等出现 TERM environment variable not set 的错误,怎么办?

执行命令 export TERM linux 即可。

为何进入绝对路径较长的目录后,bash 提示符只显示 “<” 和部分路径?

因为默认的 bash 提示符被设置为显示 “用户名@主机名 当前目录”。 如果当前路径长于一定长度,bash 默认会显示 “<” 与路径的最后一部分

Back-off restarting failed docker container

说明:正在重启异常的 Docker 容器。
解决方法:检查镜像中执行的 Docker 进程是否异常退出,若镜像内并无一持续运行的进程,可在创建服务的页面中添加执行脚本。

fit failure on node: Insufficient cpu

说明:集群 CPU 不足。
解决方法:原因是节点无法提供足够的计算核心,请在服务页面修改 CPU 限制或者对集群进行扩容。

no nodes available to schedule pods

说明:集群资源不足。
解决方法:原因是没有足够的节点用于承载实例,请在服务页面修改服务的实例数量,修改实例数量或者 CPU 限制。

pod failed to fit in any node

说明:没有合适的节点可供实例使用。
解决方法:原因是服务配置了不合适的资源限制,导致没有合适的节点用于承载实例,请在服务页面修改服务的实例数量或者 CPU 限制。

Liveness probe failed

说明:容器健康检查失败
解决方法:检查镜像内容器进程是否正常,检查检测端口是否配置正确。

Error syncing pod, skipping

Error syncing pod, skipping failed to "StartContainer" for with CrashLoopBackOff: "Back-off 5m0s restarting failed container
说明:容器进程崩溃或退出。
解决方法:检查容器内是否有持续运行的前台进程,若有检查其是否有异常行为。详情请参考 构建 docker 镜像指南。

如果以上解决方法未能解决您的问题,请联系客服。



  • 名称: 容器服务TKE
  • 关键词: 容器服务TKE,KubernetesEngine,腾讯云