从镜像仓库工具、镜像下载加速工具、安全扫描工具理解镜像存储和镜像安全

镜像仓库负责存储、管理和分发镜像,镜像仓库管理多个Repository(组织名),在拉取镜像时需要指定镜像仓库地址+镜像名称+标签来拉取。如果要自己搭建一个镜像仓库需要遵循OCI的Distribution Spec,即定义的一些接口Spec,具体如下所示:


镜像由元数据和块文件两部分组成,镜像仓库的核心职能就是管理这两项数据。元数据用于描述一个镜像的核心信息,包含镜像的仓库、标签、校验码、文件层、镜像构建描述等信息。块文件(blob)是组成镜像的联合文件层的实体,每一个块文件是一个文件层,内部包含对应文件层的变更。Harbor是VMware开源的企业级镜像仓库,拥有完整的仓库管理、镜像管理、基于角色的权限管控、镜像安全扫描集成、镜像签名等功能。Harbor按功能模块来划分,可以划分如下6个部分
Harbor核心服务:提供Harbor的核心管理服务API,包括仓库管理、认证管理、授权管理、配置管理、项目管理、配额管理、签名管理、副本管理等。
Harbor Portal:Harbor的web界面。
Registry: Registry负责接收客户端的pull/push请求,其核心为Docker/Distribution
副本控制器:Harbor可以以主从模式来部署镜像仓库,副本控制器将镜像从主镜像服务分发到从镜像服务。
日志收集器:收集各模块日志。
垃圾回收控制器:回收日常操作中删除镜像记录后遗留在块存储中孤立块文件,需要注意一个点,删除镜像时不会删除blob文件,blob文件是通过垃圾回收机制删除不再使用的blob文件,进而清理存储空间的。

如果要安装Harbor,可以通过helm进行安装,具体步骤如下所示:

步骤一:下载harbor的安装包,并创建namespace,用于后面安装harbor

helm repo add harbor https://helm.goharbor.io
helm fetch harbor/harbor --untar
kubectl create ns harbor

步骤二: 修改安装包中的配置信息,将类型修改成nodePort,这样可以在外面访问harbor,tls.commonName设置为“core.harbor.domain”,persistence设置为false,这样在安装harbor的时候,不用依赖storageClass.

步骤三:安装harbor

helm install harbor ./harbor -n harbor

安装完成后,查看nodePort的service的端口,通过节点IP+service端口号即可访问harbor。

另外,还可以通过官网提供的harbor demo server往上面push镜像。demo server地址是:

https://demo.goharbor.io/harbor/projects,登陆该服务,注册一个账号,用注册的账号登陆服务,创建一个project,这里创建的project名称是tlqiao。然后cd到已经编写好dockerFile的项目目录下,通过docker命令,就可以把本地的dockerFile构建成镜像并推送到demo.harbor上。

docker login demo.goharbor.io
docker build -t demo.goharbor.io/taoli/httpserver:0.1 .
docker push demo.goharbor.io/taoli/httpserver:0.1

结果如下所示,可以看到image被成功push到的demo.harbor服务上。

除了push镜像外,当部署pod时需要从镜像仓库pull image,如果集群有很多node节点,大量节点同时从仓库拉取镜像,那么会对仓库造成压力,在这种情况下,可以考虑引入Dragonfly。Dragonfly是一款基于P2P的智能镜像和文件分发工具,这个工具可提高文件传输效率和速率,最大限度的利用网络带宽,尤其是在分发大数据时。dfget proxy也称为dfdaemon,会拦截来自docker pull或docker push的HTTP请求,然后使用dfget来处理那些跟镜像分层相关的请求。在理解dragonfly时,需要先弄清楚几个术语。

SuperNode(超级节点):这是一个长期运行的进程,主要提供以下两个功能:
为每个peer节点调度下载piece的网络路径:(你可以理解为种子文件,该文件告诉客户端去哪些节点获取哪些数据),superNode是个调度者也是追踪者, 因为peer节点会通知supernode,本节点piece文件的信息,也就是说超级节点拥有其下属所有peer节点上的piece文件信息。
CDN 服务器:从源处缓存数据,避免从源处下载重复的数据。dfget在下载文件之前,都会注册到超级节点,告诉超级节点dfget需要下载的信息,超级节点会立刻去源处下载这些目标文件。Piece: 一个piece是将要下载的文件的一部分,可以解释为一块文件。在dragonfly中,下载文件不是完整传输,而是分段传输。
Dfget:是dragonfly中获取文件的工具,负责下载文件数据。类似于wget,同时,他还担任peer角色(dfget server 命令就是peer服务),peer角色的节点可以为p2p网络中的其他使用dfget命令的客户端传输数据。
Dfdaemon:是个代理,Dfdaemon在容器引擎(docker daemon)和注册表(registry或者harbor)之间的代理,也是一个本地长期运行的进程。当拉取镜像时,他会拦截docker daemon发送出去的请求,然后对于非层文件的请求直接转发,而对于层文件获取请求会拦截后使用Dfget下载这些层文件。docker需要配置proxy参数,接入dfdaemon,才能让dfdaemon起效。
P2P:peer to peer,一种分布式应用程序体系结构。

Peer: 在P2P网络中,peer节点双方既是资源的提供者又是消费者。因此,在Dfget开始从Supernode进行下载任务之前,Dfget将启动一个Web服务器,该服务器提供下载的文件服务以供其他peer在P2P网络中下载,并向Supernode发送peer/Register请求以加入P2P网络。只有这样,Dfget才能从P2P网络下载文件。

如下图所示当node节点需要拉取镜像时,请求会发送到cluster manager,cluster manger通过查询发现如果这个镜像还没有缓存到本地节点上,那么就会从Registry获取,获取到镜像的块文件分发到各个节点,当下次再有节点请求这个镜像时,请求发送到cluster manager,cluster manager发现镜像已经缓存,那么会告诉dfget到具体的节点获取块文件,而无需再从registry拉取。

每个步骤操作如下所示:

  1. node 发起docker pull请求
  2. 请求发给supernode(也就是cluster manager)
  3. supernode向仓库拉取镜像
  4. 返回镜像给node
  5. 节点之间可以相互传输镜像(镜像被分成多个块,分发到不同的节点)
  6. 写镜像到本地文件系统

在上述的过程中,supernode拉取到镜像后,supernode会对镜像文件进行分块处理,不同的块文件存放到不同的节点上,下次再拉取该镜像时,supernode会告诉node节点需要去那些节点获取镜像块文件,然后进行组合变成一个完整的镜像文件。镜像分发过程如下图所示

可以看到dragonfly可以加快拉取速度,尤其是客户端多的情况下,优化效果很明显。但同时也需要注意dragonfly带来的风险点,dragonfly存在很多数据落盘行为,且有很多数据从磁盘读取,那么对磁盘的性能要求就很高,另外,频繁的落盘和读取行为,阻碍了性能的进一步提升。另外,需要注意一点:dragondly适用于大规模并发场景,如果业务场景没有达到100个节点并发拉取镜像,建议不使用Dragonfly,使用水平扩展的harbor就足够了。使用dragonfly毕竟是会带来一定的复杂度的。

前面介绍了镜像的存储,除存储外,还需考虑镜像安全,可以从下面三个点加强镜像的安全。
构建指令问题:避免在构建镜像时,添加密钥,Token等敏感信息(配置与代码分离)。
应用依赖问题:确保依赖无安全风险,一些长时间不更新的基础镜像可能面临风险,故需要定期更新基础镜像版本。
文件问题:在构建镜像时,除应用本身外,还需要添加应用需要配置文件、模版等,在添加这些文件时,主要是否包含敏感信息。当镜像中存在文件问题时,需要通过引入该文件的构建指令进行修复,而不是通过追加一条删除指令来修复。可以通过镜像扫描工具对镜像进行扫描保证镜像的安全。镜像扫描过程如下所示

  • 1.镜像扫描服务从镜像仓库拉取镜像
  • 2.解析镜像的元数据
  • 3.解压镜像的每一个文件层
  • 4.提取每一层所包含的依赖包、可运行程序、文件列表、文件内容扫描
  • 5.将扫描结果与CVE字典、安全策略字典进行匹配,以确认镜像最终是否安全。

支持镜像扫描的工具有多个,例如Anchore、Aqua、Clair等,其中Anchore和Clair也支持与Harbor集成。实际项目中可选择一款工具对镜像进行扫描,保证镜像安全。以上就是对镜像存储、下载、安全扫描的介绍。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

taoli-qiao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值