type
status
date
slug
summary
tags
category
icon
password
在过去的十年中,“容器技术”无疑是一个备受瞩目的焦点。它的兴起可以追溯到2013年,当时DotCloud公司发布了Docker开源容器引擎,这一创新技术获得了运维人员和开 发人员的青睐,并在T领域迅速普及,掀起了容器化的浪潮。Docker之所以被广泛认可和采用,主要原因在于它引入了“容器镜像”的功能,这一功能将操作系统、依赖环境和应用程序进行打包和分发,有效地解决了软件在交付过程中 可能出现的配置复杂性、环境不一致性、可移植性等问题。通过容器镜像,应用开发者可以轻松地构建、打包和部署应用程序,大大提高了开发效率和交付质量。
容器技术概述
随着基础架构的不断发展,应用程序的部署环境也经历了从物理机到虚拟机,再到容器的转变

物理机时代
早期,应用程序被部署在物理机上,为了提高物理机的资源利用率,每台物理机都会运行多个应用程序。当一个应用程序占用大量资源时,它会影响其他应用程序的性能和稳 定性。如果每台物理机仅运行一个应用程序,那么这可能会导致资源利用率低,从而增加经济成本和维护成本
虚拟机时代
为了解决资源利用率低和资源隔离性的问题,引入了虚拟化技术。虚拟化技术允许在 物理机上运行多个虚拟机(VM),每个虚拟机都具有独立的操作系统、硬件资源(CPU、 内存等)等配置。因此,它们之间是完全隔离的,大大提高了物理机的资源利用率、隔离 性和安全性
容器时代
随着业务的多样化、复杂性,一个应用程序可能由多个服务组成,并依赖多个第三方 服务(如数据库、缓存、消息队列),还可能需要随时被部署到不同的环境中(如开发环 境、测试环境、生产环境),在这些环境中,主机可能使用不同的操作系统、软件版本、 配置参数等。因此,软件交付可能产生大量的工作,即开发人员需要考虑不同的运行环境, 运维人员则需要配置这些环境。
运维人员为了提高工作效率,通常会编写脚本或使用工具进行自动化部署和配置。但 这种方式仍然存在环境不兼容引发的问题,主要原因在于无法做到“系统级别的打包和分 发”。在虚拟机环境中,可以制作镜像以将虚拟机的整个状态、配置和数据打包到一个文 件或一组文件中,以便在其他虚拟机环境中恢复这个虚拟机。但这些打包的文件体积比较 大,少则几个GB,多则上百GB,不易于迁移,并且受底层虚拟化平台的限制,尤其在公有云环境
相比之下,Docker容器在应用管理方面具有显著的优势
- 轻量级:容器不需要运行整个操作系统,而是与宿主机共享内核,这使得容器更 加轻巧,开销更小,可以秒级启动。
- 镜像管理:通过
Dockerfile文件灵活定义容器镜像的组成(包括文件系统、依赖 环境、应用程序等),这样每个容器镜像都可以具有特定的环境,并且支持版本 管理。
- 环境一致性:容器镜像可以在任意 Docker 主机上创建容器,并确保容器的状态 与镜像保持一致,从而消除了不同环境的差异。
- 可移植性:容器由于与基础架构是分离的,因此可以跨“云”和操作系统进行无 缝迁移。
- 应用环境隔离:Docker利用
Linux namespace技术来隔离容器进程,使每个容器 具备独立的视图,互不干扰,增强了安全性和可维护性
- 应用资源限制:Docker利用
Linux cgroup技术来限制容器资源(如CPU、内存、硬盘I/O等)的使用,可以很方便地控制应用程序资源的使用
Docker 容器技术的变革不仅提高了软件交付效率,还使应用程序的管理更加灵活、可扩展和高效Kubernetes介绍
Docker 非常适合单机管理多个容器,但在生产环境中,为了保障应用程序的高可用性 和高并发性,我们通常在一个应用程序上部署多个实例(即创建多个容器),并将它们分布在不同的Docker主机上,同时对外提供服务

在这种环境下,如何高效地管理容器成为一项新的挑战。这项挑战包括但不限于如何 更有效地管理和调度容器、如何确保容器升级的平滑进行以及如何管理容器网络问题等为了解决这些问题,容器编排系统应运而生。容器编排系统可以对多个 Docker 主机 进行统一管理和调度,协调容器化应用程序的部署、伸缩、发现和管理
主流的容器编排 系统如下所示
- Docker Swarm:
Docker 官方提供的容器编排系统,用于将一组Docker主机组建 成一个集群,提供容器化集群管理服务
- *Mesos:**Apache开源的
分布式资源管理框架,支持Docker容器管理,可用于构建 大规模的容器集群
- Kubernetes:Google
开源的容器编排系统由内部运行数十年的Borg集群管理系统 演变而来,凝聚了生产环境中大规模容器运维的经验
Kubernetes 旨在简化容器化应用程序的部署和管理,它提供了许多功能,例如自动上 线与回滚、容器自我修复、水平扩展、存储编排、配置管理等,以满足应用程序容器化管 理多方面的需求。Kubernetes拥有庞大的社区和生态系统,支持各种插件和工具的扩展,包 括监控、日志、CI/CD等,这些功能和工具使得Kubernetes成为一种强大的容器编排平台
随着容器化技术的不断发展,Kubernetes 在容器编排和容器管理领域成为领头羊,并 被全球一线互联网公司(如阿里、腾讯、百度、华为、京东、奇虎360等)广泛应用,越 来越多的企业正在向Kubernetes迁移
Kubernetes架构与组件
Kubernetes 架构由
管理节点和工作节点,以及一个键值存储系统(etcd)组成,如图所示
管理节点
管理节点(master node,以下简称Master)是Kubernetes集群的控制中心,负责监控 整个集群的状态、资源调度和响应集群事件等。其主要组件如下所示
kube-apiserver:提供 Kubernetes API 服务,负责处理外部和内部组件的请求,并 将这些操作存储到etcd中
etcd:一个分布式键值存储系统,用于存储 Kubernetes 集群的数据。etcd 是由 CoreOS 开源的,它并不属于Kubernetes集群本身,因此etcd可以独立于集群进行部署
kube-controller-manager:负责管理多个控制器的程序。这些控制器包括但不限于以下控制器- Node Controller(节点控制器):
负责监控节点状态,并在节点故障时响应 - *Replication Controller(副本控制器):**负责
确保在集群中运行数量的Pod副本 - Job Controller(任务控制器):
负责监控Job对象,并生成相应的Pod来执行任务 - Endpoint Controller(端点控制器):
负责管理与Service相应的Endpoint对象,确保Endpoint 关联正确的Pod IP地址
这些控制器负责维护集群的不同方面,确保整个集群的状态符合预期
kube-scheduler:根据预定的算法,将未指定节点的Pod分配到合适的节点上
工作节点
工作节点(worker node,以下简称 Node)是 Kubernetes 集群的工作节点,它提供运 行容器所需的资源和环境。它的主要组件如下所示
- *kubelet:**运行在每个节点上,
负责管理Pod和容器的生命周期,如启动容器、挂 载数据卷、获取容器状态以及向管理节点汇报等
- *kube-proxy:**也是运行在每个节点上,
负责实现集群内部的网络代理和负载均衡器功能
- container-runtime(容器运行时):
实际运行和管理容器的服务,Kubernetes 支持 多种容器运行时,如docker、containerd、cri-o等,以及其他支持Kubernetes CRI (Container Runtime Interface,容器运行时接口)的实现
Kubernetes核心资源
Kubernetes 提供了多种抽象的资源,通过定义这些资源,你可以部署和管理应用程序 的不同方面,如容器配置、网络代理、存储等。以下是一些常见的资源
- Pod(容器组):
Pod是Kubernetes中最小的可部署单元,它可以包含一个或多个 容器,这些容器可以相互共享网络和存储资源
- Deployment(部署):
部署和管理应用程序,监控相关 Pod 的状态,以确保其与 用户定义的期望状态保持一致
- Service(服务):
定义一组Pod的访问方式,通过负载均衡将请求转发到这些Pod上
- *Namespace(命名空间):**用于将集群
多个独立的工作环境,不同命名空间 中的资源相互隔离,从而方便组织和管理资源
例如:在 Kubernetes 集群中,可以根据项目创建相应的命名空间,如 project-a、 project-b 和 project-c在每个命名空间中,创建资源(如Deployment、Service等)以部署 相应的应用程序,如应用A、应用B、应用C,如图所示

此外,还可以根据以下情况创建命名空间。
- 如果一个集群由多个团队使用,则可以根据团队创建命名空间,如
team-a、team-b
- 如果一个集群具有多个部署环境,则可以根据环境创建命名空间,如
test、dev、prod
- 作者:NotionNext
- 链接:https://tangly1024.com/article/d433aa1c-5c9b-4ce2-a5bd-de451423ad16
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。













