一文带你了解华为云容器实例【与云原生的故事】
本文主要内容:
- 云容器实例介绍
- 产品架构
- 产品优势
- 应用场景
- 最佳实践
- 小结
1、云容器实例介绍
云容器实例(Cloud Container Instance,CCI)服务提供Serverless Container(无服务器容器)引擎,让您无需创建和管理服务器集群即可直接运行容器。
Serverless是一种架构理念,是指不用创建和管理服务器、不用担心服务器的运行状态(服务器是否在工作等),只需动态申请应用需要的资源,把服务器留给专门的维护人员管理和维护,进而专注于应用开发,提升应用开发效率、节约企业IT成本。传统上使用Kubernetes运行容器,首先需要创建运行容器的Kubernetes服务器集群,然后再创建容器负载。
云容器实例的Serverless Container就是从使用角度,无需创建、管理Kubernetes集群,也就是从使用的角度看不见服务器(Serverless),直接通过控制台、kubectl、Kubernetes API创建和使用容器负载,且只需为容器所使用的资源付费。
2、产品架构
云容器实例提供Serverless Container服务,拥有多个异构的Kubernetes集群,并集成网络、存储服务,让您方便的通过控制台、kubectl、Kubernetes API创建和使用容器负载。
- 基于华为云底层网络和存储服务(VPC、ELB、NAT、EVS、OBS、SFS等),提供丰富的网络和存储功能。
- 提供高性能、异构的基础设施(x86服务器、GPU加速型服务器、Ascend加速型服务器),容器直接运行在物理服务器上。
- 使用Kata容器提供虚拟机级别的安全隔离,结合自有硬件虚拟化加速技术,提供高性能安全容器。
- 多集群统一管理,容器负载统一调度,使用上无需感知集群存在。
- 基于Kubernetes的负载模型提供负载快速部署、弹性负载均衡、弹性扩缩容、蓝绿发布等重要能力。
3、产品优势
3.1、随启随用
业界领先的Serverless Container架构,用户无需创建Kubernetes服务器集群,直接使用控制台、kubectl、Kubernetes API创建容器。3.2、极速弹性
云容器实例的Kubernetes集群是提前创建好的,且从单一用户角度看资源“无限大”,所以能够提供容器秒级弹性伸缩能力,让您能够轻松应对业务快速变化,稳健保障业务SLA。
3.3、按需秒级计费
根据实际使用的资源数量,按需按秒计费,避免业务不活跃时段的费用开销,降低用户成本。
3.4、完全开放的原生平台
- 紧跟Kubernetes和Docker社区,迅速同步最新版本
- 原生支持Kubernetes API
3.5、高安全
云容器实例同时具备容器级别的启动速度和虚拟机级别的安全隔离能力,提供更好的容器体验。
- 原生支持Kata Container
- 基于Kata的内核虚拟化技术,为您提供全面的安全隔离与防护
- 自有硬件虚拟化加速技术,让您获得更高性能的安全容器
通过Kata容器实现多租户容器强隔离
4、应用场景
4.1、大数据、AI计算
当前主流的大数据、AI训练和推理等应用(如Tensorflow、Caffe)均采用容器化方式运行,并需要大量GPU、高性能网络和存储等硬件加速能力,并且都是任务型计算,需要快速申请大量资源,计算任务完成后快速释放。
云容器实例提供如下特性,能够很好的支持这类场景。
- 计算加速:提供GPU/Ascend等异构芯片加速能力
- 大规模网络容器实例调度:支持大规模、高并发的容器创建和管理
- 随启随用、按需付费:容器按需启动,按资源规格和使用时长付费
图1 大数据AI计算场景
4.2、生物基因、药物研发等科学计算
生物基因、药品研发等领域需要高性能、密集型计算,同时对成本较敏感,需要低成本、免运维的计算平台。科学计算一般都是任务型计算,快速申请大量资源,完成后快速释放。
云容器实例提供如下特性,能够很好的支持这类场景。
- 高性能计算:提供高性能计算、网络和高I/O存储,满足密集计算的诉求
- 极速弹性:秒级资源准备与弹性,减少计算过程中的资源处理环节消耗
- 免运维:无需感知集群和服务器,大幅简化运维工作、降低运维成本
- 随启随用、按需付费:容器按需启动,按资源规格和使用时长付费
图2 科学计算
4.3、DevOps持续交付
软件开发型企业,希望构建从代码提交到应用部署的DevOps完整流程,提高企业应用迭代效率。DevOps流程一般都是任务型计算,如企业CI/CD(持续集成/持续发布)流程自动化,需要快速申请资源,完成后快速释放。
云容器实例提供如下特性,能够很好的支持这类场景。
- 流程自动化:无需创建和维护集群,实现从CI/CD的全流程自动化
- 环境一致性:以容器镜像交付,可以无差别地从开发环境迁移到生产环境
- 随启随用、按需付费:容器按需启动,按资源规格和使用时长付费
图3 DevOps持续交付
4.4、高弹性业务
业务波峰波谷较明显的业务,日常流量稳定,高峰期又需要快速扩展资源,并对成本有一定诉求,如视频直播、媒体资讯、电商、在线教育等应用。
云容器实例提供如下特性,能够很好的支持这类场景。
- 快速弹性伸缩:业务高峰时,业务能够快速从CCE弹性扩展到CCI,保障业务稳定运行
- 低成本灵活计费:业务平稳期在CCE上包周期计费,节省成本;高峰期弹性扩容到CCI上,按需计费,高峰期结束后又可以快速释放资源,降低成本
图4 弹性扩展
5、最佳实践
5.1、Dockerfile参数在云容器实例中如何使用
如果您了解容器引擎的使用,Dockerfile文件的一些配置如何对应到云容器实例中去使用呢?
下面通过一个例子来说明他们之间的关系,这样您就可以更好的了解和熟悉云容器实例。
FROM ubuntu:16.04
ENV VERSION 1.0
VOLUME /var/lib/app
EXPOSE 80
ENTRYPOINT ["./entrypoint.sh"]
CMD ["start"]
上面是一个Dockerfile文件,包含一些常见的参数ENV、VOLUME、EXPOSE、ENTRYPOINT、CMD,这些参数在云容器实例中可以按如下方法配置。
- ENV为环境变量,在云容器实例中创建负载的时候,可以在高级配置中设置,如下所示。
- VOLUME为定义容器卷,通常配合docker run -v 宿主机路径:容器卷路径一起使用。
云容器实例中支持将云硬盘挂载到容器中,只需在创建负载时添加云硬盘卷,并配置大小、挂载路径(也就是容器卷的路径)即可。
- ENTRYPOINT与CMD对应云容器实例中高级配置的启动命令,详细内容请参见容器启动命令。
- EXPOSE即暴露某个端口,通常在启动容器时配合docker run -p <宿主端口>:<容器端口>一起使用,云容器实例中容器如果要对外暴露端口,只需在创建负载的时候配置负载访问端口:容器端口的映射,这样就可以通过负载请求域名:负载访问端口访问到容器。
5.2、使用Tensorflow训练神经网络
本实验主要演示在云容器实例中创建GPU类型的负载,以tensorflow的图像分类为示例,演示在容器中直接使用GPU训练一个简单的神经网络。
使用容器化的方式做此类人工智能训练与推理有如下优势:
- 容器化消除环境差异,不需要自己安装各种软件和配套版本,如python,tensorflow,cuda toolkit等软件。
- GPU驱动免安装。
- 低成本,按秒计费。
- serverless带来的免VM运维。
镜像制作
tensorflow社区有tensoflow的基础镜像,已经装好了基础的tensorflow库,它分支持GPU和支持CPU两个版本,在镜像中心即可下载。
- GPU版本地址为 tensorflow/tensorflow:1.15.0-gpu
- CPU版本地址为 tensorflow/tensorflow:1.13.0
本文采用tensorflow官网中一个已经训练好的模型,对图片进行分类,模型名称Inception-v3。Inception-v3是在2012年ImageNet视觉识别挑战赛上训练出的模型,它将一个非常大的图片集进行了1000个种类的图片分类。Github有使用Inception-v3进行图片分类的代码。
训练模型的代码,均在工程https://gpu-demo.obs.cn-north-1.myhuaweicloud.com/gpu-demo.zip中,您需要将代码下载解压,并将代码工程打入镜像中。下面附上制作镜像的Dockerfile文件内容:
FROM tensorflow/tensorflow:1.15.0-gpu
ADD gpu-demo /home/project/gpu-demo
其中ADD将gpu-demo工程拷贝到镜像的/home/project目录下,可以根据自己需要修改。
执行docker build -t tensorflow/tensorflow:v1 . 命令制作镜像(.表示当前目录,即Dockerfile文件所在目录)。
镜像制作好后需要上传到容器镜像服务,具体步骤请参见https://support.huaweicloud.com/usermanual-swr/swr_01_0009.html。
创建Tensorflow负载
- 登录云容器实例管理控制台。
- 创建GPU型命名空间,填写命名空间名称,设置好VPC和子网网段后,单击“创建”。
GPU型命名空间
- 左侧导航栏中选择“工作负载 > 无状态(Deployment)”,在右侧页面中单击“创建无状态负载”。
- 配置负载信息。
- 填写基本信息,选择2创建的命名空间,Pod数量选择为“1”,选择Pod规格为“GPU加速型”,显卡的驱动版本选择“418.126”,如下所示。
GPU Pod的详细规格和显卡驱动的说明请参见Pod规格。
- 选择需要的容器镜像,这里选择的上传到镜像容器仓库的tensorflow镜像。
- 在容器设置下面的高级设置中,挂载一个NFS类型的文件存储卷,用于保存训练后的数据。
挂载NFS存储
- 在启动命令中输出执行命令和参数。
- 可执行命令:/bin/bash
- 参数1:-c
- 参数2:python /home/project/gpu-demo/cifar10/cifar10_multi_gpu_train.py --num_gpus=1 --data_dir=/home/project/gpu-demo/cifar10/data --max_steps=10000 --train_dir=/tmp/sfs0/train_data; while true; do sleep 10; done
此处 --train_dir 表示训练结果存储路径,其前缀 /tmp/sfs0 需要与4.c中设置的NFS“容器内挂载路径”路径保持一致,否则训练结果无法写入NFS中。
--max_steps表示训练迭代的次数,这里指定了10000次迭代,完成模型训练大概耗时3分钟,如果不指定,默认是1000000次迭代,耗时会比较长。max_steps数值越大,训练时间越久,结果越精确。
- 该命令是训练图片分类模型,然后单击“下一步”。
- 设置容器启动命令
- 配置负载访问信息。
本例中选择“不启用”,单击“下一步”。
- 单击“提交”,然后单击“返回工作负载列表”。
在负载列表中,待负载状态为“运行中”时,负载创建成功。
使用已有模型分类图片
- 单击负载名称,进入负载详情界面,选择“Pod列表>终端”Tab页。当黑色区域文本框中出现#号时,说明已登录。
- 进入到工程所在目录,执行python classify_image.py --model_dir=model命令,可以看到分类结果。
图片如下。执行结果最后几行是分类的label和对应的打分,其中有一行显示airliner(score = 0.84250),分数越高越准确,可见模型认为这个图片是一架客机。3. # cd /home/project/gpu-demo 4. # ls -l 5. total 96 6. -rw-r--r-- 1 root root 6874 Aug 30 08:09 airplane.jpg 7. drwxr-xr-x 3 root root 4096 Sep 4 07:54 cifar10 8. drwxr-xr-x 3 root root 4096 Aug 30 08:09 cifar10_estimator 9. -rw-r--r-- 1 root root 30836 Aug 30 08:09 dog.jpg 10.-rw-r--r-- 1 root root 43675 Aug 30 08:09 flower.jpg 11.drwxr-xr-x 4 root root 4096 Sep 4 02:14 inception 12.# cd inception 13.# python classify_image.py --model_dir=model --image_file=/home/project/gpu-demo/airplane.jpg 14.… 15.2019-01-02 08:05:24.891201: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1084] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 15131 MB memory) -> physical GPU (device: 0, name: Tesla P100-PCIE-16GB, pci bus id: 0000:00:0a.0, compute capability: 6.0) 16.airliner (score = 0.84250) 17.wing (score = 0.03228) 18.space shuttle (score = 0.02524) 19.warplane, military plane (score = 0.00691) airship, dirigible (score = 0.00664)
也可以不指定要分类的图片,默认将使用下面这张图片分类。
熊猫
执行命令python classify_image.py ––model_dir=mode
# python classify_image.py --model_dir=model
…
2019-01-02 08:02:33.271527: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1084] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 15131 MB memory) -> physical GPU (device: 0, name: Tesla P100-PCIE-16GB, pci bus id: 0000:00:0a.0, compute capability: 6.0)
giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca (score = 0.89107)
indri, indris, Indri indri, Indri brevicaudatus (score = 0.00779)
lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens (score = 0.00296)
custard apple (score = 0.00147)
earthstar (score = 0.00117)
执行结果显示模型认为这是一只大熊猫。
使用训练的图片分类模型
tensorflow官网中给了一个深度卷积网络的模型代码和训练数据:CIFAR-10。这是个简化的图片分类模型,将图片分成以下10类:airplane, automobile, bird, cat, deer, dog, frog, horse, ship和truck。当然喂给模型的图,也就是训练数据,也是这10种类型的图片。
可见它准确识别出图中是架飞机。label_image.py是使用刚刚训练的模型来进行图片分类的代码。
同时,在“Pod列表>监控”Tab页中,可以看到各种资源的使用率。
6、小结
华为云容器实例具有云服务器容器、秒级计费、安全快递、开放兼容特点,可用于人工智能、生物基因、DevOps持续交付等场景,随着容器技术不断发展,云容器实例在行业中的应用也会更加广泛。
【与云原生的故事】有奖征文火热进行中:https://bbs.huaweicloud.com/blogs/345260
- 点赞
- 收藏
- 关注作者
评论(0)