容器化的本质是一个“视图隔离、资源受限”的进程运行环境,运行在该环境(容器内)的进程可以理解为是被操作系统附加了很多属性的进程,本质上还是操作系统的标准进程。
docker是一种Linux容器技术,容器由单个操作系统通过资源管理划分,把资源管理
划分到相互隔离的组中,每个容器运行一个运行一个应用,不同的容器之间相互隔离,互不影响。
docker有如下3个基本概念,分别为
操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。而Docker 镜像(Image),就相当于是一个 root 文件系统。
Docker image是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。 镜像不包含任何动态数据,其内容在构建之后也不会被改变,因此镜像是一个静态的定义。
容器可以简单理解为image的运行态,是一个动态的定义。可以类比操作系统的程序和进程,程序是静态的,运行起来就是进程,是动态的。容器本质上是操作系统中的标准进程,可以被创建,启动,停止,删除等。
镜像仓库是用于集中统一存储镜像的地方,比如某个镜像要在多台CVM上运行,则这些CVM上的docker client会主动去镜像仓库,把对应的镜像拉取到本地进行运行。
docker主要解决的是保证开发生产环境强一致、资源隔离、在任何地方运行、轻量化的痛点。但是如下几个问题需要考虑:
场景:给你1000台CVM
如果要同时在1000台上部署某个容器,该怎么处理?
如果只需要在500台CVM上运行某个容器,这500台CVM该如何选择?
如果一台机上运行了上百个容器,这些容器该如何运维以及管理?
如果CVM出现故障,大量容器需要迁移,该如何处理?
为解决上述提到的种种问题,引申出一系列容器化的管理问题,即容器编排。
容器编排是对容器的整个生命周期进行管理,包含容器管理、调度、集群定义和服务发现等,通过容器编排引擎、容器被组合成微服务应用,目前常见的容器编排技术有2种,一个是docker swarm,另外一个是K8S。
腾讯云容器服务(Tencent Kubernetes Engine,TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,解决用户开发、测试及运维过程的环境问题、帮助用户降低成本,提高效率。容器服务平台完全兼容原生 Kubernetes API, 并扩展了 CBS、CLB 等 Kubernetes 插件,实现了高可靠、高性能的网络方案。
TKE集群与CVM的关系如下,下图是一个完整的TKE集群架构,由MASTER集群+NODE集群组成。
节点(NODE):节点是组成容器集群的基本元素。节点取决于业务,可以为虚拟机或物理机。每个节点都包含运行 Pod 所需要的基本组件,包括 Kubelet、Kube-proxy 等。
容器(Container):Docker 容器旨在让用户在相对独立的环境中运行独立的程序,一个节点可运行多个容器。
镜像(IMAGE):Docker 镜像用于部署容器服务,每个镜像有特定的唯一标识(镜像的 Registry 地址+镜像名称+镜像 Tag)。
实例(Pod):由相关的一个或多个容器构成一个实例,这些容器共享相同的存储和网络空间。
镜像仓库:用于存放 Docker 镜像,Docker 镜像用于部署容器服务。
集群:指容器运行所需云资源的集合,包含若干云服务器CVM、CLB等云资源集合。
容器集群(Node集群):由若干NODE节点组成的集群。
MASTER集群:管理整体TKE集群调度编排的集群。
TKE通过不同的控制器类型,如deployment、service等,可以实现对POD的编排调度,控制其副本数、对外服务、调度策略等。