searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

cinder、glance容器镜像制作简介

2023-03-09 11:07:11
114
0

1、服务容器化管理

    天翼云底座3.0架构下cinder、glance等服务都是基于package包的管理方式,存在各种零散的依赖软件包,cinder、glance服务的升级通常需要对多个软件包分别升级来实现。针对服务的部署和管理维护,为了提升部署简易性,增强服务可维护性,我们采用容器化方式部署管理服务,通过升级容器镜像版本来升级服务。容器最大的优势在于,部署方便,管理灵活以及升级方式优化。容器化部署场景下,服务升级可直接通过升级相应容器镜像版本实现,用户无感知,升级失败回滚等操作更加迅速便捷。实际升级操作既有原子性,对整个cinder、glance服务的影响性也会降至最低。部署管理方式灵活,基于容器化的部署管理模式,可实现服务配置统一化管理,方便调节服务规模副本数,实现服务故障自动拉起等。

    openstack容器化目前主流有两种实现方式。一种为kolla-ansible项目,直接将openstack组件打包为容器,不依赖k8s这些容器编排管理项目,直接通过ansible脚本利用Docker就可以实现服务的容器化部署。另一种则为openstack-helm项目,openstack组件也是先打包容器镜像,然后封装为helm工具管理的chart包,最后依赖k8s集群,通过helm工具将组件chart包部署到k8s集群上。无论哪种方式,将各个服务组件打包为容器镜像是第一步。openstack-helm打包容器镜像方式主要依赖于loci项目。天翼云4.0架构下,各服务组件均采用k8s编排纳管,我们也基于loci项目基础来实现打包cinder,glance服务容器镜像。

2、loci项目

2.1、loci简介

    loci项目主要用于构建容器镜像,供openstack-helm项目使用部署相关服务。目前openstack-helm项目中使用的openstack组件容器镜像大部分则来源于此项目。当前loci项目支持以下几个组件:cinder、glance、keystone、neutron、nova等。其制作镜像的本质同样是使用Dockerfile构建Docker镜像,并打包成相应的服务镜像。

2.2、docker镜像的构建

2.2.1、Dockerfile简介

    Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数。镜像的定制实际上就是定制每一层所添加的配置文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么镜像构建透明性的问题就能解决。这个脚本就是Dockerfile。Dockerfile是一个文本文件,其内包含了各种的指令,每一条指令的内容,就是描述该层应当如何构建。

2.2.2、Docker镜像结构的分层

    上文我们了解到镜像不是一个单一的文件,而是有多层构成。容器其实是在镜像的最上面加了一层读写层,在运行容器里做的任何文件改动,都会写到这个读写层,如下图所示。如果删除了容器,也就删除了其最上面的读写层,文件改动也就丢失了。Docker使用存储驱动管理镜像每层内容及可读写层的容器层。

  • Dockerfile中的每个指令都会创建一个新的镜像层;
  • 镜像层将被缓存和复用;
  • 当Dockerfile的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效;
  • 某一层的镜像缓存失效,它之后的镜像层缓存都会失效;
  • 镜像层是不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件,只是这个文件在Docker 容器中不可见了。

图1  Docker镜像层级

2.3、loci构建镜像

    官方提供loci项目支持centos7、ubuntu-bionic、ubuntu-xenial、debian等作为其后续组件镜像的基础镜像。在构建组件镜像之前,需要先构建基础镜像。我们基于loci项目基础上进项改造,使其支持ctyunos系统作为后续构建cinder、glance服务的基础镜像。

图2  loci项目结构

构建镜像主要为以下几步:

  • 使用/root/loci/dockerfiles/ctyunosdockerfile目录下的Dockerfile构建ctyunos系统基础镜像;
  • 使用根目录Dockerfile在基础镜像之上构建cinder,glance服务镜像,该Dockerfile主要运行scripts目录下各项脚本:
  • sh脚本为构建入口;
  • sh脚本用于提供pipenv环境;
  • sh脚本用于安装指定的rpm包,依赖的rpm包通过bindep工具和组件参数解析根目录下bindep.txt文件而来;
  • sh脚本用于git 克隆cinder、glance项目源码,同时也会克隆涉及到的一些依赖项目如castellan、os-brick、cinder-client等;
  • sh脚本用于安装指定的pip包,依赖的pip包同样通过bindep工具和组件参数解析根目录下的pipdep.txt文件而来;
  • sh和cleanup.sh脚本用于收集镜像安装的包信息以及清理安装过程中一些不必要的包。

3、容器镜像制作流程

3.1 准备环境

    当前制作镜像的机器需要安装好Docker环境,可访问公网,用以下载cinder、glance服务依赖的pip包等资源。同时需要访问公网yum源拉取服务依赖的rpm包。准备Docker环境步骤如下:

  • 安装包并设置镜像仓库
yum install -y yum-utils  

yum-config-manager \  
        --add-repo \  
        http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo   

yum makecache fast  
  • 安装docker并启动
yum install docker-ce docker-ce-cli containerd.io  

systemctl  restart docker  

3.2 构建基础镜像

    首先需要加载ctyunos镜像,从官方yum源下载ctyunos基础镜像压缩包后,加载到本地环境。配置构建服务基础镜像dockerfiles/ctyunos/Dockerfile文件,并准备好yum配置文件ctyunos.repo于dockerfiles/ctyunos目录下。Dockerfile文件样例如下所示:

1.ARG FROM=ctyunos2:2.0.1  
2.FROM ${FROM}  
3.  
4.ARG PIP_INDEX_URL=https://mirrors.aliyun.com/pypi/simple/  
5.ARG PIP_TRUSTED_HOST=mirrors.aliyun.com  
6.ENV PIP_INDEX_URL=${PIP_INDEX_URL}  
7.ENV PIP_TRUSTED_HOST=${PIP_TRUSTED_HOST}  
8.  
9.RUN rm -rf /etc/yum.repos.d/*  
10.COPY ctyunos.repo /etc/yum.repos.d/  
11.RUN yum update -y  
12.# NOTE(aostapenko) repositories are restored on yum update, deleting them again  
RUN find /etc/yum.repos.d/ -type f ! -name 'ctyunos.repo' -delete

    以ctyunos为基础镜像,构建服务基础base镜像命令如下,--tag 指定镜像tag。

docker build dockerfiles/ctyunos --tag base:ctyunos  

3.3 构建cinder、glance镜像

  • 构建 cinder 镜像:--build-arg 指定参数,PROJECT指定项目为cinder,PROJRCT_REF指定分支,--tag 指定cinder镜像tag。
docker build . --build-arg PROJECT=cinder --build-arg PROJECT_REF=master --build-arg FROM=base:ctyunos --tag cinder:v1  
  • 构建 glance镜像:--build-arg 指定参数,PROJECT指定项目为glance,PROJRCT_REF指定分支,--tag 指定glance镜像tag。
docker build . --build-arg PROJECT=glance --build-arg PROJECT_REF=master --build-arg FROM=base:ctyunos --tag glance:v1 

3.4 跨平台构建arm架构镜像

    Docker buildx是Docker的一个插件,可支持Moby BuildKit的所有特性,支持跨CPU架构编译镜像,以及跨多节点同时编译镜像。开启buildx之后可实现跨平台编译Docker镜像需求,在x86架构服务器制作arm镜像。镜像制作流程如下:

  • 激活buildx,通过配置文件激活buildx。
1.vim /etc/docker/daemon.json  
2.#添加配置  
3.{  
4.    "experimental": true  
5.}  

 

  • 安装qemu-user-static 模拟多平台环境,并通知Docker使用qemu;
install -y qemu-user-static binfmt-support  
 
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
  • 构建buildx容器;
docker buildx create --name my_arm64_builder my_arm64_builder  
  
docker buildx use my_arm64_builder  
  
docker buildx inspect --bootstrap  
  • 构建服务组件镜像
docker buildx build --platform linux/arm64 dockerfiles/ctyunos --tag base:ctyunos-arm64 --load  
 
docker buildx build --platform linux/arm64 . --build-arg PROJECT=cinder  --build-arg PROJECT_REF=master --build-arg FROM=base:ctyunos --tag cinder:v1-arm64 --load  
  
docker buildx build --platform linux/arm64 . --build-arg PROJECT=glance  --build-arg PROJECT_REF=master --build-arg FROM=base:ctyunos --tag glance:v1-arm64 --load  

 

 

0条评论
0 / 1000
曹****磊
2文章数
0粉丝数
曹****磊
2 文章 | 0 粉丝
曹****磊
2文章数
0粉丝数
曹****磊
2 文章 | 0 粉丝
原创

cinder、glance容器镜像制作简介

2023-03-09 11:07:11
114
0

1、服务容器化管理

    天翼云底座3.0架构下cinder、glance等服务都是基于package包的管理方式,存在各种零散的依赖软件包,cinder、glance服务的升级通常需要对多个软件包分别升级来实现。针对服务的部署和管理维护,为了提升部署简易性,增强服务可维护性,我们采用容器化方式部署管理服务,通过升级容器镜像版本来升级服务。容器最大的优势在于,部署方便,管理灵活以及升级方式优化。容器化部署场景下,服务升级可直接通过升级相应容器镜像版本实现,用户无感知,升级失败回滚等操作更加迅速便捷。实际升级操作既有原子性,对整个cinder、glance服务的影响性也会降至最低。部署管理方式灵活,基于容器化的部署管理模式,可实现服务配置统一化管理,方便调节服务规模副本数,实现服务故障自动拉起等。

    openstack容器化目前主流有两种实现方式。一种为kolla-ansible项目,直接将openstack组件打包为容器,不依赖k8s这些容器编排管理项目,直接通过ansible脚本利用Docker就可以实现服务的容器化部署。另一种则为openstack-helm项目,openstack组件也是先打包容器镜像,然后封装为helm工具管理的chart包,最后依赖k8s集群,通过helm工具将组件chart包部署到k8s集群上。无论哪种方式,将各个服务组件打包为容器镜像是第一步。openstack-helm打包容器镜像方式主要依赖于loci项目。天翼云4.0架构下,各服务组件均采用k8s编排纳管,我们也基于loci项目基础来实现打包cinder,glance服务容器镜像。

2、loci项目

2.1、loci简介

    loci项目主要用于构建容器镜像,供openstack-helm项目使用部署相关服务。目前openstack-helm项目中使用的openstack组件容器镜像大部分则来源于此项目。当前loci项目支持以下几个组件:cinder、glance、keystone、neutron、nova等。其制作镜像的本质同样是使用Dockerfile构建Docker镜像,并打包成相应的服务镜像。

2.2、docker镜像的构建

2.2.1、Dockerfile简介

    Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数。镜像的定制实际上就是定制每一层所添加的配置文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么镜像构建透明性的问题就能解决。这个脚本就是Dockerfile。Dockerfile是一个文本文件,其内包含了各种的指令,每一条指令的内容,就是描述该层应当如何构建。

2.2.2、Docker镜像结构的分层

    上文我们了解到镜像不是一个单一的文件,而是有多层构成。容器其实是在镜像的最上面加了一层读写层,在运行容器里做的任何文件改动,都会写到这个读写层,如下图所示。如果删除了容器,也就删除了其最上面的读写层,文件改动也就丢失了。Docker使用存储驱动管理镜像每层内容及可读写层的容器层。

  • Dockerfile中的每个指令都会创建一个新的镜像层;
  • 镜像层将被缓存和复用;
  • 当Dockerfile的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效;
  • 某一层的镜像缓存失效,它之后的镜像层缓存都会失效;
  • 镜像层是不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件,只是这个文件在Docker 容器中不可见了。

图1  Docker镜像层级

2.3、loci构建镜像

    官方提供loci项目支持centos7、ubuntu-bionic、ubuntu-xenial、debian等作为其后续组件镜像的基础镜像。在构建组件镜像之前,需要先构建基础镜像。我们基于loci项目基础上进项改造,使其支持ctyunos系统作为后续构建cinder、glance服务的基础镜像。

图2  loci项目结构

构建镜像主要为以下几步:

  • 使用/root/loci/dockerfiles/ctyunosdockerfile目录下的Dockerfile构建ctyunos系统基础镜像;
  • 使用根目录Dockerfile在基础镜像之上构建cinder,glance服务镜像,该Dockerfile主要运行scripts目录下各项脚本:
  • sh脚本为构建入口;
  • sh脚本用于提供pipenv环境;
  • sh脚本用于安装指定的rpm包,依赖的rpm包通过bindep工具和组件参数解析根目录下bindep.txt文件而来;
  • sh脚本用于git 克隆cinder、glance项目源码,同时也会克隆涉及到的一些依赖项目如castellan、os-brick、cinder-client等;
  • sh脚本用于安装指定的pip包,依赖的pip包同样通过bindep工具和组件参数解析根目录下的pipdep.txt文件而来;
  • sh和cleanup.sh脚本用于收集镜像安装的包信息以及清理安装过程中一些不必要的包。

3、容器镜像制作流程

3.1 准备环境

    当前制作镜像的机器需要安装好Docker环境,可访问公网,用以下载cinder、glance服务依赖的pip包等资源。同时需要访问公网yum源拉取服务依赖的rpm包。准备Docker环境步骤如下:

  • 安装包并设置镜像仓库
yum install -y yum-utils  

yum-config-manager \  
        --add-repo \  
        http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo   

yum makecache fast  
  • 安装docker并启动
yum install docker-ce docker-ce-cli containerd.io  

systemctl  restart docker  

3.2 构建基础镜像

    首先需要加载ctyunos镜像,从官方yum源下载ctyunos基础镜像压缩包后,加载到本地环境。配置构建服务基础镜像dockerfiles/ctyunos/Dockerfile文件,并准备好yum配置文件ctyunos.repo于dockerfiles/ctyunos目录下。Dockerfile文件样例如下所示:

1.ARG FROM=ctyunos2:2.0.1  
2.FROM ${FROM}  
3.  
4.ARG PIP_INDEX_URL=https://mirrors.aliyun.com/pypi/simple/  
5.ARG PIP_TRUSTED_HOST=mirrors.aliyun.com  
6.ENV PIP_INDEX_URL=${PIP_INDEX_URL}  
7.ENV PIP_TRUSTED_HOST=${PIP_TRUSTED_HOST}  
8.  
9.RUN rm -rf /etc/yum.repos.d/*  
10.COPY ctyunos.repo /etc/yum.repos.d/  
11.RUN yum update -y  
12.# NOTE(aostapenko) repositories are restored on yum update, deleting them again  
RUN find /etc/yum.repos.d/ -type f ! -name 'ctyunos.repo' -delete

    以ctyunos为基础镜像,构建服务基础base镜像命令如下,--tag 指定镜像tag。

docker build dockerfiles/ctyunos --tag base:ctyunos  

3.3 构建cinder、glance镜像

  • 构建 cinder 镜像:--build-arg 指定参数,PROJECT指定项目为cinder,PROJRCT_REF指定分支,--tag 指定cinder镜像tag。
docker build . --build-arg PROJECT=cinder --build-arg PROJECT_REF=master --build-arg FROM=base:ctyunos --tag cinder:v1  
  • 构建 glance镜像:--build-arg 指定参数,PROJECT指定项目为glance,PROJRCT_REF指定分支,--tag 指定glance镜像tag。
docker build . --build-arg PROJECT=glance --build-arg PROJECT_REF=master --build-arg FROM=base:ctyunos --tag glance:v1 

3.4 跨平台构建arm架构镜像

    Docker buildx是Docker的一个插件,可支持Moby BuildKit的所有特性,支持跨CPU架构编译镜像,以及跨多节点同时编译镜像。开启buildx之后可实现跨平台编译Docker镜像需求,在x86架构服务器制作arm镜像。镜像制作流程如下:

  • 激活buildx,通过配置文件激活buildx。
1.vim /etc/docker/daemon.json  
2.#添加配置  
3.{  
4.    "experimental": true  
5.}  

 

  • 安装qemu-user-static 模拟多平台环境,并通知Docker使用qemu;
install -y qemu-user-static binfmt-support  
 
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
  • 构建buildx容器;
docker buildx create --name my_arm64_builder my_arm64_builder  
  
docker buildx use my_arm64_builder  
  
docker buildx inspect --bootstrap  
  • 构建服务组件镜像
docker buildx build --platform linux/arm64 dockerfiles/ctyunos --tag base:ctyunos-arm64 --load  
 
docker buildx build --platform linux/arm64 . --build-arg PROJECT=cinder  --build-arg PROJECT_REF=master --build-arg FROM=base:ctyunos --tag cinder:v1-arm64 --load  
  
docker buildx build --platform linux/arm64 . --build-arg PROJECT=glance  --build-arg PROJECT_REF=master --build-arg FROM=base:ctyunos --tag glance:v1-arm64 --load  

 

 

文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0