-
第四章:华为云容器服务介绍 学习笔记• 华为云容器全栈服务介绍华为云容器全栈服务一览特点:易使用、易运维、高性能• 云容器引擎CCE1. 基于开源Kubernetes、Docker技术的企业级容器服务。2. 借助云容器引擎,用户可以在华为云上轻松部署、管理和扩展容器化应用程序。3. CCE与Kubernetes关系CCE集群:丰富异构、高性能、安全、统一调度的容器基础设施产品。4. CCE产品架构图A、 丰富的异构算力支持:全面支持华为云各类计算实例、支持存量实例纳管;B、 高性能云原生网络:Overlay模式下网络性能较开源Flannel方案提升30%、Underlay模式下网络性能较直连损耗在55之内;C、 全面安全的云原生能力:安全加固的容器运行时,有效屏蔽各类开源漏洞、容器镜像多种策略扫描、有效识别镜像中风险D、 统一的大规模云原生调度:单集群最大支持1万节点,自研Volcano调度效率较开源调度方案提升30%• CCE使用方式可通过CCE控制台(推荐)、Kubelctl命令行、Kubernetes API使用云容器引擎服务• CCE使用流程CCE集群:标准集群,提供商用级集群服务Turbo集群:面向云原生2.0、大规模、高性能的场景做了计算、网络和调度的全面加速的集群鲲鹏集群:计算架构基于鲲鹏架构• CCE关键特性总览• 集群管理:可一键创建集群,支持多种异构基础设置• 节点\节点池管理节点:节点是容器集群组成的基本元素,取决于业务、既可以是虚拟机、也可以是物理机。节点池管理:节点池中有多个节点,节点参数配置相同,可通过设置节点模板创建节点,通过节点池功能方便实现节点动态扩缩容。• 工作负载:Deployment、Statefulset、Daemonset、Job、CronJob等类型。云容器引擎CCE提供基于Kubernetes原生类型的容器部署和管理能力,支持容器工作负载部署、配置、监控、扩容、升级、卸载、服务发现以及负载均衡等生命周期管理。根据不同工作负载的特点,CCE可提供不同的能力以保证其正常运转。• 亲和/反亲和调度A、 工作负载和可用区的亲和性:基于可用区可设置多条调度策略,只需满足其中一条就会进行调度B、 工作负载和节点的亲和性:基于节点可以设置多条调度策略,只需满足其中一条就会进行调度C、 工作负载间的亲和性:基于工作负载可以设置多条调度策略,但多条策略中设置的标签必须同时出现在一个工作负载中• 容器网络• 持久化卷存储CCE除支持本地磁盘存储外,还支持将工作负载数据存储在华为云的云存储上,当前支持云存储包括四点:本地磁盘存储云硬盘存储文件存储卷对象存储卷• 弹性伸缩根据业务需求和策略自动调整资源使用策略工作负载伸缩:HPA策略,实现Pod水平自动伸缩功能CustomedHPA:华为云自研的弹性伸缩增强能力,能基于CPU利用率、内存利用率等指标对无状态负载进行弹性扩缩容。节点伸缩:通过节点自动伸缩组件autoscaler实现,根据pod调度状态及资源使用情况对集群的节点进行自动扩缩容。• CCE使用场景• 云容器实例CCI1. 云容器实例:只需要管理运行在Kubernetes上的容器化业务,无需管理集群和服务器即可在CCI上快速创建和运行容器负载。2. CCI和CCE的差别计费模式不同、使用场景不同、资源创建不同3. CCI的使用流程4. CCI关键特性:智能调度:CCI天然支持Volcano异构容器:充分利用华为云底层异构资源,满足业务场景安全容器:每个容器/pod都运行在单独的ECS中,安全性高秒级计费:根据实际使用资源量,按需秒级计费。5. CCI应用场景:AI计算、高性能容器批量处理(Job类任务)、长稳及扩容流量处理• SWR:容器镜像服务1. SWR基本概念—仓库:集中存放镜像的空间。仓库分为公共仓库和私有仓库2. SWR基本概念—容器镜像:镜像,是多个二进制只读层的集合。3. SWR基本概念—组织:组织用于隔离镜像仓库,便于仓库和镜像的管理4. SWR的使用流程:创建组织→镜像获取→应用部署→更新镜像5. SWR镜像管理—上传镜像:客户端上传镜像(客户端版本必须为1.1/1.2以上,镜像每个layer不能超过10G)/页面上传镜像(每次最多上传10个文件,单文件大小不超过2G)6. SWR镜像管理—编辑镜像属性:包括镜像的类型、分类和描述信息7. SWR镜像管理—共享私有镜像:只有账号所有者或具备该私有镜像管理权限的IAM用户才能进行分享8. SWR镜像管理—添加触发器:实现镜像版本更新时,自动更新使用该镜像的应用。可全部触发、指定版本号触发或正则触发9. SWR镜像管理—镜像老化规则:可从存活时间和版本数目两个规则进行设置10. SWR镜像管理—自动同步镜像11. SWR镜像管理—镜像安全扫描:一键对镜像进行安全扫描,确保所用镜像安全12. SWR镜像管理—设置镜像加速器:解决公有镜像因为网络原因导致下载速度慢或下载失败的问题
-
假设现有一个基于nodejs开发的Hello World原生服务应用,如图1,且无需和AppCube平台进行API集成。图1 Hello World满足统一安装的规范后,可以使用园区的自动化部署工具安装到数字平台中。大致流程如下:基于安全的基础镜像制作原生服务应用的镜像。上传镜像到镜像仓库。制作基于Helm规范的Chart包。使用自动化部署工具部署原生服务。前提条件准备一台安装了docker的Linux主机。联系园区运营获取安全的Euler操作系统基础镜像,例如“HiCampus_DockerImageBase_EulerOS2.0SP5-x86_64_20210630.tar.xz”操作步骤使用root用户登录安装了docker的Linux环境。将获取Euler操作系统基础镜像上传到Linux服务器指定的目录中(例如/home/helloworld)。导入基础镜像并设置tag。# xz -d HiCampus_DockerImageBase_EulerOS2.0SP5-x86_64_20210630.tar.xz# docker import -m "hicampus euler_x86" HiCampus_DockerImageBase_EulerOS2.0SP5-x86_64_20210630.tar euleros:21.1.0下载nodejs的二进制包,并上传到Linux服务器指定的目录中(例如/hom/helloworld)。从官网上https://nodejs.org/download/release/v12.0.0/下载。例如“node-v12.0.0-linux-x64.tar.gz”。创建helloworld应用程序文件。# vi /home/helloworld/server.jsvar http = require('http'); http.createServer(function (request, response) { // 发送 HTTP 头部 // HTTP 状态值: 200 : OK // 内容类型: text/plain response.writeHead(200, {'Content-Type': 'text/plain'}); // 发送响应数据 "Hello World" response.end('Hello World\n'); }).listen(8888); // 终端打印如下信息 console.log('Server running at http://127.0.0.1:8888/');创建dockerfile文件。# vi /home/helloworld/Dockerfile# 使用欧拉安全的基础镜像 FROM euleros:21.1.0 # 创建用户和目录 RUN groupadd -g 9008 -r hello \ && useradd -u 9008 -m -d /home/hello hello -g hello \ && mkdir /home/hello/node \ && chown -R 9008:9008 /home/hello # 安装配置nodejs的二进制包 ADD node-v12.0.0-linux-x64.tar.gz /home/hello/node ENV NODE_HOME=/home/hello/node/node-v12.0.0-linux-x64 ENV PATH=$NODE_HOME/bin:$PATH # 拷贝应用所需的资源文件 COPY --chown=9008:9008 server.js /home/hello # 切换指定用户运行命令 USER hello WORKDIR /home/hello # 容器应用暴露的端口 EXPOSE 8888 # 容器中启动应用命令 CMD [ "node", "server.js" ]Dockerfile的文件详细说明请参考docker官网的资料:https://docs.docker.com/engine/reference/builder/。如何写出可读性更好的Dockerfile可参考华为云上的资料:如何编写高效的Dockerfile。使用dockerfile制作原生服务镜像。# docker build -t helloworld:0.1.0 ./其中:helloworld为原生服务镜像名称。0.1.0为原生服务镜像的tag。导出镜像文件。# docker save helloworld:0.1.0 | gzip > helloworld.tar.gz生成的helloworld.tar.gz即为镜像文件。
-
第二章:云原生基础设置之容器技术学习笔记容器发展背景企业IT业务云化路径传统业务云化:物理机部署云管平台统一管理 VS P2V/V2V虚拟化部署;业务云化创新:容器部署 VS 云原生容器:一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行。容器和虚拟机的区别:虚拟化层的位置和操作系统的使用方式。虚拟机通过hypervisor层提供硬件虚拟化的能力,允许多个操作系统和应用共享硬件,虚拟机上安装完成的OS,有完整的OS内核;所有容器共享一个hostOS。Docker:最常使用的容器引擎,2013年由dotCloud公司开源,GO语言编写,当前有Docker CE和Docker EE两个版本 容器关键技术介绍Open Container Initiative(OCI),制定开发的容器规范:runtime spec定义可移植性image format spec定义互操作性容器runtime:runtime与操作系统kernel紧密协作,为容器提供运行环境。不同公司有不同的runtime工具,但都符合OCI规范,如runC、rkt、Kata、gVisor等Docker Engine(Client/Server结构)Server又叫Daemon进程,长期运行的程序,创建和管理Docker对象( 镜像,容器,网络,卷)Rest API:Client与Daemon进程的通信接口Client(Docker CLI)使用REST API通过脚本或直接的CLI命令与Docker daemon交互 Container容器是从镜像创建的运行实例,它可以被启动、开始、停止、 删除。每个容器都是相互隔离的、保证安全的平台Docker容器通过namespace技术实现进程隔离,通过cgroup技术实现容器进程可用资源的限制。Namespace:命名空间,用于资源隔离,不同类型的namespace隔离不同的资源Cgroups:限制一个进程组对系统资源的使用上限,包括CPU、内存、Block I/O等,Cgroups还可以设置进程优先级,对进程进行挂起和恢复等操作。容器镜像Image是容器的模板,容器是镜像的运行实例,runtime根据容器镜像创建容器。容器镜像打包了整个操作系统的文件和目录(rootfs),也包括应用本身。所有容器共享宿主机Kernel,并且不能修改宿主机KernelUnionFS:Docker镜像分层结构的实现,借助于UnionFS联合文件系统的能力,UnionFS主要的功能是将多个不同位置的目录联合挂载(union mount)到同一个目录下。容器copy–on-write特性,对容器的增删改查操作容器数据卷:卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统;卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。挂在数据卷的方法:启动容器的时使用-v命令进行数据卷的挂载。在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷。Registry是注册服务器,docker hub就是一个超大的公共registry;Repository是仓库,docker repository一般存放的是一类镜像,这一类镜像只不过是 tag 版本不同。如下图: 如何使用Dockerfile构建镜像Dockerfile是一个文本文件,其内包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建容器镜像。Docker提供了两种构建镜像的方法:docker commit命令与dockerfile构建文件。Build命令生成docker image;run命令运行docker containerDockerfile文件中的指令执行后,会创建一个个新的镜像层。Dockerfile文件中的注释以”#”开始。Dockerfile一般由4部分组成:基础镜像信息、维护者信息、镜像操作指令、容器启动指令build context:为镜像构建提供所需的文件或目录。Dockerfile在执行过程中,会启动临时容器,然后在临时容器中执行一条指令对容器内容进行修改,再将该容器保存为镜像生成一个新的镜像层,最后删除这个临时容器。若dockerfile中有多条指令,则会重复这个过程,直到执行结束。常见镜像管理命令docker push:上传镜像到registry。docker pull:从registry下载镜像。docker rmi:删除本地镜像。docker images:显示本地镜像。docker search:搜索docker hub上的镜像。docker tag:为镜像标记tag。docker history:显示镜像构建过程。docker commit:将容器保存为镜像。docker build:从dockerfile创建镜像。 容器生命周期管理systemctl status docker.service:查看Docker engine状态docker run -d -p 8080:80 httpd:运行一个容器 (“-d”参数可在后台运行容器;“-p”参数将宿主机8080端口映射到容器80端口)docker ps:查看容器运行状态docker stop:停止一个容器docker start:启动一个容器docker pause:暂停一个容器docker unpause:恢复启动一个容器docker rm:删除一个容器docker attach:进入一个容器docker exec:进入同一个容器docker inspect:获取容器/镜像元数据docker top:查看容器中运行的进程信息docker events:从服务器获取实时事件docker port:列出指定的容器的端口映射docker cp:与主机之间进行数据拷贝docker容器的状态有7种:created(已创建)restarting(重启中)running(运行中)removing(迁移中)paused(暂停)exited(停止)dead(死亡)
-
【操作步骤&问题现象】按照https://bbs.huaweicloud.com/forum/thread-130529-1-1.html 链接下载eciot-ova_v1.2.rar,传到编译环境解压后,执行./build_sdk_base.sh 制作编译环境基础镜像成功但是执行./build_sdk.sh 制作最终编译镜像出错
-
镜像站地址:Index of java-local/jdk (huaweicloud.com)搜索不到
-
大赛简介openGauss是一款开源关系型数据库管理系统,采用木兰宽松许可证v2发行,鼓励社区贡献、合作。openGauss深度融合华为在数据库领域多年的经验,结合企业级场景需求,在架构、事务、存储引擎、优化器及ARM架构上进行了适配与优化,具有多核高性能、全链路安全性、智能运维等企业级特性,持续构建竞争力特性。赛题任务openGauss 下包括了多个开源项目和工具。本赛事围绕 openGauss 下的开源项目设计了不同类型的赛题,主要包括:01发现和解决Bug面向openGauss社区里面的所有仓库包括代码、文档等,寻找Bug,修复Bug并提交PR,以数量和重要性等级作为评判标准。作品提交(1)在竞赛平台GitLink上创建属于自己的项目镜像A第一步:从openGauss社区中选择希望参与的项目,拿到项目仓库地址,如下图示例:第二步:登录GitLink平台;第三步:按下图操作,将相应项目导入GitLink平台,创建属于自己的项目镜像A。其中,需要填写的“导入仓库ULR”为第一步中拿到的项目仓库地址。(2)在镜像项目A中提交发现的Bug在镜像项目A中的“疑修(Issue)”板块提交发现的Bug,包括Bug描述、Bug产生的场景等。(3)在镜像项目A中提交Bug解决代码在镜像项目A中针对发现的Bug,提出解决方案,并实现相应的代码。(4)将代码提交至项目根社区在大赛组织评审前,将最终作品提交至项目根社区对应项目中,项目根社区地址:https://gitee.com/opengauss。代码提交至根社区前需要签署 CLA ,签署地址:https://sourl.cn/SiH39B02提出特性需求并实现功能面向openGauss社区里面的所有仓库提交特性需求,完成特性实现并成功合并PR,以数量和重要性等级作为评判标准。作品提交(1)在竞赛平台GitLink上创建属于自己的项目镜像A第一步:从openGauss社区中选择希望参与的项目,拿到项目仓库地址,如下图示例:第二步:登录GitLink平台;第三步:按下图操作,将相应项目导入GitLink平台,创建属于自己的项目镜像A。其中,需要填写的“导入仓库ULR”为第一步中拿到的项目仓库地址。(2)在镜像项目A中提交特性需求在镜像项目A中的“疑修(Issue)”板块提交希望实现的特性需求。(3)在镜像项目A中提交特性需求的实现代码在镜像项目A中针对提交的特性需求,提出解决方案,并实现相应的代码。(4)将代码提交至项目根社区在大赛组织评审前,将最终作品提交至项目根社区对应项目中,项目根社区地址:https://gitee.com/opengauss。代码提交至根社区前需要签署 CLA ,签署地址:https://sourl.cn/SiH39B03实现周边原创工具面向openGauss社区里面的所有仓库提交特性需求,完成特性实现并成功合并PR,以数量和重要性等级作为评判标准。作品提交(1)在竞赛平台GitLink上创建属于自己的项目镜像A第一步:登录GitLink平台;第二步:按下图操作,将openGauss项目导入GitLink平台,创建属于自己的项目镜像A。其中,需要填写的“导入仓库ULR”为:https://gitee.com/opengauss/examples.git(2)在镜像项目A中提交代码到指定目录在镜像项目A中创建子目录“../XXX-examples”,其中“XXX”为个人姓名简写。然后将实现代码及相关文档提交到该目录下(3)将代码提交至项目根社区在大赛组织评审前,将最终作品提交至项目跟社区中。项目根社区地址:https://gitee.com/opengauss/examples代码提交至根社区前需要签署 CLA ,签署地址:https://sourl.cn/SiH39B04 基于openGauss实现原创应用基于openGauss的JDBC、ODBC等驱动实现一个应用系统,应用系统可以为C/S架构,B/S架构或者移动端应用等。要求应用系统为参赛者原创,以使用到的openGauss高级特性的数量作为评判标准。作品提交(1)在竞赛平台GitLink上创建属于自己的项目镜像A第一步:登录GitLink平台;第二步:按下图操作,将openGauss项目导入GitLink平台,创建属于自己的项目镜像A。其中,需要填写的“导入仓库ULR”为:https://gitee.com/opengauss/examples.git(2)在镜像项目A中提交代码到指定目录在镜像项目A中创建子目录“../XXX-examples”,其中“XXX”为个人姓名简写。然后将实现代码及相关文档提交到该目录下(3)将代码提交至项目根社区在大赛组织评审前,将最终作品提交至项目跟社区中。项目根社区地址:https://gitee.com/opengauss/examples代码提交至根社区前需要签署 CLA ,签署地址:https://sourl.cn/SiH39B参考资料及导师:[1] openGauss官方网站:https://opengauss.org[2] openGauss官方代码仓库:https://gitee.com/opengauss[3] openGauss内核仓库:https://gitee.com/opengauss/openGauss-server[4] openGauss文档仓库:https://gitee.com/opengauss/docs[5] openGauss应用案例仓库:https://gitee.com/opengauss/examples[6] openGauss JDBC接口:https://gitee.com/opengauss/openGauss-connector-jdbc[7] openGauss ODBC接口:https://gitee.com/opengauss/openGauss-connector-odbc项目导师:向新勇 xiangxinyong@huawei.com奖项设置本赛事设置多个获奖团队,其中一、二、三等奖及优胜奖的数量如下。名称数量奖金(税前)一等奖1项6万元人民币+获奖证书二等奖3项2.5万元人民币+获奖证书三等奖8项1万元人民币+获奖证书优胜奖排名前10%队伍获奖证书时间安排大赛采用全年开放、定期评比奖励、统一组织颁奖的模式组织,大赛主要时间节点安排如下: (一)大赛报名系统开放:2022年4月-11月;(二)比赛时间:2022年4-11月,持续组织报名参赛,持续发布赛事任务、开展培训,各赛事根据赛事特点分别举办热身赛、初赛、决赛等; (三)颁奖时间:2022年11月下旬。具体时间和参赛指南将持续发布到大赛官方平台。参赛指南1. 参赛对象全国高校教师、学生以及企业从业人员。大赛采用组队参赛形式,各参赛队伍由1名导师和不超过3名成员组成,导师可以为高校教师或企业专家。2. 赛事报名https://www.gitlink.org.cn/competitions/index/openGauss-01页面点击右上角“立即报名”按钮,进入报名页面,填写报名信息,报名参赛。报名一般流程如下:(1)创建战队:点击“创建战队”,填写战队名称,添加指导老师和队员,即可完成战队创建。(2)加入战队:点击“加入战队”,填入**,即可加入已有战队。注意:每名学生在每项赛事中只能参与1个战队,每名老师可以担任多个参赛小组的指导老师。(3)战队编辑:战队创建者可以在报名列表中对自己创建的战队进行编辑和修改,包括组员的添加、删除,指导老师的添加,战队名称的修改等。 3.作品提交本赛道要求参赛作品在官方竞赛平台“GitLink(确实开源)”上对应项目中提交,并定期将贡献同步到项目的根社区中,具体步骤已在各个赛题任务中注明。有任何问题欢迎联系openGauss小助手:openGauss-bot进行咨询。
-
【功能模块】【操作步骤&问题现象】1、按照ci持续集成文档成功打包mini镜像并在mdc上升级成功2、问题:1.mini镜像空间太小,加上相关依赖文件后内存满了,这个问题怎么解决?【截图信息】【日志信息】(可选,上传日志内容或者附件)
-
【功能模块】【操作步骤&问题现象】1、mini端python版本,以及第三方库不符合要求,怎么在mini端镜像中打包特定版本的python以及安装python三方库。【截图信息】【日志信息】(可选,上传日志内容或者附件)
-
Hello各位大咖!没错又是我,今天给大家分享Devcloud敏捷式CI/CD全流程实战! 首先我们拿凤凰商城项目当做Demo~照着文档跑通所有环节,最终成功部署发布我们的业务,如下图所示:看看我都做了哪些工作呢~?(1)确认代码无误后,执行我的构建任务,将代码打成镜像包,并把打好的镜像推送到SWR~(2)等待任务成功后,我们去SWR服务里确认一下战果~!没问题,他们都在~(3)接下来我们通过部署任务,把这些镜像包部署到我们的目标主机中~!(4)好啦,部署成功,我们去浏览器里访问一下我们的部署业务,在浏览器地址栏里输入我们的{主机公网ip}:{部署业务分配的端口号},比如作者这个就是http://119.3.219.79:5000~ 还不错,访问成功!(5)其实到了这里,我们的样例流程已经结束了~任务已OK! 但是咱们的目的仅仅是跑通案例嘛?NO~显然不是,接下来才是重点,我们要描述的是devcloud工具的细节,深度用法~助各位大咖小步快跑,快速迭代,解放双手!刚刚的流程只是把单个任务拆开,一个个的手工执行,这样显然是不够效率,下面我们通过流水线和任务配置,把流程自动化! (5.1)首先,我们新建一个流水线;依次添加源码仓库->构建任务->部署任务 (5.2)然后,我们进行流水线设置~在执行计划里选择代码提交时触发,添加我们要触发的分支,这样以后我们只要对该分支进行代码提交,就会触发流水线执行。 (5.3)说到这里,我插一句~ 经常有小伙伴问我,为什么更新代码并编译构建后,部署到机器里的包的版本仍然是旧的呢?这个问题,一般是以下2种原因造成的! 一.在流水线工作流配置中,构建和部署放到了同一阶段下,且阶段任务设置成了并行~ 这样的话,顾名思义,当阶段开始的时候,2个任务没有先后顺序,而是同时并行开跑,构建任务包还没做完,部署任务已经开始了,这样的话,每次部署的都是前一个版本的构建包。 二.部署任务的步骤配置当中,在“选择部署来源”这一步,把包的版本给固定死了,这样无论如何更新代码,部署的都是某一次的固定版本!下图2种都是固定案例~! 三.所以这时~我们应该这样选择,参考下图,把构建序号选成“Latest”,这样每次部署的都是最新一次的构建版本。 四.让我们更新下代码并触发流水线,然后耐心等待流水线执行完毕~Two thousand years later... 哎呦搞定,这么大个工程居然仅仅耗时4分钟,不得不感叹我们华为云的效率真是太高了,电视机前的朋友,还在等什么,快买吧~! 六.重新在浏览器里访问一下我们的业务,当当当当~ 验证成功,怎么样?这个工具可真好用啊,太效率了~
-
前文: Kubernetes的主要功能是容器编排,是指确保所有容器都按照计划运行在物理机或虚拟机上。这些容器在部署环境和集群配置的约束下被打包执行大量工作负载。此外,Kubernetes必须密切关注所有运行中的容器,替换运行中止,无响应或其他非正常状态的容器。 软件开发平台(DevCloud)是面向开发者提供的一站式云端DevOps平台,即开即用,随时随地在云端交付软件全生命周期,覆盖需求下发、代码提交、代码检查、代码编译、验证、部署、发布,打通软件交付的完整路径,提供软件研发流程的端到端支持,全面支撑落地DevOps。 本文着重介绍各位技术大咖在进行devcloud->部署->Kubernetes部署时,如何高效正确打通全流程参数化~ 废话不多说,下面开始手把手教学(*^▽^*)!! 首先我们介绍一下为什么要参数化~ 在敏捷开发,小步快跑的过程中,我们通过提交代码,执行各种各样的构建任务,编译打包镜像并上传到我们的华为云容器镜像服务SWR中,那么我们如何方便的管理我们的镜像呢?如果把镜像名称写成固定值,那么每次上传都会把旧版本覆盖掉,不利于我们的回滚和版本管理;而且我们的Kubernetes部署需要识别到yml文件的内容变动,部署后才会触发镜像更新!基于以上几点,参数化这个功能真是显得格外重要~ 下面我们开始图文并茂,直接上干货!持续集成嘛,提交代码的目的是为了打包编译,然后部署到目标集群,我们通过编译构建任务,新建步骤“制作镜像并推送到SWR仓库”,实现这个目的:我们试着构建一下~ 构建成功后,可以去容器镜像服务SWR里确认一下成果~!然后我们去部署服务里,新建kubernetes部署,按下图进行配置~同样~:我们在部署任务的参数设置中,也像构建那样,新建参数。接下来这步是重点哦,我们去代码仓库中的yml文件里,通过{{}}引用我们部署任务里的参数“version”下图是样例:接下来,我们通过流水线服务,把上述任务串起来~ 然后我们把流水线中的这个参数类型改为自增长,勾选"运行时设置",这样我们只需要首次执行流水线任务的时候给它赋予一个初始值,以后就会根据这个初始值进行自增长接下来,我们保存并执行一下这个流水线任务~(可以手动执行,也可以通过提交代码触发执行),然后静静的等待任务结束哎呦,部署成功了~我们看下执行参数是否成功取到了自增长的参数值。看起来没什么问题~ 因为我太菜~已经测试了4次OK!大功告成,最后我们去CCE集群的工作负载里检验一下最终成果!怎么样大咖们? 大家都学废,啊呸,大家都学会了嘛~ 请奔走相告~~
-
本文分享自华为云社区《解构华为云HE2E项目中的容器技术应用》,作者: 敏捷小智。 [华为云DevCloud HE2E DevOps实践](https://support.huaweicloud.com/bestpractice-devcloud/devcloud_practice_2000.html)当中,项目采用Docker技术进行构建部署。 容器技术应用,其实说简单也很简单,其流程无外乎:制作镜像——上传镜像——拉取镜像——启动镜像。 今天,我们就带大家**从容器技术应用的角度来解构HE2E项目**。 HE2E技术架构图:  # 创建项目 在华为云DevCloud中创建项目时选择DevOps样例项目,即可创建出预置了代码仓库、编译构建、部署等任务的DevOps样例项目,此项目即HE2E项目。  # 代码仓库 HE2E项目中预置了代码仓库phoenix-sample。  在根目录下可以看到images、kompose、result、vote、worker五个文件夹,以及LICENSE、README.md和docker-compose-standalone、docker-compose两个yml文件。Images文件夹存了几张图片,LICENSE和README也与代码内容无关,docker-compose.yml文件是应用于本地开发时的测试文件,这些都无需理会。 # 配置Kubectl的kompose文件夹 我们先看一下kompose文件夹,此文件夹下有多个yaml文件,通过命名可以看出这些文件是针对于每个微服务应用的配置。当我们进行CCE部署时就读取这里的配置(在部署时进行配置)。本着由浅入深的精神,本文先对ECS部署时所需的配置进行讲解,大家不要心急噢。  # 功能模块与制作镜像的Dockerfile result、vote、worker三个文件夹分别对应HE2E当中的三个功能模块:结果、投票、处理。   可以看到,三个文件夹下各自都有Dockerfile文件。制作镜像的时候就是靠这些Dockerfile文件来进行制作的。 我们以result下的Dockerfile进行举例说明:  FROM:定制的镜像都是基于 FROM 的镜像,这里的node:5.11.0-slim就是定制需要的基础镜像。后续的操作都是基于 node:5.11.0-slim。 WORKDIR /app:指定并创建工作目录/app。 RUN 命令>:执行命令>。 ADD 文件> 目录>:复制文件>至目录>。 5-9行:执行npm安装操作,并将相关文件存放入相应目录。 ENV PORT 80:定义环境变量PORT=80 EXPOSE 80:声明端口80。 CMD 命令>:在docker run时运行命令>。 在编译构建任务phoenix-sample-ci中,“制作Result镜像并推送到SWR仓库”步骤,通过“工作目录”、“Dockerfile路径”两个选项确定制作镜像时读取的Dockerfile:工作目录>/,即./result/Dockerfile。  其余的vote和worker两个功能模块也是按此种办法制作镜像。值得一提的是,worker文件夹下有Dockerfile、Dockerfile.j和Dockerfile.j2三个文件,但是在构建任务中,我们只需选择一个文件进行镜像制作,选择的是Dockerfile.j2这个文件。  在Dockerfile.j2文件中,将target下的内容复制到code/target下,但是target文件夹又并不在代码当中。这是因为worker下的项目是Java项目,target文件夹是在Maven构建的过程产生的,所以在构建任务phoenix-sample-ci中,制作Worker镜像之前需要先通过Maven进行构建。  通过以上的Dockerfile文件已经可以制作出三大功能模块对应的容器镜像了。在部署主机中,直接使用docker login、docker pull和docker run命令就可以登录、拉取并启动相应的镜像。但是这种方式要求对每个镜像都进行拉取和启动,不能一次性配置全部镜像。故此,我们引入了docker compose,通过docker compose实现对 Docker 容器集群的快速编排。一键(一个配置文件)配置本项目所需的各个功能模块。 # 配置docker-compose的docker-compose-standalone.yml文件 当我们部署本项目到服务器时,采取docker-compose的方式启动。 在部署任务phoenix-sample-standalone中,最终通过执行shell命令启动本项目: docker-compose -f docker-compose-standalone.yml up -d  这句shell命令中的docker-compose-standalone.yml正是我们代码仓库根目录的docker-compose-standalone.yml文件。 下面对docker-compose-standalone.yml文件进行解读。 version:指定本 yml 依从的 compose 哪个版本制定的。 services:包含的服务。 本yml中含有redis、db、vote、result、worker五个服务。其中db即数据库postgres。 image:镜像地址。 以redis和worker服务为例,其镜像为docker-server/docker-org/redis:alpine、docker-server/docker-org/worker:image-version,这里采用的是参数化替换的形式定义镜像地址的。 在构建任务phoenix-sample-ci中,“替换Docker-Compose部署文件镜像版本”步骤的shell命令正是将docker-compose-standalone.yml文件中的docker-server、docker-org、image-version三处替换为我们在该构建任务中定义的三个参数dockerServer、dockerOrg、BUILDNUMBER。 进行这样的替换以后,我们的docker-compose-standalone.yml中的镜像地址才会变成我们所需的最终地址。例:swr.cn-north-4.myhuaweicloud.com/devcloud-bhd/redis:alpine、swr.cn-north-4.myhuaweicloud.com/devcloud-bhd/worker:20220303.1。 五个服务中,vote、result、worker是本项目构建生成的,redis和db是采用第三方应用,所以在镜像版本方面会有区别。  ports:端口号。将容器和主机绑定到暴露的端口。 在vote当中ports: 5000:80就是将容器所使用的80端口号绑定到主机的5000端口号,这样我们就可以通过主机ip>:5000来访问本项目的用户端界面了。 networks:配置容器连接的网络。这里使用的是最简单的两种声明网络名称。 frontend即前端,backend即后端。 environment:添加环境变量。POSTGRES_HOST_AUTH_METHOD: "trust",此变量防止访问postgres时无法登录。 volumes:将主机的数据卷或着文件挂载到容器里。db-data:/var/lib/postgresql/data下的内容即成为postgres当中的数据内容。 deploy:指定与服务的部署和运行有关的配置。placement:constraints: [node.role == manager]即:权限设置为管理员。 depends_on:设置依赖关系。vote依赖redis、result依赖db。 至此,整个HE2E项目的代码结构已经解构完毕。 # 编译构建 其实在完成代码解构之后,整个项目已经非常清晰了。代码中包括vote、result、worker三个功能模块,项目还用到了redis和postgres两个第三方应用。所以,我们在编译构建环节的主要目的就是把这些服务的镜像制作出来并上传到SWR容器镜像仓库中。 本项目中预置了5个构建任务。  我们仅分析phoenix-sample-ci任务即可。  # 三个功能模块的构建 在进行代码解构时,对构建任务的部分内容已经进行过分析了,其中就包括如何通过指定Dockerfile文件制作镜像,即docker build(制作)的操作。除此之外,制作XX镜像并推送到SWR的步骤中还包括了推送镜像所需的信息。这里设置了推送区域、组织、镜像名字、镜像标签,其实就是我们进行docker tag(打标签)和docker push(推送)的操作。 在vote、result、worker的镜像制作并推送的过程中,通过参数BUILDNUMBER定义镜像的版本号。BUILDNUMBER是系统预定义参数,随着构建日期及次数变化。 worker镜像在制作之前,需要先对worker目录下的工程进行Maven构建,这样就会生成Dockerfile.j2中(制作镜像时)所需的target文件。 # Postgres和Redis的构建 在制作了三个功能模块镜像以后,接下来要做的是生成Postgres和Redis 镜像。这里选择的办法是,通过shell命令写出这两个应用的Dockerfile。 echo from postgres:9.4 > Dockerfile-postgres echo from redis:alpine > Dockerfile-redis 通过这段shell命令就会在当前的工作目录下生成Dockerfile-postgres和Dockerfile-redis两个文件。 Dockerfile-postgres: FROM postgres:9.4 Dockerfile-redis: FROM redis:alpine 在接下来的步骤当中,指定当前目录下的Dockerfile-postgres和Dockerfile-redis两个文件制作镜像并上传。  # 替换部署配置文件并打包 通过以上的步骤,镜像就已完全上传至SWR仓库了。后续的“替换Docker-Compose部署文件镜像版本”和“替换Kubernates部署文件镜像版本”两个步骤分别将代码仓根目录下的docker-compose-standalone.yml和kompose下的所有XX-deployment.yaml文件中的docker-server、docker-org、image-version替换为构建任务中的参数dockerServer、dockerOrg、BUILDNUMBER。这两步骤的意义就是将ECS部署(docker-compose/docker-compose-standalone.yml)和CCE部署(Kubernates/Kompose)所需的配置文件修改为可部署、可应用的版本。  这两个文件修改完毕后,都进行tar打包的操作。打包后的产物也通过接下来的两个“上传XX”步骤上传软件包到了软件发布库。 # Tips 在本项目的帮助文档中,提到了“配置基础依赖镜像”。整个这一段落是由于构建任务中使用的基础镜像源DockerHub拉取受限,采取了一个折中的办法拉取镜像。简言之,整段操作即通过创建prebuild任务来实现基础镜像版本的替换,以避免开发者在进行构建phoenix-sample-ci任务时出现拉取镜像失败的情形。相应地,也在“配置并执行编译构建任务”中禁用了Postgres和Redis镜像的制作步骤。 # 部署 在编译构建环节,我们已经成功将三个功能模块镜像(vote、result、worker)和两个第三方镜像构建并上传至SWR(容器镜像仓库)中了。接下来需要做的就是将SWR中的镜像拉取到我们的部署主机并启动。 在整个实践中,提供了ECS部署和CCE部署两种方式,并且在项目中预置了3个部署任务。  我们仅分析phoenix-sample- standalone任务即可。  # 传输软件包至部署主机中 在构建环节,我们除了制成镜像并上传到SWR以外,还对配置文件进行了修改、压缩并上传到了软件发布库。在部署过程中,我们首先要做的,就是把配置文件从软件发布库中传到部署主机当中。 结合实际的部署任务来看,就是:向[主机组] group-bhd部署一个[软件包/构建任务(的产物)],我们选择了[构建任务] phoenix-sample-ci的最新版本([构建版本][Latest])构建产物,将其[下载到主机的部署目录]。  这一步骤执行完毕后,在部署主机的/root/phoenix-sample-standalone-deploy路径下,就会存在之前构建任务中压缩的docker-stack.tar.gz和phoenix-sample-k8s.tar.gz。ECS部署中,我们仅需要解压docker-stack.tar.gz,这个文件是docker-compose-standalone.yml的压缩包(回顾一下构建任务中的“替换部署配置文件并打包”)。  # 通过执行shell命令启动docker-compose 解压完成后,我们就可以通过执行docker-compose启动命令来启动项目了。  在这一步骤当中,前三行分别输出了三个参数docker-username、docker-password、docker-server。这三个参数是用以进行docker login操作的。因为我们在docker-compose-standalone.yml中涉及到拉取镜像的操作,需要在拉取镜像前先登录SWR镜像仓库。 登录完毕后,就可以进入/root/phoenix-sample-standalone-deploy目录下(cd /root/phoenix-sample-standalone-deploy) 启动docker-compose(docker-compose -f docker-compose-standalone.yml up -d)。 至此,项目已经部署至主机当中,在主机中,通过docker ps -a指令可以看到5个容器进程。  与此同时,访问http://{ip}:5000和http://{ip}:5001即可访问项目的用户端与管理端。   # 结语 本文从容器技术应用的角度解构了HE2E项目的代码仓库配置、镜像构建、及docker-compose的部署方式。希望通过本篇文章分享可以使更多的开发者了解容器技术和华为云。
-
按照以上说明配置yum源,一直报错Failed to synchronize cache for repo 'base', ignoring this repo.ping不通 ping: http://repo.huaweicloud.com/euler/2.8/os/aarch64/: Name or service not known已自查下面三个原因均不是,请问是否是源失效了?/etc/resolv.conf未配置DNS地址或者DNS地址错误导致。/etc/nsswitch.conf文件删除DNS解析记录导致。/lib64/libnss_dns.so.2库文件丢失导致无法解析域名。
-
问题描述Linux弹性云服务器的静态主机名来源于创建弹性云服务器时,通过Cloud-init注入的用户自定义名称。虽然可以使用hostname命令更改Linux弹性云服务器的主机名,但如果重新启动弹性云服务器,它将自动还原为使用Cloud-init注入的用户自定义名称。在云服务器内部修改主机名虽然hostname命令可以修改Linux弹性云服务器的主机名,但是,如果您希望修改后的主机名在弹性云服务器关机、重启后仍然生效,需要将其写入相应的配置文件中,使之永久生效。假设修改后的主机名为“new_hostname”。修改配置文件“/etc/hostname”。执行以下命令,编辑配置文件“/etc/hostname”。sudo vim /etc/hostname修改配置文件,将文件中的主机名替换为修改后的主机名(new_hostname)。执行以下命令,保存并退出文件。:wq修改配置文件“/etc/sysconfig/network”。执行以下命令,编辑配置文件“/etc/sysconfig/network”。sudo vim /etc/sysconfig/network修改涉及“HOSTNAME”的参数值,将其设置为修改后的主机名(new_hostname)。HOSTNAME=修改后的主机名示例:HOSTNAME=new_hostname执行以下命令,保存并退出文件。:wq修改配置文件“/etc/cloud/cloud.cfg”。执行以下命令,编辑配置文件“/etc/cloud/cloud.cfg”。sudo vim /etc/cloud/cloud.cfg选择如下方法,修改配置文件。方法一:修改或添加“preserve_hostname”参数项。如果文件“/etc/cloud/cloud.cfg”中已有参数项“preserve_hostname: false”,将其修改为“preserve_hostname: true”即可。如果文件“/etc/cloud/cloud.cfg”中没有该参数项,需在“cloud_init_modules”模块前,添加语句preserve_hostname: true。选择方法一,弹性云服务器关机、重启后,修改后的主机名(new_hostname)仍然生效。但是,如果使用该弹性云服务器制作私有镜像,并使用生成的镜像重新创建弹性云服务器,则新创建的弹性云服务器的主机名即为私有镜像使用的主机名(new_hostname),不能通过Cloud-init重新注入用户自定义名称。方法二(推荐):删除或者注释语句- update_hostname。选择方法二,弹性云服务器关机、重启后,修改后的主机名(new_hostname)仍然生效。但是,如果使用该弹性云服务器制作私有镜像,并使用生成的镜像重新创建弹性云服务器,用户可以通过Cloud-init注入用户自定义名称(如new_new_hostname),并通过本节内容长久有效地修改静态主机名。执行以下命令,重启弹性云服务器。sudo reboot执行以下命令,验证主机名的修改是否永久生效。sudo hostname如果回显的内容是修改后的主机名(new_hostname),则表示主机名修改成功,永久生效。
-
请问能否提供环境镜像便于选手调试呢提交c++代码后显示程序编译异常,本地环境为gcc 7.3.0 cmake 3.22.1,build.sh无修改且能正常编译,所有源代码文件均使用utf-8(unix)保存,且不论是\r\n和\n做换行均编译异常,代码未使用除c++标准库及STL库以外的库,上传文件使用CodeCraft_zip.sh打包。提交人:hw050901030,提交时间:2022-04-01 13:50:53
推荐直播
-
华为云码道-玩转OpenClaw,在线养虾2026/03/11 周三 19:00-21:00
刘昱,华为云高级工程师/谈心,华为云技术专家/李海仑,上海圭卓智能科技有限公司CEO
OpenClaw 火爆开发者圈,华为云码道最新推出 Skill ——开发者只需输入一句口令,即可部署一个功能完整的「小龙虾」智能体。直播带你玩转华为云码道,玩转OpenClaw
回顾中 -
华为云码道-AI时代应用开发利器2026/03/18 周三 19:00-20:00
童得力,华为云开发者生态运营总监/姚圣伟,华为云HCDE开发者专家
本次直播由华为专家带你实战应用开发,看华为云码道(CodeArts)代码智能体如何在AI时代让你的创意应用快速落地。更有华为云HCDE开发者专家带你用码道玩转JiuwenClaw,让小艺成为你的AI助理。
回顾中 -
Skill 构建 × 智能创作:基于华为云码道的 AI 内容生产提效方案2026/03/25 周三 19:00-20:00
余伟,华为云软件研发工程师/万邵业(万少),华为云HCDE开发者专家
本次直播带来两大实战:华为云码道 Skill-Creator 手把手搭建专属知识库 Skill;如何用码道提效 OpenClaw 小说文本,打造从大纲到成稿的 AI 原创小说全链路。技术干货 + OPC创作思路,一次讲透!
回顾中
热门标签