容器简介

举报
slx_share 发表于 2024/03/29 10:43:26 2024/03/29
【摘要】 容器是一种操作系统进程隔离技术。

1       一句话介绍

容器是一种操作系统进程隔离技术。

2       Linux技术基石

2.1      namespace

namespace即命名空间,意味着资源隔离,是一个较为通用的词汇,整个容器技术栈中有多种namespaceLinux内核提供6namespace,实现6种资源的隔离:

  • ipc:实现进程通信隔离。同一namespace下进程才能通信。
  • pid:实现进程ID号隔离。每个namespace拥有独立的一套进程ID系统。
  • mnt:实现文件系统隔离。
  • net:实现网络资源隔离。如网卡、IP、路由等。
  • uts:实现主机名、域名隔离。
  • user:实现用户名隔离。

Linux系统中每个进程都拥有这6namespace标签,如下图所示:


Linux系统提供3个重要API实现对进程namespace的操作:

  • clone:创建独立的namespace
  • setns:将进程加入现有namespace
  • unshare:将进程从现有namespace中剥离,新创建一个namespace并加入。

2.2      cgroup

cgroupcontrol group)实现对进程所需计算资源的隔离。包括对进程所需计算资源的配额限制、分配、统计与控制等。cgroup只实现对进程分组化管理的功能和接口的基础结构。基于这个基础结构,具体的子系统或资源控制器实现对资源的控制。包括控制内存的 Memory控制器、控制进程调度的CPU控制器等。例如CPU子系统用来限制进程的CPU使用率,Memory子系统用来限制内存使用率。

利用namespacecgroup技术即可实现轻量级的容器。

2.3      UnionFS

联合文件系统即将多个目录下的内容联合挂载到同一目录下。逻辑上内容位于同一个目录下,物理上位于不同磁盘空间中。


容器镜像使用了该技术。

3       容器

3.1      容器进程

容器的本质是一组拥有独立pid命名空间的进程组。进程组中只有一个pid1init进程,是容器启动时创建的第一个进程,亦是其他进程的父进程。子进程由父进程fork而来,虽然拥有独立的地址空间,但是父进程还是会通过信号影响子进程的状态。例如pid1父进程结束,会向容器内所有进程发送sigkill信号,所有进程将会被杀死。因此,容器本质还是“单进程”模型,比较适合单进程应用部署

3.2      容器镜像文件

容器镜像文件是一个包含操作系统的完整文件系统(共享宿主机OS内核),因此容器应用可以打包迁移,而不受运行环境影响。但是,操作系统通常很庞大,不同的镜像可能底层操作系统一致,因此基于UnionFS分层构建镜像可以降低镜像文件大小,提供镜像构建效率。


  • 最底层是bootfs,主要包含bootloader(引导内核)和kernel(内核差别不大,可直接复用Host OS kernel)。当内核加载进内存后,bootfs文件就可以umount
  • 第二层是Base镜像,主要包含操作系统rootfs,即操作系统用户空间文件,包含/dev /proc /bin等目录。rootfs可以做得很精简,包含基础的命令、系统库就可以。
  • 第三层及以上,每安装一个软件新增一层,每一层都是可读的。
  • 最顶层是可写的容器层。所有对容器的改动,无论添加、删除、还是修改文件都只会发生在容器层中。

3.3      容器存储

容器运行时的临时数据存放在宿主机(虚拟机或物理机)的系统盘上,随容器生命周期存在。若需要持久化容器运行数据(例如有状态应用),则需要将宿主机上的磁盘挂载给容器(Hostpath)或者挂载网络持久化存储卷(PersistentVolumePV)给容器。

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内核的namespacecgroup等隔离技术就可以创建一个容器,但是创建过程比较复杂,需要简易的容器管理工具。

  • LXCLinux container, 第一个真正意义上的容器管理工具,提供方便的接口调用内核的namespace等接口。
  • libcontainer: 通过接口的方式定义一系列容器管理的操作,包括容器创建(Factory)、容器生命周期管理(Container)、进程生命周期管理(Process)等。libcontainer后进一步演进为runCcontainerd
  • Docker: 最流行的容器管理工具,最初是基于LXC进一步进行封装,后转为基于libcontainerDocker采用客户端-服务器(CS)架构,Docker 客户端只需要向 Docker 服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。


        Docker存放镜像的地方称为注册中心(Registry),分为公共和私有两种。注册中心包含多个仓库(Repository)。

5       Kubernetes容器编排系统

5.1      k8s基础概念

Kubernetes(k8s)是一套主从分布式容器编排系统,对容器化应用进行自动化部署、扩缩容以及生命周期管理。

  • Pod:多个共享网络及存储资源的容器的组合。由于容器本身是通过namespace技术隔离的,pod中常驻一个Infra / Pause容器作为一个“桥梁”实现pod内所有容器共享网络资源。至于存储资源,则通过共享存储卷实现。podk8s最小资源调度单位,这是因为容器本质还是“单进程”模型,一些复杂的应用系统还是需要组合多个独立容器进程进行部署。
  • ReplicaSet: 副本集,保证pod高可用,确保集群中运行指定数目的pod副本。pod少于预定副本数目,则自动创建,多了则杀死pod
  • Service:服务。pod是提供服务的实例,由于高可用,podIP地址以及端口可以变动。要面向客户端提供稳定的服务,就必须提供发现后端服务的能力。每个service会对应一个集群内部有效的虚拟IP,集群内部通过虚拟IP访问一个服务。


  • PVPersistent Volume):描述管理员配置的持久化存储资源。主要包括存储能力、访问模式、存储类型、回收策略、后端存储类型等关键信息的设置。下面的例子声明的PV具有如下属性:5GB存储空间,访问模式为ReadWriteOnce,存储类型为slow(要求在系统中已存在名为slowStorageClass),回收策略为Recycle,并且后端存储类型为nfs(设置了NFS ServerIP地址和路径):


  • PVCPersistent Volume Claim):描述业务用户为Pod申请的持久化存储资源属性。主要包括存储空间请求、访问模式、PV选择条件和存储类别等信息的设置。下例声明的PVC具有如下属性:申请8GB存储空间,访问模式为ReadWriteOncePV 选择条件为包含标签“release=stable”并且包含条件为“environment In [dev]”的标签,存储类别为“slow”(要求在系统中已存在名为slowStorageClass):


PV是管理员配置的集群级别资源,并不属于某个命名空间,而PVC是业务用户为pod申请的命名空间级别资源,PV可以与任何命名空间的PVC资源绑定。


  • Namespace:将同一集群中的资源划分为相互隔离的组。组内资源名称唯一,组间则可相同。可以为每个namespace设置资源配额。
  • 工作负载:在k8s集群上运行的程序。工作负载分为Deployment(无状态)、StatefulSet(有状态)、DaemonSet(守护进程集,确保集群中每个或部分node上运行守护进程podpod生命周期自动跟随node)、Job(普通任务,pod的生命周期跟随短任务,任务结束则pod消亡)、CronJob(定时任务)
  • ConfigMap:配置文件,对k8s对象进行声明式管理,将配置数据与应用程序分离,便于应用的修改。

5.2      k8s架构


  • Master节点:
    • 分布式可监控存储(etcd):保存整个集群的状态。
    • API服务器(api server):整个集群资源的调用入口,并提供认证、授权、访问控制、API注册和发现等机制。
    • 控制管理器(controller manager):负责维护集群的状态,比如故障检测、自动扩展、滚动更新等。
    • 调度器(scheduler):负责资源调度,依据预定策略将pod调度到合适的计算节点上。
  • Slave节点:
    • 节点代理组件(kubelet):负责维护容器的生命周期,同时也负责VolumeCVI)和网络(CNI)的管理。
    • 网络代理组件(kube-proxy):集群内部的服务发现和负载均衡。

5.3      服务访问

k8s集群弹性扩缩导致容器IP动态变化,客户端无法直接依赖于容器IP进行访问,因此需要通过某种方式固定流量入口。

  • ClusterIPservice默认不对集群外开放,集群内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 DirectoryGitHub等身份验证服务集成。
  • Cluster Controller:监视下游集群中的资源更改,使下游集群的当前状态达到所需状态,为群集和项目配置访问控制策略。
  • Cluster Agent:在下游用户集群中运行,连接到Rancher启动的k8s集群的Kubernetes API,管理每个集群中的工作负载,pod创建和部署,在集群和Rancher服务器之间进行通信,以了解事件,统计信息,节点信息和运行状况。
  • Node Agent:在执行集群操作时,它用于与节点进行交互。集群操作的示例包括升级Kubernetes版本以及创建或还原etcd快照。

6.2      重点功能

  • 容器集群统一管理:管理任意位置的k8s集群(公有云、私有云容器等);导入已部署的k8s集群;支持基础设施即代码。
  • 多集群一致性部署
  • 集群无停机升级
  • 集群备份恢复
  • 集中用户管理:多种认证方式集成;RBAC角色管理。
  • 多租户及租户隔离
  • 安全管控
  • 多集群应用一键部署、统一管理
  • 监控告警

7       容器云

容器云即以容器为资源分割和调度基本单位的、资源自动化管理的、便于分布式应用构建、发布、运行的云计算平台。

当容器云专注于资源共享与隔离、容器编排与部署时,更接近传统云平台的IaaS层;当容器云渗透到应用支撑与运行时环境时,更接近PaaS层。

8       参考

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。