华为云用户手册

  • 操作步骤 创建组件。 调用创建组件接口,请求示例如下: curl -k -H "Content-Type:application/json" -H "X-Environment-ID: $env_id" -H "X-Auth-Token:$Token" -X POST "https://{cae_endpoint}v1/{project_id}/cae/applications/{application_id}/components" -d '{ "api_version": "v1", "kind": "Component", "metadata": { "name": "demo-jar", "annotations": { "version": "1.0.0" } }, "spec": { "runtime": "Java8", "build": { "archive": { "artifact_namespace": "target_namespace" }, "parameters": { "base_image": "openjdk:8u181-jdk-alpine", "build_env": "java-8" } }, "source": { "type": "softwarePackage", "sub_type": "BinObs", "url": "https://xx/demo.jar" }, "resource_limit": { "cpu_limit": "500m", "memory_limit": "1Gi" }, "replica": 1 }}' 返回结果: { "api_version": "v1", "kind": "Component", "metadata": { "id": "908aabb3-0b50-4116-8e83-a6933ec1884c", "name": "demo-jar", "annotations": { "version": "1.0.0" }, "created_at": "2022-07-05T08:28:24.4885176Z", "updated_at": "2022-07-05T08:28:24.4885176Z" }, "spec": { "runtime": "Java8", "env_id": "50d18173-5df0-4db4-a2b6-8a428d42146b", "replica": 1, "source": { "type": "softwarePackage", "sub_type": "BinObs", "url": "https://xx/demo.jar" }, "build": { "archive": { "artifact_namespace": "target_namespace" }, "parameters": { "base_image": "xxx" } }, "access_info": null, "image_url": "", "available_replica": 0, "status": "", "build_log_id": "" }} 得到的job_id,可以通过job_id获取对应的创建的状态。
  • 错误码 当您调用API时,如果遇到“APIGW”开头的错误码,请参见API网关错误码进行处理。 类型 状态码 错误码 错误信息 描述 处理措施 访问方式 500 CAE.01500101 Remote creates access failed. 访问方式创建失败 需要联系技术支持工程师,检查报错具体内容。 500 CAE.01500102 Remote updates access failed. 访问方式更新失败 需要联系技术支持工程师,检查报错具体内容。 500 CAE.01500103 Remote deletes access failed. 访问方式删除失败 需要联系技术支持工程师,检查报错具体内容。 500 CAE.01500104 Delete ip group failed. 删除ip地址组失败 需要联系技术支持工程师,检查依赖服务是否正常。 500 CAE.01500107 ELB service connect failed. 访问ELB连接失败 需要联系技术支持工程师,检查依赖服务是否正常。 组件 500 CAE.01500201 Update component status failed. 更新组件状态失败 重试,组件状态展示正常。若有异常,联系技术支持工程师。 500 CAE.01500202 Execute component action failed. 操作组件失败 联系技术支持工程师,检查组件基本信息。 500 CAE.01500203 Get component config failed. 获取组件配置失败 联系技术支持工程师,一般为报文解析异常 500 CAE.01500204 Get component event failed. 获取组件事件失败 联系技术支持工程师,检查依赖服务是否正常。 400 CAE.01500206 The component name is invalid. 组件名称非法 根据要求修改组件名称。 400 CAE.01500205 The input component name already exists in the application. 当前应用存在同名组件 同一应用不能存在同名组件,根据要求修改组件名称。 400 CAE.01500211 Data type of imported configuration variable is not string. 下发组件配置类型非法 根据要求修改组件配置类型。 400 CAE.01500208 Component not exist. 组件不存在 确认操作组件是否正确,根据要求修改组件ID。 400 CAE.01500207 Component instance is exist. 组件实例有残留 删除组件实例失败,联系技术支持工程师。 应用 400 CAE.01500212 There are components under application, delete operation is forbidden. 当前应用存在组件,禁止删除应用 需删除所有组件才能删除应用。 404 CAE.01500213 App not exist. 应用不存在 确认操作应用是否正确,联系技术支持工程师。 环境 400 CAE.01500303 Engine with basic not found. 环境基础信息未找到 联系技术支持工程师。 500 CAE.01500301 Engine status is unavailable. 环境状态不可用 联系技术支持工程师。 400 CAE.01500311 Engine is already exist. 环境已存在 联系技术支持工程师。 500 CAE.01500302 Create engine failed. 创建环境失败 联系技术支持工程师。 500 CAE.01500401 Create environment failed. 创建环境失败 联系技术支持工程师。 500 CAE.01500402 Delete environment failed. 删除环境失败 联系技术支持工程师。 500 CAE.01500403 Env is deleting. 环境正在被删除 等待环境删除完成。 500 CAE.01500404 Environment not found. 环境不存在 查询环境是否存在。 400 CAE.01500405 The environment has unbound cloud storage resource. 环境存在未绑定的 云存储 资源 联系技术支持工程师。 400 CAE.01500406 There are applications under environment, delete operation is forbidden. 环境下存在应用,不允许删除环境。 删除应用后再删除环境。 400 CAE.01500407 The environment cannot be deleted because the event notice rule still exists. 环境存在事件通知规则。 删除事件通知规则后重试。 400 CAE.01500408 Environment cannot be deleted, as there are un-deleted network configurations in system settings. 环境下系统设置中存在系统网络配置,不允许删除环境。 删除系统设置下的系统网络配置,再删除环境。 400 CAE.01500409 VPC id is inconsistent with the vpc id of environment. vpc ingress/egress配置的vpc id和环境选择的vpc id不一致。不允许创建系统网络配置。 在CAE概览界面查看环境所在VPC(虚拟私有云),选择一致的VPC再创建系统网络配置。 400 CAE.01500410 VPC ingress can not be deleted, as some components is using vpc access. 系统网络配置下的"VPC访问CAE环境"不允许删除,因为还有组件在使用。 确认组件是否还需要继续使用,如果需要则不允许删除,如果不需要则在组件配置中删除后重试。 400 CAE.01500411 Current environment is too old, can not retry, you can delete the environment and create a new environment. 创建环境时报错:当前环境版本过低,不允许重试。请删除环境后重新创建新环境。 删除环境后重新创建。 500 CAE.01500412 Get embedded cidrs failed. 创建"CAE环境访问VPC"配置,获取内置网段失败。 联系技术支持工程师。 400 CAE.01500413 The environment cannot be deleted because it still has sub environments. 环境不能删除,因为还有其他子环境未删除。 删除子环境后再删除当前环境。 任务 500 CAE.01500501 Retry job failed. 重试任务失败 查看任务状态,任务状态失败或者超时方可重试。 云存储 500 CAE.01500601 Creates volume failed. 创建磁盘挂载失败 联系技术支持工程师。 500 CAE.01500602 Deletes volume failed. 删除磁盘挂载失败 联系技术支持工程师。 400 CAE.01500603 Conflicts with another volume or log path under component. 与同组件下云存储配置路径或日志采集路径冲突。 检查云存储配置路径或日志采集路径,修改冲突路径。 400 CAE.01500604 AK SK is invalid. ak sk无效 刷新页面重试。若仍然有异常,联系技术支持工程师。 配额 400 CAE.01500712 Quota is insufficient. 配额不足 联系技术支持工程师添加配额。 500 CAE.01500701 Increase used failed. 配额使用量增加修改失败 联系技术支持工程师。 500 CAE.01500702 Decrease used failed. 配额使用量减少修改失败 联系技术支持工程师。 500 CAE.01500703 Get quota failed. 获取配额失败 联系技术支持工程师。 委托 500 CAE.01500801 Service domain error, get service token failed. 获取服务token失败 联系技术支持工程师,检查服务依赖服务及配置项。 500 CAE.01500802 Switch token error, check iam service status. 转换token失败 重试,仍然失败则联系技术支持工程师,检查服务依赖服务及配置项。 500 CAE.01500803 Grant agency roles error, check iam service status or iam strategy. 授权失败 联系技术支持工程师,检查服务依赖服务及配置项。 500 CAE.01500804 Create or update agency failed, check if iam is ok. 创建或更新委托时失败 联系技术支持工程师,检查服务依赖服务 IAM 及相关配置项。 401 CAE.01500805 Get token by agency failed, agency is not exist. 项目里缺少委托或角色 联系技术支持工程师,检查IAM中委托及角色。 401 CAE.01500806 Not a domain user, or no security administrator role. 账号权限不足 检查当前IAM账号权限。 403 CAE.01500807 Roles in the agency for cae not enough, please re-create cae agency. CAE的委托中缺少部分部分服务访问权限 检查CAE相关委托中是否包含所有服务访问权限,可通过删除委托重建解决。 资源租户 500 CAE.01500901 Get resource tenant token failed, check if iam is ok. 获取资源租户token失败 联系技术支持工程师,检查服务依赖服务及配置项。 计费 500 CAE.01501001 List bills error,raw data fails to be aggregated or the charging process is abnormal. 获取账单失败 联系技术支持工程师。 账号冻结 401 CAE.01501101 User is restricted, can not execute create operation. 此账号因余额不足受限,请检查账号状态 账号充值后解冻。 401 CAE.01501102 User is suspended, can not execute any operation, except view. 此账号被冻结,请检查账号状态 联系技术支持工程师。 域名 、证书 400 CAE.01501201 The domain has already existed. 域名配置冲突 配置了重复的域名,检查该域名是否已经配置。 500 CAE.01501203 Delete zone failed, check dns service status or component config. 域名正在被组件使用,不能删除 检查已有组件,查看是否有组件正在使用该域名。 500 CAE.01501205 Create tls certificate failed in k8s. 证书创建失败 联系技术支持工程师,检查服务依赖服务及配置项。 500 CAE.01501206 Update tls certificate failed in k8s. 证书更新失败 联系技术支持工程师,检查服务依赖服务及配置项。 500 CAE.01501207 Delete tls certificate failed, check cluster status or component config. 证书删除失败 联系技术支持工程师,检查服务依赖服务及配置项。 400 CAE.01501208 The certificate format is invalid or the certificate private key does not match. 操作证书时请求体错误 检查操作证书的请求体是否与api规则内容一致 资源 404 CAE.01501301 Resource not exist. 请求的资源不存在 确认该资源是否仍然存在 400 CAE.01501302 Resource already exist. 资源已存在。 确认是否已创建过同一资源。 配置 400 CAE.01501401 The component access configuration parameter is not valid, please check your parameter. 访问方式配置有错误,可能的原因有 端口数字超过限制、端口冲突 修改端口至[1,65535]范围,且检查可能涉及的配置(cae的组件占用的端口、所使用的独享型elb的监听器),保证端口占用不冲突。 400 CAE.01501404 The path of access configuration is invalid. 不符合url的正则规则 应在访问方式配置项里填写符合url正则规则的路径。 400 CAE.01501402 The input port will result in port conflict. 所选elb的端口已被占用 使用其他端口,如果使用的是独享型ELB,可检查该端口对应监听器使用情况,删除该监听器后,组件即可正常使用该端口。 400 CAE.01501403 The port of ingress rule conflicts. 七层访问方式策略冲突 修改域名、端口、elb、url中的任意一项,使【域名+监听端口+elb+url】不完全相同。 400 CAE.01501405 There is no monitor system config under environment, please create first. 创建性能管理配置,未配置系统设置-监控系统。 先配置在系统设置-监控系统配置监控系统,再创建组件性能管理配置。 权限 403 CAE.01501700 Not authorized for create. 缺少权限 添加对应权限,联系技术支持工程师。 403 CAE.01501701 Not real name authorized. 认证失败 联系技术支持工程师。 参数 400 CAE.01501800 The project in request url and the user token is not matched. url中project id与当前用户token不匹配 检查url中project id或当前token是否正确。 400 CAE.01501801 The input time should be at least 2 mins later than now. 配置启停规则时间距离当前时间太近 配置距离当前时间超过2分钟的启停规则执行时间。 400 CAE.01501802 Timer rule conflicts with scaling rule. 启停规则与生效范围内组件弹性伸缩策略冲突。 解决同一组件启停规则与弹性伸缩策略冲突,关闭其中一个。 400 CAE.01501803 Scaling rule conflicts with timer rule. 组件弹性策略与作用于该组件的启停策略冲突。 解决同一组件启停规则与弹性伸缩策略冲突,关闭其中一个。 400 CAE.01501804 Scaling rule unique param duplicate. 伸缩策略中时间配置冲突 检查伸缩策略中配置的时间策略。 400 CAE.01501805 VPC cidr conflict with embedded cidrs. vpc网段与CAE环境内置网段冲突 联系技术支持工程师。 400 CAE.01501806 Monitor system agent version is invalid. 监控系统探针版本无效 填写有效的监控系统探针版本。 400 CAE.01500108 Cannot modify health check protocol, please switch off first. 修改访问方式-健康检查协议失败 先关闭访问方式-健康检查后配置需切换的健康检查协议。 事件通知 400 CAE.01501901 The maximum number of noticeRules is 50. 事件通知规则上限50条 联系技术支持工程师。 403 CAE.01501902 Your account does not have the SMN permission. 账号无SMN权限 联系账号管理员配置权限。 DEW凭据 400 CAE.01502000 The maximum number of DEW secrets is 20. DEW凭据上线20条 联系技术支持工程师。 400 CAE.01502001 There are components using the secret. 有组件正在使用此凭据 请取消组件的相应的配置后重试。 403 CAE.01502002 You do not have permissions to get secret info, please check your current agency roles. 当前没有权限获取DEW凭据信息,请检查您当前账号下的权限 请增加DEW服务相应权限后再次重试。 集群 500 CAE.01502101 The cluster cannot be operated in the current state. CAE底层集群无法操作 联系技术支持工程师。 父主题: 附录
  • 请求方法 HTTP请求方法(也称为操作或动词),它告诉服务你正在请求什么类型的操作。 GET:请求服务器返回指定资源。 PUT:请求服务器更新指定资源。 POST:请求服务器新增资源或执行特殊操作。 DELETE:请求服务器删除指定资源,如删除对象等。 HEAD:请求服务器资源头部。 PATCH:请求服务器更新资源的部分内容。当资源不存在的时候,PATCH可能会去创建一个新的资源。 在管理员创建IAM用户的URI部分,您可以看到其请求方法为“POST”,则其请求为: POST https://iam.cn-north-4.myhuaweicloud.com/v3.0/OS-USER/users
  • 请求消息体 请求消息体通常以结构化格式发出,与请求消息头中Content-type对应,传递除请求消息头之外的内容。若请求消息体中参数支持中文,则中文字符必须为UTF-8编码。 每个接口的请求消息体内容不同,也并不是每个接口都需要有请求消息体(或者说消息体为空),GET、DELETE操作类型的接口就不需要消息体,消息体具体内容需要根据具体接口而定。 对于管理员创建IAM用户接口,您可以从接口的请求部分看到所需的请求参数及参数说明。将消息体加入后的请求如下所示,加粗的字段需要根据实际值填写。 accountid为IAM用户所属的账号ID username为要创建的IAM用户名。 email为IAM用户的邮箱。 **********为IAM用户的登录密码。 1 2 3 4 5 6 7 8 91011121314 POST https://iam.cn-north-4.myhuaweicloud.com/v3.0/OS-USER/usersContent-Type: application/json X-Sdk-Date: 20240416T095341Z Authorization: SDK-HMAC-SHA256 Access=****************, SignedHeaders=content-type;host;x-sdk-date, Signature=**************** { "user": { "domain_id": "accountid", "name": "username", "password": "**********", "email": "email", "description": "IAM User Description" } } 到这里为止这个请求需要的内容就具备齐全了,您可以使用curl命令行、postman或直接编写代码等方式发送请求调用API。对于获取用户Token接口,返回的响应消息头中“x-subject-token”就是需要获取的用户Token。有了Token之后,您就可以使用Token认证调用其他API。
  • 请求URI 请求URI由如下部分组成。 {URI-scheme} :// {Endpoint} / {resource-path} ? {query-string} 尽管请求URI包含在请求消息头中,但大多数语言或框架都要求您从请求消息中单独传递它,所以在此单独强调。 URI-scheme:表示用于传输请求的协议,当前所有API均采用HTTPS协议。 Endpoint:指定承载REST服务端点的服务器域名或IP,不同服务不同区域的Endpoint不同,您可以从地区和终端节点中获取。例如IAM服务在“华北-北京四”区域的Endpoint为“iam.cn-north-4.myhuaweicloud.com”。 resource-path:资源路径,也即API访问路径。从具体API的URI模块获取,例如“管理员创建IAM用户”API的resource-path为“/v3.0/OS-USER/users”。 query-string:查询参数,是可选部分,并不是每个API都有查询参数。查询参数前面需要带一个“?”,形式为“参数名=参数取值”,例如“limit=10”,表示查询不超过10条数据。 例如您需要获取IAM在“华北-北京四”区域的Token,则需使用“华北-北京四”区域的Endpoint(iam.cn-north-4.myhuaweicloud.com),并在管理员创建IAM用户的URI部分找到resource-path(/v3.0/OS-USER/users),拼接起来如下所示。 https://iam.cn-north-4.myhuaweicloud.com/v3.0/OS-USER/users 图1 URI示意图 为查看方便,在每个具体API的URI部分,只给出resource-path部分,并将请求方法写在一起。这是因为URI-scheme都是HTTPS,而Endpoint在同一个区域也相同,所以简洁起见将这两部分省略。
  • 请求消息头 附加请求头字段,如指定的URI和HTTP方法所要求的字段。例如定义消息体类型的请求头“Content-Type”,请求鉴权信息等。 如下公共消息头需要添加到请求中。 Content-Type:消息体的类型(格式),必选,默认取值为“application/json”,有其他取值时会在具体接口中专门说明。 Authorization:签名认证信息,可选,当使用AK/SK方式认证时,使用SDK对请求进行签名的过程中会自动填充该字段。AK/SK认证的详细说明请参加AK/SK认证。 X-Auth-Token:用户Token,可选,当使用Token方式认证时,必须填充该字段。用户Token也就是调用获取用户Token接口的响应值,该接口是唯一不需要认证的接口。 X-Sdk-Date:请求发送的时间,可选,当使用AK/SK方式认证时,使用SDK对请求进行签名的过程中会自动填充该字段。 X-Project-ID:子项目ID,可选,在多项目场景中使用。如果云服务资源创建在子项目中,AK/SK认证方式下,操作该资源的接口调用需要在请求消息头中携带X-Project-ID。 X-Domain-ID:账号ID,可选。AK/SK认证方式下,全局服务的接口调用时,需在请求消息头中携带X-Domain-ID。 公有云API同时支持使用AK/SK认证,AK/SK认证是使用SDK对请求进行签名,签名过程会自动往请求中添加。Authorization(签名认证信息)和X-Sdk-Date(请求发送的时间)请求头。 AK/SK认证的详细说明请参加AK/SK认证。 对于管理员创建IAM用户接口,使用AK/SK方式认证时,添加消息头后的请求如下所示。 POST https://iam.cn-north-4.myhuaweicloud.com/v3.0/OS-USER/usersContent-Type: application/jsonX-Sdk-Date: 20240416T095341Z Authorization: SDK-HMAC-SHA256 Access=****************, SignedHeaders=content-type;host;x-sdk-date, Signature=****************
  • 操作步骤 创建环境。 调用创建环境接口,请求示例如下: curl -k -H "Content-Type:application/json" -H "X-Auth-Token:$Token" -X POST "https://{cae_endpoint}/v1/{project_id}/cae/environments" -d '{ "apiVersion": "v1", "kind": "Environment", "metadata": { "name": "env-toase", "annotations": { "type": "exclusive", "vpc_id": "d1f94768-0463-43c1-8eac-9faba848f5fa", "group_name": "demo" } }}' 返回结果: {"job_id": "68531a56-febe-4218-be23-97fe00454cd1"} 得到的job_id,可以通过job_id获取对应的创建的状态。
  • 调用API获取项目ID 项目ID通过调用查询指定条件下的项目列表API获取。 获取项目ID的接口为“GET https://{Endpoint}/v3/projects”,其中{Endpoint}为IAM的终端节点,可以从地区和终端节点获取。接口的认证鉴权请参见3.2 认证鉴权。 响应示例如下,其中projects下的“id”即为项目ID。 { "projects": [ { "domain_id": "65382450e8f64ac0870cd180d14e684b", "is_domain": false, "parent_id": "65382450e8f64ac0870cd180d14e684b", "name": "cn-north-4", "description": "", "links": { "next": null, "previous": null, "self": "https://www.example.com/v3/projects/a4a5d4098fb4474fa22cd05f897d6b99" }, "id": "a4a5d4098fb4474fa22cd05f897d6b99", "enabled": true } ], "links": { "next": null, "previous": null, "self": "https://www.example.com/v3/projects" } }
  • 响应消息体 响应消息体通常以结构化格式返回,与响应消息头中Content-type对应,传递除响应消息头之外的内容。 对于“管理员创建IAM用户”接口,返回如下消息体。为篇幅起见,这里只展示部分内容。 { "user": { "id": "c131886aec...", "name": "IAMUser", "description": "IAM User Description", "areacode": "", "phone": "", "email": "***@***.com", "status": null, "enabled": true, "pwd_status": false, "access_mode": "default", "is_domain_owner": false, "xuser_id": "", "xuser_type": "", "password_expires_at": null, "create_time": "2024-05-21T09:03:41.000000", "domain_id": "d78cbac1..........", "xdomain_id": "30086000........", "xdomain_type": "", "default_project_id": null } } 当接口调用出错时,会返回错误码及错误信息说明,错误响应的Body体格式如下所示。 { "error_msg": "Request body is invalid.", "error_code": "IAM.0011" } 其中,error_code表示错误码,error_msg表示错误描述信息。
  • 操作步骤 创建应用。 调用创建应用接口,请求示例如下。 curl -k -H "Content-Type:application/json" -H "X-Environment-ID: $env_id" -H "X-Auth-Token:$Token" -X POST "https://{cae_endpoint}/v1/{project_id}/cae/applications" -d '{ "apiVersion": "v1", "kind": "Application", "metadata": { "name": "demo-app", "annotations": { "description": "demo" } }}' 返回结果: { "api_version": "v1", "kind": "Application", "metadata": { "id": "25f5aa9e-724c-4227-ab56-79b4066dce21", "name": "demo-app", "annotations": { "description": "demo" }, "created_at": "2022-07-05T08:34:15.9820794Z", "updated_at": "2022-07-05T08:34:15.9820794Z" }}
  • 操作步骤 部署组件。 调用部署组件接口,请求示例如下: curl -k -H "Content-Type:application/json" -H "X-Environment-ID: $env_id" -H "X-Auth-Token:$Token" -X POST "https://{cae_endpoint}v1/{project_id}/cae/applications/{application_id}/components/{component_id}/action" -d '{ "api_version": "v1", "kind": "Action", "metadata": { "name": "deploy", "annotations": { "version": "1.0.0" } }}' 返回结果: {"job_id": "68531a56-febe-4218-be23-97fe00454cd1"} 得到的job_id,可以通过job_id获取对应组件的部署任务状态。
  • 运行容器 使用容器引擎可以直接运行Wordpress和MySQL,且可以使用--link参数将两个容器连接,在不改动代码的情况下让Wordpress的容器访问MySQL的容器。 执行下面的命令运行MySQL。 docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=******** -e MYSQL_DATABASE=wordpress -d mysql:5.7 参数解释如下: --name指定容器的名称为some-mysql。 -e指定容器的环境变量。如这里指定环境变量MYSQL_ROOT_PASSWORD的值为********,请替换为您设置的密码。指定环境变量MYSQL_DATABASE,镜像启动时要创建的数据库名称为wordpress。 -d表示在后台运行。 执行下面的命令运行Wordpress。 docker run --name some-wordpress --link some-mysql:mysql -p 8080:80 -e WORDPRESS_DB_PASSWORD=******** -e WORDPRESS_DB_USER=root -d wordpress 参数解释如下: --name指定容器的名称为some-wordpress 。 --link指定some-wordpress容器链接some-mysql容器,并将some-mysql命名为mysql。这里--link只是提供了一种方便,不使用--link的话,可以指定some-wordpress的环境变量WORDPRESS_DB_HOST访问mysql的IP与端口。 -p指定端口映射,如这里将容器的80端口映射到主机的8080端口。 -e指定容器的环境变量,如这里指定环境变量WORDPRESS_DB_PASSWORD的值为********,请替换为您设置的密码。Wordpress的环境变量WORDPRESS_DB_PASSWORD必须与MySQL的环境变量MYSQL_ROOT_PASSWORD值相同,这是因为Wordpress需要密码访问MySQL数据库。WORDPRESS_DB_USER为访问数据的用户名,使用用户root去连接MySQL。 -d表示在后台运行。 Wordpress运行之后,就可以在本机通过http://127.0.0.1:8080访问Wordpress博客了,如下所示。
  • 创建命名空间 登录云容器实例管理控制台,左侧导航栏中选择“命名空间”。 在对应类型的命名空间下单击“创建”。 填写命名空间名称。 设置VPC。 选择使用已有VPC或新建VPC,新建VPC需要填写VPC网段,建议使用网段:10.0.0.0/8~24,172.16.0.0/12~24,192.168.0.0/16~24。 设置子网网段。 您需要关注子网的可用IP数,确保有足够数量的可用IP,如果没有可用IP,则会导致负载创建失败。 单击“创建”。
  • 概述 在云容器实例中,您可以使用多种方法创建负载,包括使用云容器实例的Console控制台界面、调用API部署应用,那这些方式的使用有什么不同的地方呢?这些方法又与直接运行Docker run命令运行容器有什么区别呢? 本文将通过运行一个Wordpress + MySQL的博客为例,比较这几种方法之间的异同,以利于您挑选合适的使用方法。 WordPress是使用PHP语言开发的博客平台。用户可以在支持PHP和MySQL数据库的服务上架设属于自己的网站,也可以把WordPress当作一个内容管理系统来使用。更多WordPress信息可以通过官方网站了解:https://wordpress.org/。 WordPress需配合MySQL一起使用,WordPress运行内容管理程序,MySQL作为数据库存储数据。在容器中运行通常会将WordPress和MySQL分别运行两个容器中,如下图所示。 父主题: 负载创建
  • 应用场景 /dev/shm由tmpfs文件系统构成,tmpfs是Linux/Unix系统上的一种基于内存的文件系统,故读写效率非常高。 目前有用户希望通过/dev/shm实现进程间数据交互或通过/dev/shm实现临时数据存储,此时CCI场景/dev/shm默认大小64M无法满足客户诉求,故提供修改/dev/shm size大小的能力。 本操作实践展示通过“memory类型EmptyDir”和“配置securityContext与mount命令”两种方式来修改/dev/shm容量。
  • 限制与约束 /dev/shm使用基于内存的tmpfs文件系统,不具备持久性,容器重启后数据不保留。 用户可通过两种方式修改/dev/shm容量,但不建议在一个Pod中同时使用两种方式进行配置。 EmptyDir所使用的memory从Pod申请的memory中进行分配,不会额外占用资源。 在/dev/shm中写数据相当于申请内存,此种场景下需评估进程内存使用量,当容器内的进程申请内存与EmptyDir中数据量之和超过容器请求的限制内存时,会出现内存溢出异常。 当需要修改/dev/shm容量时,容量大小通常设定为Pod内存申请量的50%。
  • 镜像制作 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-gpuADD 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。
  • Namespace 调用创建Namespace接口创建命名空间,并指定使用命名空间的类型。 { "apiVersion": "v1", "kind": "Namespace", "metadata": { "name": "namespace-test", "annotations": { "namespace.kubernetes.io/flavor": "gpu-accelerated" } }, "spec": { "finalizers": [ "kubernetes" ] }} 调用创建Network接口创建网络,与VPC与子网关联。 { "apiVersion": "networking.cci.io/v1beta1", "kind": "Network", "metadata": { "annotations": { "network.alpha.kubernetes.io/default-security-group": "{{security-group-id}}", "network.alpha.kubernetes.io/domain-id": "{{domain-id}}", "network.alpha.kubernetes.io/project-id": "{{project-id}}" }, "name": "test-network" }, "spec": { "availableZone": "{{zone}}", "cidr": "192.168.0.0/24", "attachedVPC": "{{vpc-id}}", "networkID": "{{network-id}}", "networkType": "underlay_neutron", "subnetID": "{{subnet-id}}" }}
  • MySQL 调用创建Deployment接口部署MySQL。 Deployment名称为mysql。 设置Pod的标签为app:mysql。 使用mysql:5.7镜像。 设置容器环境变量MYSQL_ROOT_PASSWORD为“********”,请替换为您设置的密码。 { "apiVersion": "apps/v1", "kind": "Deployment", "metadata": { "name": "mysql" }, "spec": { "replicas": 1, "selector": { "matchLabels": { "app": "mysql" } }, "template": { "metadata": { "labels": { "app": "mysql" } }, "spec": { "containers": [ { "image": "mysql:5.7", "name": "container-0", "resources": { "limits": { "cpu": "500m", "memory": "1024Mi" }, "requests": { "cpu": "500m", "memory": "1024Mi" } }, "env": [ { "name": "MYSQL_ROOT_PASSWORD", "value": "********" } ] } ], "imagePullSecrets": [ { "name": "imagepull-secret" } ] } } }} 调用创建Service接口创建一个Service,定义1中创建的Pod的访问策略。 Service名称为mysql。 选择标签为app:mysql的Pod,即关联1中创建的Pod。 负载访问端口3306映射到容器的3306端口。 Service的访问类型为ClusterIP,即使用ClusterIP在内部访问Service。 { "apiVersion": "v1", "kind": "Service", "metadata": { "name": "mysql", "labels": { "app": "mysql" } }, "spec": { "selector": { "app": "mysql" }, "ports": [ { "name": "service0", "targetPort": 3306, "port": 3306, "protocol": "TCP" } ], "type": "ClusterIP" }}
  • Wordpress 调用创建Deployment接口部署Wordpress。 Deployment名称为wordpress。 replicas值为2,表示创建2个pod。 设置Pod的标签为app:wordpress。 使用wordpress:latest镜像。 设置容器环境变量WORDPRESS_DB_PASSWORD为“********”,请替换为您设置的密码。此处的密码必须与MySQL的MYSQL_ROOT_PASSWORD一致。 { "apiVersion": "apps/v1", "kind": "Deployment", "metadata": { "name": "wordpress" }, "spec": { "replicas": 2, "selector": { "matchLabels": { "app": "wordpress" } }, "template": { "metadata": { "labels": { "app": "wordpress" } }, "spec": { "containers": [ { "image": "wordpress:latest", "name": "container-0", "resources": { "limits": { "cpu": "500m", "memory": "1024Mi" }, "requests": { "cpu": "500m", "memory": "1024Mi" } }, "env": [ { "name": "WORDPRESS_DB_PASSWORD", "value": "********" } ] } ], "imagePullSecrets": [ { "name": "imagepull-secret" } ] } } }} 调用创建Service接口创建一个Service,定义1中创建的Pod的访问策略。 Service名称为wordpress。 选择标签为app:wordpress的Pod,即关联1中创建的Pod。 负载访问端口8080映射到容器的80端口,80端口为wordpress镜像的默认对外暴露的端口。 Service的访问类型为ClusterIP,即使用ClusterIP在内部访问Service。 { "apiVersion": "v1", "kind": "Service", "metadata": { "name": "wordpress", "labels": { "app": "wordpress" } }, "spec": { "selector": { "app": "wordpress" }, "ports": [ { "name": "service0", "targetPort": 80, "port": 8080, "protocol": "TCP" } ], "type": "ClusterIP" }} 调用创建Ingress接口创建一个Ingress,定义wordpress的外部访问策略,即关联ELB实例(ELB实例需要与Wordpress负载在同一个VPC内)。 metadata.annotations.kubernetes.io/elb.id:ELB实例的ID。 metadata.annotations.kubernetes.io/elb.ip:ELB实例的IP地址。 metadata.annotations.kubernetes.io/elb.port:ELB实例的端口。 spec.rules:访问服务的规则集合。path列表,每个path(比如:/)都关联一个backend(比如“wordpress:8080”)。backend是一个service:port的组合。Ingress的流量被转发到它所匹配的backend。 这里配置完后,访问ELB的IP:端口的流量就会流向wordpress:8080这个Service,由于Service是关联了wordpress的Pod,所以最终访问的就是1中部署的wordpress容器。 { "apiVersion": "extensions/v1beta1", "kind": "Ingress", "metadata": { "name": "wordpress", "labels": { "app": "wordpress", "isExternal": "true", "zone": "data" }, "annotations": { "kubernetes.io/elb.id": "2d48d034-6046-48db-8bb2-53c67e8148b5", "kubernetes.io/elb.ip": "10.10.10.10", "kubernetes.io/elb.port": "9012" } }, "spec": { "rules": [ { "http": { "paths": [ { "path": "/", "backend": { "serviceName": "wordpress", "servicePort": 8080 } } ] } } ] }}
  • 内核参数配置 CCI服务底座使用安全容器构建了业内领先的Serverless容器平台,同物理机系统内核隔离且互不影响。对于资深业务部署场景,内核参数调优是比较通用的方式。在安全范围内,CCI服务允许客户根据Kubernetes社区推荐的方案,通过Pod的安全上下文(Security Context)对内核参数进行配置,极大提升用户业务部署的灵活性。如果您对securityContext概念不够熟悉,更多信息可阅读Security Context。 在 Linux 中,最通用的内核参数修改方式是通过sysctl接口进行配置。在Kubernetes中,也是通过Pod的sysctl安全上下文(Security Context)对内核参数进行配置,如果您对sysctl概念不够熟悉,可阅读在 Kubernetes 集群中使用 sysctl。安全上下文(Security Context)作用于同一个Pod内的所有容器。 CCI服务支持修改的内核参数范围如下: kernel.shm*,kernel.msg*, kernel.sem,fs.mqueue.*,net.*(net.netfilter.*和net.ipv4.vs.*除外) 以下示例中,使用Pod SecurityContext来对两个sysctl参数net.core.somaxconn和net.ipv4.tcp_tw_reuse进行设置。 apiVersion:v1kind:Podmetadata: name: xxxxx namespace: auto-test-namespacespec: securityContext: sysctls: - name: net.core.somaxconn value: "65536" - name: net.ipv4.tcp_tw_reuse value: "1" ...... 进入容器确认配置生效: 父主题: 负载管理
  • 匹配与替换规则 替换策略可配置多条。各条替换策略的原字符串(repositoryPrefix)不允许重复。每个容器至多只会执行一条替换策略。配置替换策略无需考虑先后顺序,不同的配置顺序结果一致。 原Pod.spec中配置的container和initContainer镜像均支持替换。 若repositoryPrefix不为空,则匹配Pod中所有镜像名中最后一个"/"字符之前的字符串与该值相同的容器,对其最后一个"/"字符之前的部分替换为replaceWith的内容。 若repositoryPrefix为空,则对Pod中镜像名不包含前缀(即没有"/"字符)的容器,镜像名前加上replaceWith的内容和一个"/"字符。
  • 使用场景 用户在线下IDC有自建的harbor镜像仓库,同时也会将镜像同步到华为云SWR镜像仓库。创建负载后,希望调度到自建Kubernetes集群节点上运行的Pod使用自建镜像仓库的镜像,弹性到CCI的Pod使用SWR的镜像,以提高镜像拉取效率。可通过在Pod.Annotations中加入注解可以实现弹性到CCI的Pod中容器使用的镜像与自建Kubernetes集群使用的镜像为不同地址。 通过Annotation "coordinator.cci.io/image-replacement"配置镜像替换策略。其值为如下所示json字符串:
  • 配置场景二 原Pod中容器使用不同的镜像仓库,可配置多条替换策略。 示例: 第一个容器匹配到第一条策略,将"harbor.domain"替换为"swr.cn-north-4.myhuaweicloud.com/org1"。 第二个容器匹配到第二条策略,将镜像名前加上"swr.cn-north-4.myhuaweicloud.com/org1"和"/"。 第三个容器匹配到第三条策略,将前缀"harbor.domain/a/b/c/d"替换为"swr.cn-north-4.myhuaweicloud.com/org2"。 因为需要完整匹配最后一个"/"之前的部分,第一条策略即便有与该镜像相同的前缀"harbor.domain",也不会生效。 替换策略: "coordinator.cci.io/image-replacement": '[{"repositoryPrefix":"harbor.domain","replaceWith":"swr.cn-north-4.myhuaweicloud.com/org1"},{"repositoryPrefix":"","replaceWith":"swr.cn-north-4.myhuaweicloud.com/org1"},{"repositoryPrefix":"harbor.domain/a/b/c/d","replaceWith":"swr.cn-north-4.myhuaweicloud.com/org2"}]' 替换前: containers: - name: container-0 image: 'harbor.domain/ubuntu:latest' - name: container-1 image: 'nginx:latest' - name: container-2 image: 'harbor.domain/a/b/c/d/redis:latest' 替换后: containers: - name: container-0 image: 'swr.cn-north-4.myhuaweicloud.com/org1/ubuntu:latest' - name: container-1 image: 'swr.cn-north-4.myhuaweicloud.com/org1/nginx:latest' - name: container-2 image: 'swr.cn-north-4.myhuaweicloud.com/org2/redis:latest'
  • 使用Nvidia-smi工具 为了支持查看GPU使用情况的场景,需要在镜像中注入nvidia-smi工具,根据购买的专属节点GPU驱动版本选择不同的nvidia-smi二进制文件。 nvidia-smi获取方式。 该二进制文件可以在nvidia官网,根据CUDA Toolkit版本选择下载对应版本的nvidia驱动包。 图1 NVIDIA驱动程序下载 以CUDA 10.1为例,可以下载得到对应版本的驱动包NVIDIA-Linux-x86_64-418.126.run文件,执行如下命令解压缩: sh NVIDIA-Linux-x86_64-418.126.run -x 在解压缩后的目录下即可找到官方提供的nvidia-smi工具二进制文件。 注入nvidia-smi工具。 将步骤1中得到的nvidia-smi二进制文件放在Dockerfile所在目录下,然后在同目录下的Dockerfile中新增注入语句: # inject nvidia-smi toolCOPY nvidia-smi /usr/bin/RUN chmod +x /usr/bin/nvidia-smi COPY命令会从Dockerfile文件所在的当前目录下去寻找名为nvidia-smi的文件,然后拷贝到镜像的/usr/bin/目录下。 父主题: GPU负载
  • 配置场景一 原Pod中所有容器镜像均使用同一镜像仓库与组织,配置一条替换策略即可。 示例:将所有容器镜像"harbor.domain/a/b/c/d"前缀都替换为SWR的镜像前缀"swr.cn-north-4.myhuaweicloud.com/org"。 替换策略: "coordinator.cci.io/image-replacement": '[{"repositoryPrefix":"harbor.domain/a/b/c/d","replaceWith":"swr.cn-north-4.myhuaweicloud.com/org"}]' 替换前: containers: - name: container-0 image: 'harbor.domain/a/b/c/d/ubuntu:latest' - name: container-1 image: 'harbor.domain/a/b/c/d/nginx:latest' 替换后: containers: - name: container-0 image: 'swr.cn-north-4.myhuaweicloud.com/org/ubuntu:latest' - name: container-1 image: 'swr.cn-north-4.myhuaweicloud.com/org/nginx:latest' 示例Deployment: apiVersion: apps/v1 kind: Deployment metadata: name: test-vk labels: virtual-kubelet.io/burst-to-cci: 'auto' spec: replicas: 20 selector: matchLabels: app: test-vk template: metadata: labels: app: test-vk annotations: coordinator.cci.io/image-replacement: '[{"repositoryPrefix":"harbor.domain/a/b/c/d","replaceWith":"swr.cn-north-4.myhuaweicloud.com/org"}]' spec: containers: - name: container-0 image: harbor.domain/a/b/c/d/ubuntu:latest resources: limits: cpu: 500m memory: 1024Mi requests: cpu: 500m memory: 1024Mi command: - /bin/bash - '-c' - sleep 10000 - name: container-1 image: harbor.domain/a/b/c/d/nginx:latest resources: limits: cpu: 500m memory: 1024Mi requests: cpu: 500m memory: 1024Mi command: - /bin/bash - '-c' - sleep 10000
  • 工作负载下发 登录CCE控制台。 选择CCE集群,单击进入CCE集群总览页面。 在导航栏左侧单击“工作负载”,进入工作负载首页。 单击“创建工作负载”,具体操作步骤详情请参见创建工作负载。 填写基本信息。“CCI弹性承载”选择“强制调度策略”。关于调度策略更多信息,请参考调度负载到CCI。 CCE集群创建工作负载时,需要弹性到CCI,健康检查不支持配置TCP启动探针。 进行容器配置。 配置完成后,单击“创建工作负载”。 在工作负载页面,选择工作负载名称,单击进入工作负载管理界面。 工作负载所在节点为CCI集群,说明负载成功已调度到CCI。
  • 安装插件 登录CCE控制台。 选择CCE集群,单击进入CCE集群总览页面。 在导航栏左侧单击“插件中心”,进入插件中心首页。 选择“CCE 突发弹性引擎 (对接 CCI)”插件,单击“安装”。 配置插件参数。 表1 插件参数说明 插件参数 说明 选择版本 插件的版本。插件版本和CCE集群存在配套关系,更多信息可以参考CCE突发弹性引擎(对接CCI)插件版本记录。 规格配置 用于配置插件负载的实例数及资源配额。 选择“系统预置规格”时,您可选择“单实例”或“高可用”规格。 选择“自定义规格”时,您可根据需求修改插件各个组件的副本数以及CPU/内存配置。 说明: CCE 突发弹性引擎 (对接 CCI) 插件在1.5.2及以上版本,将占用更多节点资源,请在升级CCE突发弹性引擎(对接 CCI)插件前预留空间配额。 单实例:需要预留一个节点,节点下至少需要有7个Pod空间配额。若开启网络互通,则需要有8个Pod空间配额。 高可用:需要预留两个节点,节点下至少需要有7个Pod空间配额,共计14个Pod空间配额。若开启网络互通,则需要有8个Pod空间配额,共计16个Pod空间配额。 弹性到CCI的业务量不同时,插件的资源占用也不相同。业务申请的POD、Secret、Congfigmap、PV、PVC会占用虚机资源。建议用户评估自己的业务使用量,按以下规格申请对应的虚机大小:1000pod+1000CM(300KB)推荐2U4G规格节点,2000pod+2000CM推荐4U8G规格节点,4000pod+4000CM推荐8U16G规格节点。 网络互通 开启后,支持CCE集群中的Pod与CCI集群中的Pod通过Kubernetes Service互通,并在插件安装时部署组件proxy。详细功能介绍请参考网络。
  • 插件卸载 登录CCE控制台。 选择CCE集群,单击进入CCE集群总览页面。 在导航栏左侧单击“插件中心”,进入插件中心首页。 选择“CCE 突发弹性引擎 (对接 CCI)”插件,单击“卸载”。 表2 特殊场景说明 特殊场景描述 场景现象 场景说明 CCE集群无节点,卸载插件。 插件卸载失败。 bursting插件卸载时会在集群中启动Job用于清理资源,卸载插件时请保证集群中至少有一个可以调度的节点。 用户直接删除集群,未卸载插件。 用户在CCI侧的命名空间中有资源残留,如果命名空间有计费资源,会造成额外计费。 由于直接删除集群,没有执行插件的资源清理Job,造成资源残留。用户可以手动清除残留命名空间及其下的计费资源来避免额外计费。 关于CCE突发弹性引擎(对接CCI)更多内容详情请参见:CCE突发弹性引擎(对接CCI)。
  • 使用场景 在使用CCE或者其他K8s集群时,可以使用HostPath。由于CCI为共享集群,未开放HostPath能力,所以当使用HostPath的Pod想通过Virtual Kubelet弹到CCI时,会被vk-webhook拦截。如无法改变Pod spec.volumes中配置的HostPath,当前可通过配置Annotation的形式,允许让使用HostPath的Pod弹性到CCI上,但是VK在校验时需要去掉Pod中的HostPath或者将HostPath替换为localDir、emptyDir或者flexVolume。 通过在Pod.Annotations中加入注解可以做到HostPath转localDir、emptyDir或者flexVolume。
共100000条