容器简介
1 一句话介绍
容器是一种操作系统进程隔离技术。
2 Linux技术基石
2.1 namespace
namespace即命名空间,意味着资源隔离,是一个较为通用的词汇,整个容器技术栈中有多种namespace。Linux内核提供6种namespace,实现6种资源的隔离:
- ipc:实现进程通信隔离。同一namespace下进程才能通信。
- pid:实现进程ID号隔离。每个namespace拥有独立的一套进程ID系统。
- mnt:实现文件系统隔离。
- net:实现网络资源隔离。如网卡、IP、路由等。
- uts:实现主机名、域名隔离。
- user:实现用户名隔离。
Linux系统中每个进程都拥有这6个namespace标签,如下图所示:
Linux系统提供3个重要API实现对进程namespace的操作:
- clone:创建独立的namespace。
- setns:将进程加入现有namespace。
- unshare:将进程从现有namespace中剥离,新创建一个namespace并加入。
2.2 cgroup
cgroup(control group)实现对进程所需计算资源的隔离。包括对进程所需计算资源的配额限制、分配、统计与控制等。cgroup只实现对进程分组化管理的功能和接口的基础结构。基于这个基础结构,具体的子系统或资源控制器实现对资源的控制。包括控制内存的 Memory控制器、控制进程调度的CPU控制器等。例如CPU子系统用来限制进程的CPU使用率,Memory子系统用来限制内存使用率。
利用namespace和cgroup技术即可实现轻量级的容器。
2.3 UnionFS
联合文件系统即将多个目录下的内容联合挂载到同一目录下。逻辑上内容位于同一个目录下,物理上位于不同磁盘空间中。
容器镜像使用了该技术。
3 容器
3.1 容器进程
容器的本质是一组拥有独立pid命名空间的进程组。进程组中只有一个pid为1的init进程,是容器启动时创建的第一个进程,亦是其他进程的父进程。子进程由父进程fork而来,虽然拥有独立的地址空间,但是父进程还是会通过信号影响子进程的状态。例如pid1父进程结束,会向容器内所有进程发送sigkill信号,所有进程将会被杀死。因此,容器本质还是“单进程”模型,比较适合单进程应用部署。
3.2 容器镜像文件
容器镜像文件是一个包含操作系统的完整文件系统(共享宿主机OS内核),因此容器应用可以打包迁移,而不受运行环境影响。但是,操作系统通常很庞大,不同的镜像可能底层操作系统一致,因此基于UnionFS分层构建镜像可以降低镜像文件大小,提供镜像构建效率。
- 最底层是bootfs,主要包含bootloader(引导内核)和kernel(内核差别不大,可直接复用Host OS kernel)。当内核加载进内存后,bootfs文件就可以umount。
- 第二层是Base镜像,主要包含操作系统rootfs,即操作系统用户空间文件,包含/dev, /proc, /bin等目录。rootfs可以做得很精简,包含基础的命令、系统库就可以。
- 第三层及以上,每安装一个软件新增一层,每一层都是可读的。
- 最顶层是可写的容器层。所有对容器的改动,无论添加、删除、还是修改文件都只会发生在容器层中。
3.3 容器存储
容器运行时的临时数据存放在宿主机(虚拟机或物理机)的系统盘上,随容器生命周期存在。若需要持久化容器运行数据(例如有状态应用),则需要将宿主机上的磁盘挂载给容器(Hostpath)或者挂载网络持久化存储卷(PersistentVolume,PV)给容器。
3.4 容器网络
- 隧道网络:基于节点间underlay网络构建容器间overlay通信网络。
- 节点内容器之间通信就是两个namespace之间的通信,即可通过Linux veth-pair和 Linux Bridge实现网络互通(参见虚拟化简介)。
- 节点间通信采用VxLAN隧道通信。容器数据报文在节点OVS上进行VxLAN封装,并通过宿主机通信网络(物理网络或VPC)传送给对端节点OVS。
- VPC网络:节点通过IPVLAN虚拟化出虚拟网络接口。节点网卡作为父网卡,虚拟出的子网卡gw_xxx作为容器的网关(IP地址与节点不同,MAC地址相同)。
- 节点内容器通过子网卡直接互通。
- 节点间容器通过节点父网卡进行路由转发出去。
- 云原生0网络:华为自研容器网络模型,直接在节点上通过VLAN子接口方式将辅助弹性网卡(Sub-ENI)挂载到弹性网卡上。容器间直接挂载Sub-ENI进行通信(如果节点是裸金属,则容器直接使用ENI通信)。该网络流量转发简单、拥有跟VPC几乎等同的性能。
4 Docker容器管理平台
基于Linux内核的namespace、cgroup等隔离技术就可以创建一个容器,但是创建过程比较复杂,需要简易的容器管理工具。
- LXC: Linux container, 第一个真正意义上的容器管理工具,提供方便的接口调用内核的namespace等接口。
- libcontainer: 通过接口的方式定义一系列容器管理的操作,包括容器创建(Factory)、容器生命周期管理(Container)、进程生命周期管理(Process)等。libcontainer后进一步演进为runC和containerd。
- Docker: 最流行的容器管理工具,最初是基于LXC进一步进行封装,后转为基于libcontainer。Docker采用客户端-服务器(CS)架构,Docker 客户端只需要向 Docker 服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。
Docker存放镜像的地方称为注册中心(Registry),分为公共和私有两种。注册中心包含多个仓库(Repository)。
5 Kubernetes容器编排系统
5.1 k8s基础概念
Kubernetes(k8s)是一套主从分布式容器编排系统,对容器化应用进行自动化部署、扩缩容以及生命周期管理。
- Pod:多个共享网络及存储资源的容器的组合。由于容器本身是通过namespace技术隔离的,pod中常驻一个Infra / Pause容器作为一个“桥梁”实现pod内所有容器共享网络资源。至于存储资源,则通过共享存储卷实现。pod是k8s最小资源调度单位,这是因为容器本质还是“单进程”模型,一些复杂的应用系统还是需要组合多个独立容器进程进行部署。
- ReplicaSet: 副本集,保证pod高可用,确保集群中运行指定数目的pod副本。pod少于预定副本数目,则自动创建,多了则杀死pod。
- Service:服务。pod是提供服务的实例,由于高可用,pod的IP地址以及端口可以变动。要面向客户端提供稳定的服务,就必须提供发现后端服务的能力。每个service会对应一个集群内部有效的虚拟IP,集群内部通过虚拟IP访问一个服务。
- PV(Persistent Volume):描述管理员配置的持久化存储资源。主要包括存储能力、访问模式、存储类型、回收策略、后端存储类型等关键信息的设置。下面的例子声明的PV具有如下属性:5GB存储空间,访问模式为ReadWriteOnce,存储类型为slow(要求在系统中已存在名为slow的StorageClass),回收策略为Recycle,并且后端存储类型为nfs(设置了NFS Server的IP地址和路径):
- PVC(Persistent Volume Claim):描述业务用户为Pod申请的持久化存储资源属性。主要包括存储空间请求、访问模式、PV选择条件和存储类别等信息的设置。下例声明的PVC具有如下属性:申请8GB存储空间,访问模式为ReadWriteOnce,PV 选择条件为包含标签“release=stable”并且包含条件为“environment In [dev]”的标签,存储类别为“slow”(要求在系统中已存在名为slow的StorageClass):
PV是管理员配置的集群级别资源,并不属于某个命名空间,而PVC是业务用户为pod申请的命名空间级别资源,PV可以与任何命名空间的PVC资源绑定。
- Namespace:将同一集群中的资源划分为相互隔离的组。组内资源名称唯一,组间则可相同。可以为每个namespace设置资源配额。
- 工作负载:在k8s集群上运行的程序。工作负载分为Deployment(无状态)、StatefulSet(有状态)、DaemonSet(守护进程集,确保集群中每个或部分node上运行守护进程pod,pod生命周期自动跟随node)、Job(普通任务,pod的生命周期跟随短任务,任务结束则pod消亡)、CronJob(定时任务)
- ConfigMap:配置文件,对k8s对象进行声明式管理,将配置数据与应用程序分离,便于应用的修改。
5.2 k8s架构
- Master节点:
- 分布式可监控存储(etcd):保存整个集群的状态。
- API服务器(api server):整个集群资源的调用入口,并提供认证、授权、访问控制、API注册和发现等机制。
- 控制管理器(controller manager):负责维护集群的状态,比如故障检测、自动扩展、滚动更新等。
- 调度器(scheduler):负责资源调度,依据预定策略将pod调度到合适的计算节点上。
- Slave节点:
- 节点代理组件(kubelet):负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理。
- 网络代理组件(kube-proxy):集群内部的服务发现和负载均衡。
5.3 服务访问
k8s集群弹性扩缩导致容器IP动态变化,客户端无法直接依赖于容器IP进行访问,因此需要通过某种方式固定流量入口。
- ClusterIP:service默认不对集群外开放,集群内service间通过cluster ip进行互访,由kube-proxy负责流量转发到pod上。
- NodePort:通过节点IP+端口的方式访问service。流量先转发到node,再由kube-proxy转发给pod。
- LoadBalancer:流量先发送到负载均衡器,再负载分担到各个node,进而通过NodePort方式转发。云原生0网络架构下,负载均衡器可直接将流量转发给后端Pod。
6 Rancher多容器集群管理平台
Rancher是一个对多个k8s集群进行管理的工具,旨在帮助用户管理任意位置的k8s集群。
6.1 Rancher架构
- Rancher API Server:基于Kubernetes API Server扩展构建,通过k8s标准的自定义资源对象扩展和各种自定义控制器实现对底层k8s集群和各种资源的扩展和纳管。
- Authentication Proxy:将所有Kubernetes API调用转发到下游集群,它与本地身份验证,Active Directory和GitHub等身份验证服务集成。
- Cluster Controller:监视下游集群中的资源更改,使下游集群的当前状态达到所需状态,为群集和项目配置访问控制策略。
- Cluster Agent:在下游用户集群中运行,连接到Rancher启动的k8s集群的Kubernetes API,管理每个集群中的工作负载,pod创建和部署,在集群和Rancher服务器之间进行通信,以了解事件,统计信息,节点信息和运行状况。
- Node Agent:在执行集群操作时,它用于与节点进行交互。集群操作的示例包括升级Kubernetes版本以及创建或还原etcd快照。
6.2 重点功能
- 容器集群统一管理:管理任意位置的k8s集群(公有云、私有云容器等);导入已部署的k8s集群;支持基础设施即代码。
- 多集群一致性部署
- 集群无停机升级
- 集群备份恢复
- 集中用户管理:多种认证方式集成;RBAC角色管理。
- 多租户及租户隔离
- 安全管控
- 多集群应用一键部署、统一管理
- 监控告警
7 容器云
容器云即以容器为资源分割和调度基本单位的、资源自动化管理的、便于分布式应用构建、发布、运行的云计算平台。
当容器云专注于资源共享与隔离、容器编排与部署时,更接近传统云平台的IaaS层;当容器云渗透到应用支撑与运行时环境时,更接近PaaS层。
8 参考
- https://zhuanlan.zhihu.com/p/73248894
- https://www.cnblogs.com/ilinuxer/p/6188303.html (容器进程)
- https://juejin.cn/post/6863616404638629896
- https://kubernetes.io/zh-cn/docs/home/
- https://developer.aliyun.com/article/1126840 (pod原理)
- https://blog.csdn.net/qq_19676401/article/details/119996434
- https://ranchermanager.docs.rancher.com/zh/
- 点赞
- 收藏
- 关注作者
评论(0)