镜像组织形式
镜像默认采用 OverlayFS 方式挂载,最终效果是将多个目录结构合并为一个。
其中 lowerdir 为只读路径,最右层级最深。最终容器运行时会将 lowerdir 和 upperdir 合并挂在为 merged,对应容器中的路径为 /
。
举例:
镜像 testadd:0.5 版本的层级挂载如下:
1 | [root@node111 16:02:24 overlay2]$docker inspect testadd:0.5 |grep Dir |
运行该容器后,可以看到多了一个 overlay 方式挂载的路径:
1 | [root@node111 16:05:53 overlay2]$mount |grep overlay |
查看对应关系:
1 | [root@node111 16:05:53 overlay2]$mount |grep overlay |
查看容器内根分区,并在容器内创建文件,查看容器挂载 merged 路径下文件
1 | [root@e53180ddcd03 /]# ls |
1 | [root@node111 16:07:13 overlay2]$cd e1378dc042b534fe00ca6f4565e399f30d56c81d434a30a6137cfae6b5355d00/merged/ |
在容器中创建的文件 yiran
在宿主机相应的挂载路径下是可以看到的。
镜像管理
下载
默认从 docker.io 获取最新镜像,可以在 /etc/docker/daemon.json 中指定 registry-mirrors
或 insecure-registries
获取私有镜像。
下载完成后可以看到镜像下载完成后会在 /var/lib/docker/overlay2/
下保存一份镜像真实内容。
1 | [root@node111 16:17:15 docker]$docker images |
构建
在不同服务构建镜像时,应保证最小化且合理分层,这样可以在最底层使用相同的 overlay 缓存,比较空间浪费。
参考 OpenStack Kolla 项目层级结构,openstack 所有服务镜像均基于 CentOS,60+服务镜像打包占用总空间为 5.48G:
注意:
尽量使用最精简基础镜像,只安装必要软件包
合理拆分服务
尽量保证 Dockerfile 中上层指令相同,若顺序不同则会构建出不同的层级,无法利用缓存特性
保证层级处于最精简状态
…
上传
当我们本地存在一份镜像,想要将其上传至指定仓库,我们需要先对镜像打 tag,举例:
1 | [root@node111 16:24:55 image]$docker images |
上传到指定仓库之后,其他节点可以修改 docker 配置文件,重启 docker 后即可直接下载指定镜像。
Kubernetes 镜像管理
下载
在 k8s 中,没有针对镜像仓库的集群级别配置,节点各自维护自己的仓库地址,如果需要增加仓库地址,需要修改集群中所有节点配置文件,重启 docker 生效。
20190531 更新
针对 k8s 中私有仓库的使用更新:
- 当 k8s 想要配置 http 私有仓库时,只能通过在节点上修改 docker 配置文件 /etc/docker/daemon.json ,添加 “insecure-registries” 字段,并重启 docker 后,k8s 可以自动拉取所需镜像;
- 当 k8s 配置 https 私有仓库时,只需将根证书拷贝到 k8s 节点的 /etc/docker/certs.d/<domain.com>/ 下,创建 k8s secret docker-registry ,在 YAML 中指定拉取镜像所需的 secret,就可以自动拉取了。
可以在 k8s 中配置指定仓库的 secret 类型为 docker-registry 来配置私有仓库的用户名密码,在之后创建 Pod 时指定该 secret 名称即可自动下载,具体操作如下:
1 | [root@node3 ~]# kubectl create secret docker-registry regsecret --docker-server=192.168.30.111 --docker-username=admin --docker-password=Harbor12345 --docker-email=yiran@smartx.com |
删除
k8s 自身不提供主动删除节点中无用镜像操作,默认通过配置 GC 参数删除无用镜像。
不推荐使用其它管理工具或手工进行容器和镜像的清理,因为kubelet需要通过容器来判断pod的运行状态,如果使用其它方式清除容器有可能影响kubelet的正常工作。
–image-gc-high-threshold int32
当用于存储镜像的磁盘使用率达到百分之–image-gc-high-threshold时将触发镜像回收(default 85)–image-gc-low-threshold int32
删除最近最久未使用(LRU,Least Recently Used)的镜像直到磁盘使用率降为百分之–image-gc-low-threshold或无镜像可删为止 (default 80)
CNCF-Harbor
Harbor项目是一个具有存储、签署和扫描内容功能的开源云原生registry。Harbor 由 VMware 创建,通过添加用户所需功能(如安全性,身份认证和管理)来扩展开源Docker Distribution,并支持在registry之间复制镜像。Harbor还提供高级安全功能,比如漏洞分析,基于角色的访问控制,活动审计等等。
主要功能:
- 角色控制/身份校验
- 镜像复制
- 漏洞扫描
- …
资源消耗情况:
1 | [root@node111 11:09:02 harbor]$docker stats --no-stream |
默认推荐部署方式:docker-composer
k8s 推荐部署方式:Helm
总结
在日常开发过程中,公司内部部署私有仓库(比如 Harbor)可以控制用户角色,方便测试同学快速获取最新版本镜像。
在融合产品生命周期中,只有升级场景涉及到镜像的导入、上传、下载、删除操作,因此没必要在集群中持续运行一个仓库服务,浪费资源。
参考链接
openstack kolla 项目,目标是通过容器化方式部署 openstack,便于 openstack 滚动升级。