云服务器内容精选

  • 操作场景 容器镜像服务企业版支持与其他仓库之间同步容器镜像,可实现单点推送及全球自动同步分发,方便企业在全球多个地域快速部署更新容器业务。当前支持与如下类型仓库之间同步: 容器镜像服务:即SWR共享仓库中的镜像。 容器镜像服务企业版:支持华为云不同地域的企业仓库以及客户基于开源harbor搭建的私有仓库。 镜像同步功能允许用户自定义创建同步规则,可指定某个仓库内的部分资源同步至另一个仓库内的命名空间。例如,用户可选择同步资源类型(容器镜像、Helm Chart、或是全部同步),通过正则表达式过滤镜像及版本,可选择是否覆盖已有的同名镜像,避免历史数据覆盖丢失。
  • 设置访问控制与域名解析 公网访问 设置公网访问控制和域名解析,您可以使用公网并通过自定义域名的方式访问SWR仓库。配置公网的访问控制,详情请参考配置公网访问。 进入云解析服务控制台。 在左侧树状导航栏,选择“公网域名”, 进入域名列表页面。 【可选】如果没有自定义域名后缀的公网域名, 单击右上角的“创建公网域名”,输入域名,单击“确定”。 单击您的域名名称进入详情页。 单击“添加记录集”,进入“添加记录集”页面设置参数,然后单击“确定”。 表1 添加记录集参数设置 参数 配置 主机记录 输入自定义域名的前缀。 类型 CNAME。 线路类型 指域名访问者所在的地区和使用的运营商网络,本例中为全网默认。 TTL 为缓存时间,数值越小,修改记录各地生效时间越快,默认为5分钟。 值 设置为仓库的默认域名。 内网访问 设置内网访问控制和内网域名,您可以在指定VPC内的云服务器通过内网拉取SWR仓库中的镜像。配置内网访问控制,详情请参考配置内网访问。 进入云解析服务控制台。 在左侧树状导航栏,选择“内网域名”, 进入域名列表页面。 【可选】如果没有自定义域名后缀的内网域名, 单击右上角的“创建内网域名”,输入域名,选择区域,以及与仓库打通网络的VPC,单击“确定”。 单击您的域名名称进入详情页。 单击“添加记录集”,进入“添加记录集”页面设置参数,然后单击“确定”。 表2 添加记录集参数设置 参数 配置 主机记录 输入自定义域名的前缀 类型 CNAME 线路类型 指域名访问者所在的地区和使用的运营商网络,本例中为全网默认。 TTL 为缓存时间,数值越小,修改记录各地生效时间越快,默认为5分钟。 值 设置为仓库的默认域名。
  • 前提条件 需要开通云服务:云解析服务 DNS、云证书管理服务(Cloud Certificate Manager,CCM)。 欲使用域名管理功能,您的账户需要具备查询证书列表权限(scm:cert:list)以及证书导出的权限(scm:cert:export)。 已拥有域名。您可以通过域名注册服务注册域名,详细介绍请参见什么是域名注册服务?。 如果您的SWR仓库在中国境内,那么如果您要在公网环境中使用自定义域名,则域名需要备案。如果您的SWR仓库在境外,则域名无需备案。 已为域名签发证书。您可通过云证书管理CCM服务购买证书,并确认已绑定仓库需要使用的自定义域名。
  • 操作步骤 登录云容器引擎CCE控制台。 在左侧导航栏上单击“插件市场”。 在插件市场页面上方搜索框输入“cosign”并搜索。 在下方的搜索结果中找到“容器镜像签名验证”插件,单击“安装”。 填写“安装插件”页面的相关参数。 选择集群:选择镜像所在集群。该插件只能在K8S V1.23及以上版本集群上安装。 对集群某个命名空间进行镜像验签时,需要先为该命名空间添加 policy.sigstore.dev/include:true 标签。 选择版本:选择插件版本 规格配置 单仓库:当前插件只支持在1个仓库上使用。 高可用:当前插件支持在2个仓库上使用。 自定义:自定义仓库数、CPU配额、容器配额。 表1 swr-cosign插件规格配置 参数 参数说明 插件规格 该插件可配置“单实例”、“高可用”或“自定义”规格。 实例数 选择上方插件规格后,显示跟插件规格匹配的实例数。 选择“自定义”规格时,您可根据需求调整插件实例数。 容器 选择“自定义”规格时,您可根据需求调整插件实例的容器规格。 参数配置 KMS密钥:选择一个创建非对称密钥中创建好的密钥。 验签镜像:单击,选择需要验签的镜像。 表2 swr-cosign插件参数配置 参数 参数说明 KMS密钥 选择一个密钥,仅支持 EC_P256、EC_P384、SM2 类型的密钥。 您可以前往密钥管理服务新增密钥。 验签镜像 验签镜像地址通过正则表达式进行匹配,例如填写docker.io/**表示对docker.io镜像仓库的镜像进行验签。如需对所有镜像验签,请填写**。 填写完成后,单击“安装”。 待插件安装完成后,选择对应的集群,然后单击左侧导航栏的“插件中心”,可筛选“已安装插件”查看相应的插件。
  • 添加命名空间标签 登录容器镜像服务控制台,单击左侧菜单栏“企业版”。 选中要添加命名空间标签的仓库,单击仓库名称,进入仓库详情页。 单击仓库详情页左侧导航栏“命名空间”,进入命名空间列表页。单击页面右上角的图标,以列表形式展示命名空间列表。 选择要添加标签的命名空间,单击右侧“标签管理”,进入标签管理页面。 图1 命名空间管理列表页 在标签管理页面,单击,新增一个标签。 图2 标签管理 参考标签命名规则,填写标签的键和值。
  • 使用Helm客户端上传及下载Helm Chart 安装Helm客户端 本文以在Linux操作系统的节点上安装为例,如在其他平台安装请下载对应安装包。 依次执行以下命令,下载并安装Helm客户端。关于安装Helm的更多信息,请参见Installing Helm。 curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 chmod 700 get_helm.sh ./get_helm.sh “get_helm.sh”脚本会自动拉取最新的Helm版本进行安装,如需安装其他版本,请从官方下载需要的Helm版本。 推送Helm Chart 安装Helm Push插件。 在安装Helm Push插件前,需要预先安装Git。 helm plugin install https://github.com/chartmuseum/helm-push 在节点上执行如下命令,创建一个Chart。 helm create [Chart名称] 示例:helm create chart-demo 执行如下命令,推送指定目录至Chart仓库。 helm push [Chart名称] [本地仓库名称] 示例: helm push chart-demo group 您还可以将Chart文件打包为tgz压缩包,然后直接上传。 helm push [Chart名称]-[Chart版本].tgz [本地仓库名称] 示例: tar zcvf chart-demo-1.0.0.tgz chart-demo/ # 压缩Chart文件 helm push chart-demo-1.0.0.tgz group # 上传Chart压缩包 下载Helm Chart 在节点上执行如下命令,更新本地仓库Chart信息。 helm repo update 下载指定版本Chart。 helm pull [本地仓库名称]/[Chart名称] --version [Chart版本] 示例: helm pull group/chart-demo --version 1.0.0
  • 背景信息 Kubernetes提供了统一模式的API,能以YAML格式的文件定义Kubernetes集群中的资源,包括Pod、Service、Deployment、StatefulSet、Job等等。这些资源种类繁多,且分散的kubernetes应用配置文件难以管理、编辑和更新,因此云原生社区衍生了一个更高维度的概念及其实现工具,即Chart和Helm。 Chart是描述相关的一组Kubernetes集群内资源的文件集合。 Helm是一个命令行程序,用于管理这些Chart,以及其运行态Release。 容器镜像服务企业版支持Helm客户端实现Chart的上传和下载。
  • 创建签名规则 登录容器镜像服务控制台,单击左侧菜单栏“企业版”,然后单击仓库名称进入仓库详情页面。 在左侧导航栏选择“ 镜像签名”。 在右上角单击“创建签名规则”。 填写具体规则。 表2 参数说明 参数名称 说明 示例 规则名称 镜像签名规则的名称。 SignatureRule 命名空间 选择要签名的镜像所在的命名空间。 library 规则范围 镜像:镜像名称,默认使用正则表达式。单击可手动选择镜像。 正则表达式规则可填写如nginx-*、{repo1, repo2} 等,其中: *:匹配不包含路径分隔符“/”的任何字段。 **:匹配包含路径分隔符“/”的任何字段。 ?:匹配任何单个非“/”的字符。 {选项1, 选项2, ...}:同时匹配多个选项。匹配上其中一个即可。 版本:镜像的版本,同样使用正则表达式,匹配规则与镜像名称相同。 nginx-*:表示匹配“nginx-”开头的镜像。 签名方式 当前支持使用KMS签名。 KMS 签名Key 选择在创建非对称密钥中创建的密钥。 key1 触发模式 手动:手动触发,规则创建完成后需要您手动单击执行。 事件触发 + 手动:事件触发指当有新镜像上传到仓库且符合匹配规则时触发镜像签名。 事件触发 + 手动 规则描述 规则的描述信息。 - 图2 创建签名规则 单击“确定”完成规则创建。
  • 创建非对称密钥 登录数据加密服务控制台。 在左侧导航栏选择“密钥管理”,单击右上角的“创建密钥”。 在“创建密钥”对话框中配置参数,然后单击“确定”。 镜像签名功能需要非对称密钥算法的支持,创建密钥时,密钥算法需选择EC、RSA或SM2类型,详情请见表1。其他参数配置请参见创建密钥。 图1 创建密钥 表1 容器镜像服务支持的密钥算法类型 密钥类型 算法类型 密钥规格 说明 用途 非对称密钥 RSA RSA_2048 RSA_3072 RSA_4096 RSASSA_PSS_SHA_256 RSASSA_PSS_SHA_384 RSASSA_PSS_SHA_512 RSASSA_PKCS1_V1_5_SHA_256 RSASSA_PKCS1_V1_5_SHA_384 RSASSA_PKCS1_V1_5_SHA_512 RSA非对称密钥 小量数据的加解密或数字签名。 非对称密钥 ECC EC_P256 ECDSA_SHA_256 EC_P384 ECDSA_SHA_384 椭圆曲线密码,使用NIST推荐的椭圆曲线 数字签名 非对称密钥 SM2 SM2 国密SM2非对称密钥 小量数据的加解密或数字签名。
  • 创建命名空间 登录容器镜像服务控制台,单击左侧菜单栏的“企业版”,在“仓库管理”页面单击您的仓库名称进入仓库。 在左侧导航栏单击“命名空间”。 在右上角单击“创建命名空间”。 填写命名空间名称,选择命名空间类型。 图1 创建命名空间 公有命名空间:允许任何用户登录后下载命名空间内的制品,如需其他操作需在IAM上为用户授权。 私有命名空间:需在IAM上为用户授权才可以对命名空间内的制品进行操作。 单击“确定”。 命名空间创建成功后,您可以选择列表视图或卡片视图查看命名空间详情,在右上角单击或图标进行视图切换。
  • 使用华为云开源镜像配置yum源 yum,是一个专门为了解决包的依赖关系而存在的软件包管理器。如同 Windows 系统上可以通过各类“软件管家”实现软件的一键安装、升级和卸载,Linux 系统也提供有这样的工具,这就是 yum。 从华为云开源镜像站获取yum源的方式如下: 进入开源镜像站首页。 选择“操作系统类”,筛选镜像;或者直接搜索目标镜像。 单击镜像卡片,根据弹出界面描述配置使用操作系统yum源;或者跳转至下载目录页面,下载操作系统镜像。以CentOS为例,如下图所示。 根据界面配置方法,可以配置使用操作系统yum源。 CentOS-9 stream 的镜像地址为:https://repo.huaweicloud.com/centos-stream/ 1、备份配置文件: cp -a /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak 2、配置下列方案。 方案: 下载新的CentOS-Base.repo文件到/etc/yum.repos.d/目录下,选择 CentOS 版本:CentOS 8-stream/CentOS 7 执行如下命令: wget -O /etc/yum.repos.d/CentOS-Base.repo https://repo.huaweicloud.com/repository/conf/CentOS-7-anon.repo 3、执行yum clean all清除原有 yum 缓存。 4、执行yum makecache(刷新缓存)或者yum repolist all(查看所有配置可以使用的文件,会自动刷新缓存)。 CentOS 8和CentOS 6 及以下版本已被官网源下线, 若需使用, 请参考 CentOS-Vault 进行配置。 常见镜像源在华为云ECS中的使用请参见镜像源管理。 父主题: 使用与配置华为云开源镜像
  • 步骤三:本地验证 启动docker容器 docker run -u 1003:1003 -p 8000:8000 custom_container_event_example:latest 打开一个新的命令行窗口,向开放的8000端口发送消息,访问模板代码中指定的/init路径 curl -XPOST -H 'Content-Type: application/json' localhost:8000/init 按照模块代码中返回 Hello init 打开一个新的命令行窗口,向开放的8000端口发送消息,访问模板代码中指定的/invoke路径 curl -XPOST -H 'Content-Type: application/json' -d '{"message":"HelloWorld"}' localhost:8000/invoke 按照模块代码中返回 Hello invoke 在容器启动端口可以看到 Listening on http://localhost:8000 receive {} receive { message: 'HelloWorld' } 或者使用docker logs命令获取容器的日志
  • Notebook自定义镜像故障基础排查 当制作的自定义镜像使用出现故障时,请用户按照如下方法排查: 用户自定义镜像没有ma-user用户及ma-group用户组; 用户自定义镜像中/home/ma-user目录,属主和用户组不是ma-user和ma-group; 用户自定义镜像必须满足用户目录/home/ma-user权限为750,不能为其他权限; 用户自定义镜像使用远程SSH功能,OpenSSH版本要兼容或高于8.0; 用户制作的自定义镜像,在本地执行docker run启动,无法正常运行; 用户自行安装了Jupyterlab服务导致冲突的,需要用户本地使用Jupyterlab命令罗列出相关的静态文件路径,删除并且卸载镜像中的Jupyterlab服务; 用户自己业务占用了开发环境官方的8888、8889端口的,需要用户修改自己的进程端口号; 用户的镜像指定了PYTHONPATH、sys.path导致服务启动调用冲突的,需在实例启动后,再指定PYTHONPATH、sys.path; 用户使用了已开启sudo权限的专属池,使用自定义镜像时,sudo工具未安装或安装错误; 用户使用的cann、cuda环境有兼容性问题; 用户的docker镜像配置错误、网络或防火墙限制、镜像构建问题(文件权限、依赖缺失或构建命令错误)等原因导致的。 父主题: Notebook中使用自定义镜像
  • 创建AI应用的自定义镜像规范 针对您本地开发的模型,在制作AI应用的自定义镜像时,需满足ModelArts定义的规范。 自定义镜像中不能包含恶意代码。 自定义镜像大小不超过50GB。 对于同步请求模式的AI应用,如果预测请求时延超过60s,会造成请求失败,甚至会有服务业务中断的风险,预测请求时延超过60s时,建议制作异步请求模式的镜像。 镜像对外接口 设置镜像的对外服务接口,推理接口需与config.json文件中apis定义的url一致,当镜像启动时可以直接访问。下面是mnist镜像的访问示例,该镜像内含mnist数据集训练的模型,可以识别手写数字。其中listen_ip为容器IP,您可以通过启动自定义镜像,在容器中获取容器IP。 请求示例 curl -X POST \ http://{listen_ip}:8080/ \ -F images=@seven.jpg 图1 listen_ip获取示例 返回示例 {"mnist_result": 7} (可选)健康检查接口 如果在滚动升级时要求不中断业务,那么必须在config.json文件中配置健康检查的接口,供ModelArts调用,在config.json文件中配置。当业务可提供正常服务时,健康检查接口返回健康状态,否则返回异常状态。 如果要实现无损滚动升级,必须配置健康检查接口。 自定义镜像如果需要在“在线服务”模块使用OBS外部存储挂载功能,需要新建一个OBS挂载专属目录如“/obs-mount/”,避免选择存量目录覆盖已有文件。OBS挂载仅开放对挂载目录文件新增、查看、修改功能不支持删除挂载目录文件对象,若需要删除文件请到OBS并行文件系统中手动删除。 健康检查接口示例如下。 URI GET /health 请求示例curl -X GET \ http://{listen_ip}:8080/health 响应示例 {"health": "true"} 状态码 表1 状态码 状态码 编码 状态码说明 200 OK 请求成功 日志文件输出 为保证日志内容可以正常显示,日志信息需要打印到标准输出。 镜像启动入口 如果需要部署批量服务,镜像的启动入口文件需要为“/home/run.sh”,采用CMD设置默认启动路径,例如Dockerfile如下: CMD ["sh", "/home/run.sh"] 镜像依赖组件 如果需要部署批量服务,镜像内需要安装python、jre/jdk、zip等组件包。 (可选)保持Http长链接,无损滚动升级 如果需要支持滚动升级的过程中不中断业务,那么需要将服务的Http的“keep-alive”参数设置为200s。以gunicorn服务框架为例,gunicorn缺省情形下不支持keep-alive,需要同时安装gevent并配置启动参数“--keep-alive 200 -k gevent”。不同服务框架参数设置有区别,请以实际情况为准。 (可选)处理SIGTERM信号,容器优雅退出 如果需要支持滚动升级的过程中不中断业务,那么需要在容器中捕获SIGTERM信号,并且在收到SIGTERM信号之后等待60秒再优雅退出容器。提前优雅退出容器可能会导致在滚动升级的过程中业务概率中断。要保证容器优雅退出,从收到SIGTERM信号开始,业务需要将收到的请求全部处理完毕再结束,这个处理时长最多不超过90秒。例如run.sh如下所示: #!/bin/bash gunicorn_pid="" handle_sigterm() { echo "Received SIGTERM, send SIGTERM to $gunicorn_pid" if [ $gunicorn_pid != "" ]; then sleep 60 kill -15 $gunicorn_pid # 传递 SIGTERM 给gunicorn进程 wait $gunicorn_pid # 等待gunicorn进程完全终止 fi } trap handle_sigterm TERM 父主题: 使用自定义镜像创建AI应用(推理部署)
  • 制作新镜像 连接容器镜像服务。 登录容器镜像服务控制台。 选择左侧导航栏的“总览”,单击页面右上角的“登录指令”,在弹出的页面中单击复制登录指令。 图1 获取登录指令 此处生成的登录指令有效期为24小时,若需要长期有效的登录指令,请参见获取长期有效登录指令。获取了长期有效的登录指令后,在有效期内的临时登录指令仍然可以使用。 登录指令末尾的域名为镜像仓库地址,请记录该地址,后面会使用到。 在安装容器引擎的机器中执行上一步复制的登录指令。 登录成功会显示“Login Succeeded”。 拉取基础镜像或第三方镜像(此处以基础镜像举例,第三方镜像直接替换镜像地址)。 拉取ModelArts提供的公共镜像(请参考预置镜像)。 docker pull swr.cn-north-4.myhuaweicloud.com/atelier/notebook2.0-pytorch-1.4-kernel-cp37:3.3.3-release-v1-20220114 编写Dockerfile。 vim一个Dockerfile,如果使用的基础镜像是ModelArts提供的公共镜像,Dockerfile的具体内容可参考Dockerfile文件(基础镜像为ModelArts提供)。 如果使用的基础镜像是第三方镜像(非ModelArts提供的公共镜像),Dockerfile文件中需要添加uid为1000的用户ma-user和gid为100的用户组ma-group,具体可参考Dockerfile文件(基础镜像为非ModelArts提供)。 本例的Dockerfile将基于PyTorch基础镜像安装pytorch 1.8, ffmpeg 3和gcc 8,构建一个面向AI任务的镜像。 构建镜像 使用docker build命令从Dockerfile构建出一个新镜像。命令参数解释如下: “-t” 指定了新的镜像地址,包括{局点信息}/{组织名称}/{镜像名称}:{版本名称},请根据实际填写。建议使用完整的swr地址,因为后续的调试和注册需要使用。 “-f ”指定了Dockerfile的文件名,根据实际填写。 最后的“ . ”指定了构建的上下文是当前目录,根据实际填写。 docker build -t swr.cn-north-4.myhuaweicloud.com/sdk-test/pytorch_1_8:v1 -f Dockerfile . 图2 构建成功