云服务器内容精选

  • 主机连通方式概述 在主机部署场景中,部署服务下的执行主机通过SSH/WSMan协议与目标主机进行通信以实现应用的部署。执行主机又称资源池,是表示部署步骤最终执行的物理环境,部署服务在提供官方资源池的同时,也支持您将自己的主机实例接入部署服务并成为自托管资源池,支持通过主机直连方式与代理机方式,实现资源池和目标主机的连接。因此在部署应用之前,要确保执行主机与部署的目标主机可以进行正常通信,这一过程即为主机连通性验证。 主机直连方式 在弹性公网IP(EIP)资源充足,或者在进行工程Demo验证仅需少量EIP的场景下,建议选择主机直连方式。 为确保主机连通性验证通过,您需要对目标主机进行配置并开放相应端口。 该方案通过在服务器中绑定EIP的方式,实现官方资源池与目标主机之间的连通,具体方案如下图所示。 代理机方式 在用户有少量弹性公网IP(EIP)资源时,需要在其他无EIP的云服务器进行部署的场景下,建议选择代理机方式。 为确保主机连通性验证通过,您需要对目标主机、代理主机分别进行配置并开放相应端口。 Linux代理机方式 用一台绑有EIP的E CS 作为代理主机。在部署过程中,部署服务将执行的命令下发到该代理主机,利用SSH协议转发到各目标主机中,实现主机的批量部署。 在部署应用中,当目标主机需要从软件发布库中下载软件包时,目标主机通过该NAT网关访问软件发布库,实现软件包的拉取,具体方案如下图所示。 红色标记为部署命令下发场景。 绿色标记为目标主机下载软件包场景。 Windows代理机方式 用一台绑有EIP的ECS作为代理主机。在部署过程中,部署服务将执行的命令下发到该代理主机,利用端口转发到各目标主机中,实现主机的批量部署。
  • 使用Django应用部署模板创建并部署应用 在主机上部署Django框架的Python后台应用,并启动该服务。 请确认目标主机已安装Nginx,若已安装请移除模板中“安装Nginx”步骤。 请确认目标主机已安装uWSGI,若已安装请移除模板中“安装uWSGI”步骤。 配置pip源和yum源保证安装正常。模板中安装软件使用yum和pip,请配置好对应的源地址,保证安装正常。 新建Django项目,并上传至制品仓库。使用构建服务,将Django项目文件压缩后上传至制品仓库,之后在部署步骤中下载并解压后使用。 该模板涉及的部署步骤如下所示: 安装Python 安装django和uWSGI 安装Nginx 启动Nginx 下载软件包 解压软件包 重启uWSGI 重载Nginx配置文件 服务启动测试 该模板需要填写的参数如表1所示。 表1 模板参数说明 参数 说明 host_group 该应用部署的目标环境。 service_port Django应用端口,默认值为8080。 uwsgi_pid_file_path uwsgi进程id文件所在路径。 uwsgi_lni_file_path uwsgi配置文件所在路径。 package_path Django应用发布包下载至目标主机中的路径。 package_name Django应用发布包下载至目标主机中的文件名。 package_url 软件包下载地址,可前往制品仓库-软件发布库获取下载链接。 父主题: 使用预置模板新建并部署应用
  • 使用须知 如果您使用CodeArts Deploy服务开展在特定行业的业务,比如:教育、医疗和银行等,需同时遵守相关国家规定的用户数据保护法律和内容管理法律。 禁止通过CodeArts Deploy服务对外部视频或音频网页爬取、加工或上传数据。 禁止通过CodeArts Deploy服务进行源代码编译构建之外的操作。 禁止使用sleep、usleep、read、timeout、yes、dd、while循环等命令长期(超过10分钟)占用服务器进程。
  • 计费相关 部署服务不支持单独购买,开通CodeArts即可使用部署服务。 部署服务免费使用,不涉及计费项。 用户部署的应用所使用的资源、以及部署依赖的服务所使用的资源(弹性云主机、弹性IP、流量等)由所使用的服务收费。 由于部署服务本身免费使用,因而当账户欠费时,部署服务各项操作仍可以正常进行,但若部署服务所使用的资源(弹性云主机、弹性IP、流量等)在账户欠费时不可用,那么相应的应用可能会部署失败。
  • 规格与限制 使用部署服务有下列限制: 基本限制。 表1 基本限制 指标类别 指标项 限制说明 应用管理 单项目下应用数量(个) 最大数量为2000个。 应用下可查看部署记录天数(天) 页面展示单个应用最近92天的部署记录。 单次部署应用的部署时长(分钟) 最大部署时长为30分钟。 基础资源管理 单项目下主机集群数量(个) 最大数量为1000个。 单主机集群下主机数量(个) 最大数量为200个。 批量验证连通性主机数量(个) 最大数量为200个。 环境管理 单应用下环境数量(个) 最大数量为100个。 单环境下主机数量(个) 最大数量为200个。 批量验证连通性主机数量(个) 最大数量为200个。 支持如下表所示操作系统主机。 表2 操作系统 操作系统 版本号 CentOS 6.3,6.5,6.8,6.9,7.0,7.1,7.2,7.3,7.4,7.5,7.6,8.0,8.1,8.2,Stream 9 说明: Docker 18.09.0版本与CentOS 8版本不兼容。 Debian 9.0.0,8.8.0,8.2.0,10.0.0 EulerOS 2.0,2.2,2.3,2.5 Huawei Cloud EulerOS 2.0 说明: Nginx 1.12.2、Docker 18.09.0版本与Huawei Cloud EulerOS 2.0不兼容。 Ubuntu 14.04,16.04,18.04,20.04,22.04 说明: Ubuntu 22.04仅支持docker 19.03及以上版本,不兼容Nginx 1.12.2版本,不支持php全部版本。 Ubuntu 20.04不兼容Nginx 1.12.2版本和php 5.6.38版本。 Windows 2012 R2,2016,2019,Win7,Win10 KylinOS V10 SP1 说明: Nginx 1.12.2、php-5.6.38版本与KylinOS不兼容。 UnionTechOS Server 20(1050e) OpenEuler 20.03,22.03 说明: JDK11、php-5.6.38版本与OpenEuler X86系统暂不兼容。 Nginx、Python、Jdk、php全部版本与OpenEuler ARM系统暂不兼容。 AlmaLinux AlmaLinux 8,AlmaLinux 9 支持如下表所示的集群版本。 表3 集群版本 集群类型 集群版本 CCE集群 1.17~1.25 自有K8S集群 遵从K8s社区的约束与限制
  • 问题现象 部署“安装/卸载Docker”步骤中的安装Docker操作时,选择普通用户的主机,日志提示信息如下: fatal: [***.***.***.***: FAILED! ={"changed": false, "module_stderr": "Shared connection to ***.***.***.***closed.\r\n", "module_stdout": "sudo: 需要密码\r\n", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1}
  • 购买并配置云容器引擎 本节中使用的是云容器引擎CCE。 通过控制台可购买CCE集群。 其中集群及节点的必要配置建议参照表1与表2,表中未涉及的可根据实际情况选择。 表1 CCE集群购买配置 配置分类 配置项 配置建议 基础配置 集群类型 选择“CCE Standard 集群”。 计费模式 选择“按需计费”。 集群名称 输入自定义名称。 集群版本 根据需要选择,建议选择最新版本。 网络配置 容器网络模型 选择“容器隧道网络”。 虚拟私有云 选择已有的虚拟私有云,如果列表中没有合适的选项,单击“新建虚拟私有云”完成创建。 默认节点子网 选择已有的子网,如果列表中没有合适的选项,单击“新建子网”完成创建。 容器网段 勾选“自动设置网段”。 表2 节点配置 配置分类 配置项 配置建议 节点配置 计费模式 选择“按需计费”。 节点类型 选择“弹性云服务器-虚拟机”。 节点规格 选择2vCPUs 8GiB及以上规格即可。 操作系统 选择公共镜像中的Euler镜像。 节点名称 输入自定义名称 。 登录方式 选择“密码”。 密码 输入自定义密码 。 网络配置 节点IP 选择“自动分配”。 弹性公网IP 选择“自动创建”。
  • 附录 A边节点下线-代码示例 worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format main '$time_local|$remote_addr[$remote_port]|$request|$request_method|$content_length|' '$content_type|$http_referer|$host|$http_x_forwarded_for|' '$http_true_client_ip|$server_name|$request_uri|$server_addr|$server_port|' '$status|$request_time|$upstream_addr|$upstream_response_time|$cookie_domain_tag'; access_log logs/access.log main; #访问日志:存放路径,日志级别。 error_log logs/error.log; #错误日志:存放路径。 sendfile on; keepalive_timeout 65; upstream portal { # 下面填入A主机IP及应用服务端口 #server X.X.X.X:X; #A节点下线 # 下面填入B主机IP及应用服务端口 server X.X.X.X:X; } upstream portal_test { # 下面填入A主机IP及应用服务端口 server X.X.X.X:X; # 下面填入B主机IP及应用服务端口 server X.X.X.X:X; } server { listen XXX;#填入Nginx端口 server_name localhost; location / { set $backend portal; set $test portal_test; #下面填入灰度验证机器IP #if ( $remote_addr ~* "X.X.X.X") { # set $backend $test; #} proxy_pass https://$backend; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } } 部署节点 # 获取应用进程id pid=`ps -ef | grep app_name | grep -v grep | awk '{print $2}'` if [ -z "$pid" ]; then echo "[app_name pid is not exist.]" else echo "app_name pid: $pid " # 停止该进程 kill -15 $pid fi # 重新启动应用,可通过执行部署脚本和部署命令两种方式启动应用,如下: # 方式一:通过执行部署脚本启动应用 # sh startup.sh # 方式二:通过执行命令启动应用,建议采用nohup后台启动方式 # nohup java -jar /usr/local/app/SpringbootDemo.jar & A边节点灰度上线-代码示例 worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format main '$time_local|$remote_addr[$remote_port]|$request|$request_method|$content_length|' '$content_type|$http_referer|$host|$http_x_forwarded_for|' '$http_true_client_ip|$server_name|$request_uri|$server_addr|$server_port|' '$status|$request_time|$upstream_addr|$upstream_response_time|$cookie_domain_tag'; access_log logs/access.log main; #访问日志:存放路径,日志级别。 error_log logs/error.log; #错误日志:存放路径。 sendfile on; keepalive_timeout 65; upstream portal { # 下面填入A主机IP及应用服务端口 #server X.X.X.X:X; #A节点下线 # 下面填入B主机IP及应用服务端口 server X.X.X.X:X; } upstream portal_test { # 下面填入A主机IP及应用服务端口 server X.X.X.X:X; #A节点灰度上线 # 下面填入B主机IP及应用服务端口 #server X.X.X.X:X; } server { listen XXX;#填入Nginx端口 server_name localhost; location / { set $backend portal; set $test portal_test; #下面填入灰度验证机器IP if ( $remote_addr ~* "X.X.X.X") { set $backend $test; } proxy_pass https://$backend; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } } B边节点下线-代码示例 worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format main '$time_local|$remote_addr[$remote_port]|$request|$request_method|$content_length|' '$content_type|$http_referer|$host|$http_x_forwarded_for|' '$http_true_client_ip|$server_name|$request_uri|$server_addr|$server_port|' '$status|$request_time|$upstream_addr|$upstream_response_time|$cookie_domain_tag'; access_log logs/access.log main; #访问日志:存放路径,日志级别。 error_log logs/error.log; #错误日志:存放路径。 sendfile on; keepalive_timeout 65; upstream portal { # 下面填入A主机IP及应用服务端口 server X.X.X.X:X; # 下面填入B主机IP及应用服务端口 #server X.X.X.X:X; #B节点下线 } upstream portal_test { # 下面填入A主机IP及应用服务端口 server X.X.X.X:X; # 下面填入B主机IP及应用服务端口 server X.X.X.X:X; } server { listen XXX;#填入Nginx端口 server_name localhost; location / { set $backend portal; set $test portal_test; #下面填入灰度验证机器IP #if ( $remote_addr ~* "X.X.X.X") { # set $backend $test; #} proxy_pass https://$backend; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } } B边节点灰度上线-代码示例 worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format main '$time_local|$remote_addr[$remote_port]|$request|$request_method|$content_length|' '$content_type|$http_referer|$host|$http_x_forwarded_for|' '$http_true_client_ip|$server_name|$request_uri|$server_addr|$server_port|' '$status|$request_time|$upstream_addr|$upstream_response_time|$cookie_domain_tag'; access_log logs/access.log main; #访问日志:存放路径,日志级别。 error_log logs/error.log; #错误日志:存放路径。 sendfile on; keepalive_timeout 65; upstream portal { # 下面填入A主机IP及应用服务端口 server X.X.X.X:X; # 下面填入B主机IP及应用服务端口 #server X.X.X.X:X; #B节点下线 } upstream portal_test { # 下面填入A主机IP及应用服务端口 #server X.X.X.X:X; # 下面填入B主机IP及应用服务端口 server X.X.X.X:X; #B节点灰度上线 } server { listen XXX;#填入Nginx端口 server_name localhost; location / { set $backend portal; set $test portal_test; #下面填入灰度验证机器IP if ( $remote_addr ~* "X.X.X.X") { set $backend $test; } proxy_pass https://$backend; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } } 节点上线-代码示例 worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format main '$time_local|$remote_addr[$remote_port]|$request|$request_method|$content_length|' '$content_type|$http_referer|$host|$http_x_forwarded_for|' '$http_true_client_ip|$server_name|$request_uri|$server_addr|$server_port|' '$status|$request_time|$upstream_addr|$upstream_response_time|$cookie_domain_tag'; access_log logs/access.log main; #访问日志:存放路径,日志级别。 error_log logs/error.log; #错误日志:存放路径。 sendfile on; keepalive_timeout 65; upstream portal { # 下面填入A主机IP及应用服务端口 server X.X.X.X:X; # 下面填入B主机IP及应用服务端口 server X.X.X.X:X; } upstream portal_test { # 下面填入A主机IP及应用服务端口 server X.X.X.X:X; # 下面填入B主机IP及应用服务端口 server X.X.X.X:X; } server { listen XXX;#填入Nginx端口 server_name localhost; location / { set $backend portal; set $test portal_test; #下面填入灰度验证机器IP #if ( $remote_addr ~* "X.X.X.X") { # set $backend $test; #} proxy_pass https://$backend; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
  • 方案架构 系统升级时,若采用蓝绿部署方式,开发人员需进行如下操作: 先将A边服务器(原蓝环境)下线,同时访问流量将全部切分到B边服务器,此时对A边服务器进行升级操作。 A边服务器升级完毕后,将A边服务器设为灰度测试环境,由测试人员对A边服务器进行灰度验证。 灰度验证完毕且功能正常后,A边业务服务器(绿环境)正式上线,并将所有流量切分到A边业务服务器,此时蓝绿部署完毕。 在服务运行过程中,如果A边服务器出现紧急情况,执行蓝绿倒换实现业务快速恢复。 图1 灰度发布原理 若采用金丝雀灰度部署方式,再重复前面的操作,将B边服务器进行升级,并完成灰度测试及正式上线,此时就完成新系统的灰度发布。
  • 步骤详情 表1 参数说明 参数项 说明 步骤显示名称 步骤添加后在部署步骤显示的名称。仅支持汉字、英文字母、数字、空格、或-_,;:./()()符号,其中空格不可在名称开头或结尾使用,长度为1-128。 部署租户 当前租户:表示将软件包部署到当前租户的CCE集群中发布。 选择“当前租户”,当前租户需要有CCE集群操作权限,如果当前没有CCE集群操作权限,可以通过下方的 IAM 授权选择已有权限的授权用户进行部署。 其他租户:表示通过IAM授权方式将软件包部署到其他租户的CCE集群中发布。 选择“其他租户”,则必须选择授权租户进行CCE集群部署。 说明: IAM授权 如果当前用户无操作权限执行接口时,可通过IAM提权获取到其他用户的临时AK/SK去执行CCE接口。 区域 选择要部署的区域。 集群名称 选择CCE云容器引擎中申请的K8S集群。 命名空间名称 选择CCE云容器引擎中K8S集群的命名空间。 工作负载名称 选择需要部署的工作负载。 实例数量 填写需要部署的实例数量。 说明: 若实例数量输入为空,则自动适配CCE集群实时实例数量。 容器名称 选择需要部署的容器实例名。 镜像名称 选择需要部署的镜像。 镜像版本 选择需要部署的镜像版本。 容器规格 可配置目标工作负载中的目标容器的容器规格。 CPU配额 配额申请:容器使用的最小CPU需求,作为容器调度时资源分配的判断依赖。只有当节点上可分配CPU总量 ≥ 容器CPU申请数时,才允许将容器调度到该节点。 配额限制:容器能使用的CPU最大值,如果CPU使用值大于限制值,则容器使用CPU资源可能会被限流。 内存配额 配额申请:容器使用的最小内存需求,作为容器调度时资源分配的判断依赖。只有当节点上可分配内存总量 ≥ 容器内存申请数时,才允许将容器调度到该节点。 配额限制:容器能使用的内存最大值。当内存使用率超出设置的内存限制值时,该实例可能会被重启进而影响工作负载的正常使用。 环境变量 支持配置目标工作负载中的目标容器的环境变量 支持获取容器实时环境变量并同步到当前页面,同步后将覆盖本页面原有环境变量。 JAVA探针 可协助您快速进行工作负载的问题定位与性能瓶颈分析,详情可参考性能管理配置(性能瓶颈分析) 。 探针类型: APM 2.0探针:JAVA探针将分配 0.25 Core CPU 和 250 MiB 内存供初始化容器使用; 不启用:不启用探针问题定位; 当探针类型选择“APM2.0探针”时,需要填选以下信息。 探针版本:选择探针的版本; 探针升级策略:选择“重启自动升级”或“重启手动升级”; 重启自动升级:每次都尝试重新下载镜像。 重启手动升级:如果本地有该镜像,则使用本地镜像,本地不存在时下载镜像。 APM环境:填写APM环境信息(选填); APM业务:选择已有的APM业务; 子业务:填写子业务(选填); 接入密钥AK:将会自动获取APM服务的密钥信息,可前往APM控制台查看密钥详情。 关于APM2.0参数概念的详细说明,请参见APM参数说明。 控制选项 当前步骤部署失败后,应用是否继续部署后续的步骤。 超时时间 指定该步骤最大执行时间,时间单位为分钟。在手动停止应用之前,执行时长大于超时时长,系统将该步骤设置为执行超时状态。取值范围:1-30 。
  • 请求示例 查询应用项目级权限矩阵 https://{endpoint}/v3/applications/permissions?project_id=0a38ce9ba3c740c199a0f872b6163661 查询应用实例级权限矩阵 https://{endpoint}/v3/applications/permissions?app_id=0a38ce9ba3c740c199a0f872b6163661
  • 响应示例 状态码: 200 OK 请求响应成功 { "result" : [ { "can_copy" : true, "can_create_env" : true, "can_delete" : true, "can_disable" : true, "can_execute" : true, "can_manage" : true, "can_modify" : true, "can_view" : true, "name" : "应用创建者", "region" : "cn-north-7", "role_id" : "0", "role_type" : "app-creator" }, { "can_copy" : true, "can_create_env" : true, "can_delete" : true, "can_disable" : true, "can_execute" : true, "can_manage" : true, "can_modify" : true, "can_view" : true, "name" : "项目管理员", "region" : "cn-north-7", "role_id" : "2e510051361942a8b7ecea00144172b3", "role_type" : "project" } ], "status" : "success" }
  • 响应参数 状态码: 200 表3 响应Body参数 参数 参数类型 描述 result Array of ApplicationPermissionVO objects 角色应用权限 status String 请求成功失败状态 表4 ApplicationPermissionVO 参数 参数类型 描述 can_modify Boolean 是否有编辑权限 can_delete Boolean 是否有删除的权限 can_view Boolean 是否有查看权限 can_execute Boolean 是否有执行权限 can_copy Boolean 是否有复制权限 can_manage Boolean 是否有管理权限,包含增删改查执行以及权限修改 can_create_env Boolean 是否有新建环境权限 can_disable Boolean 是否有禁用权限 name String 角色名称 region String 局点信息 role_id String 角色id role_type String 角色类型, app-creator: 应用创建者; project: 项目管理员;template-customized-inst:系统角色; template-project-customized、project-customized:自定义角色
  • 请求示例 https://{endpoint}/v1/applications/43943381f7764c52baae8e697720873f/environments { "project_id" : "55837d272adf4eee90319800e2da6961", "name" : "Environment name", "deploy_type" : 0, "description" : "Environment Description", "os" : "linux" }
  • 请求参数 表2 请求Header参数 参数 是否必选 参数类型 描述 Content-Type 是 String 消息体的类型(格式) X-Auth-Token 是 String 用户Token。通过调用IAM服务获取用户Token接口获取(响应消息头中X-Subject-Token的值) 表3 请求Body参数 参数 是否必选 参数类型 描述 project_id 是 String 项目id,获取方式请参见获取项目id。 name 是 String 环境名称 deploy_type 是 Integer 部署类型:0表示主机, 1表示kubernetes os 是 String 操作系统:windows|linux,需要和主机集群保持一致 description 否 String 环境描述