云服务器内容精选

  • Linux系统主机配置 为确保Linux系统主机连通性验证成功,Linux主机需确保安装Python并开启SELinux机制,目标主机需要满足以下条件。 目标主机安装Python: 需安装Python2.6及以上版本,如果已安装Python2.6以下版本,需要在主机上安装以下模块,各系统安装命令如下: Ubuntu系统 sudo apt install python-minimal python-simplejson Centos或Euler系统 sudo yum install python-minimal python-simplejson ln -s /usr/bin/python2 /usr/bin/python 采用Apt或者Yum安装工具时,请确保已配置可用的源。 主机开启SELinux机制并安装“libselinux-python”模块: 查看SELinux状态,命令如下: /usr/sbin/sestatus “SELinux”状态参数值所对应的模式: SELinux=disabled:未开启。 SELinux=enforcing:强制模式,表示所有违反安全策略的行为都将被禁止。 SELinux=permissive:宽容模式,表示所有违反安全策略的行为不被禁止,但是会在日志中作记录。 若SELinux=disabled,则主机未开启该机制,需修改SELinux状态,步骤如下: 编辑SELinux的config文件,执行命令: vi /etc/selinux/config 根据实际情况选择修改SELinux参数为参数: SELinux=enforcing:强制模式,表示所有违反安全策略的行为都将被禁止。 SELinux=permissive:宽容模式,表示所有违反安全策略的行为不被禁止,但是会在日志中作记录。 修改完成按键盘“Esc键”,退出编辑模式,执行下面的命令,保存并退出文件。 wq 在根目录下创建隐藏文件.autorelabel,执行下面的命令后,重启Linux主机。 touch /.autorelabel 在主机上安装“libselinux-python”模块,各系统安装命令如下: Ubuntu系统 sudo apt install libselinux-python Centos或Euler系统 sudo yum install libselinux-python
  • Windows系统代理机配置 所需资源 已有Windows机器。 代理机和主机网络连通正常。 操作步骤 进入代理机,打开powershell窗口,执行netsh命令,注意按参数说明替换参数: netsh interface portproxy add v4tov4 listenaddress=${proxy_ip} listenport=${proxy_port} connectaddress=${host_ip} connectport=${host_port} 表2 参数说明 参数 参数释义 ${proxy_ip} 代理机私网IP ${proxy_port} 代理机监听端口,如54 ${host_ip} 主机私网IP ${host_port} 主机端口,一般为5986 进行安全配置,需要开通代理监听端口,即上述指令中的${proxy_port}。
  • 方案架构 系统升级时,若采用蓝绿部署方式,开发人员需进行如下操作: 先将A边服务器(原蓝环境)下线,同时访问流量将全部切分到B边服务器,此时对A边服务器进行升级操作。 A边服务器升级完毕后,将A边服务器设为灰度测试环境,由测试人员对A边服务器进行灰度验证。 灰度验证完毕且功能正常后,A边业务服务器(绿环境)正式上线,并将所有流量切分到A边业务服务器,此时蓝绿部署完毕。 在服务运行过程中,如果A边服务器出现紧急情况,执行蓝绿倒换实现业务快速恢复。 图1 灰度发布原理 若采用金丝雀灰度部署方式,再重复前面的操作,将B边服务器进行升级,并完成灰度测试及正式上线,此时就完成新系统的灰度发布。
  • 附录 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; } } }
  • 方案架构 系统升级时,开发人员第一次部署应用会创建出一组灰度负载,此时灰度负载中的系统版本为新版本,此时Service将部分流量转发至灰度负载上,由测试人员在灰度负载中进行版本验证。版本验证结束后,开发人员开始第二次部署应用升级现网服务,此时Service将全部流量转发至灰度负载上并升级现网服务,现网服务升级到最新版本后,Service将全部流量转发回现网负载并释放灰度负载,完成新系统的发布。 图1 灰度发布原理
  • 前提条件 已有可用项目,如果没有,请先新建 CodeArts 项目。 具有创建应用的权限,参考权限管理。 服务包含以下资源,并定义为v1版本: 已有CCE集群,示例:cce-demo; CCE集群中已创建无状态工作负载,示例:deployment-doc; CCE集群中已创建服务,示例:service-doc; CCE集群中已创建路由,示例:ingress-doc; CCE集群中已安装nginx-ingress插件。
  • 购买并配置云容器引擎 本节中使用的是云容器引擎CCE。 通过控制台可购买CCE集群。 其中集群及节点的必要配置建议参照表1与表2,表中未涉及的可根据实际情况选择。 表1 CCE集群购买配置 配置分类 配置项 配置建议 基础配置 集群类型 选择“CCE Standard 集群”。 计费模式 选择“按需计费”。 集群版本 根据需要选择,建议选择最新版本。 网络配置 容器网络模型 选择“容器隧道网络”。 虚拟私有云 选择已有的虚拟私有云,如果列表中没有合适的选项,单击“新建虚拟私有云”完成创建。 子网 选择已有的子网,如果列表中没有合适的选项,单击“新建子网”完成创建。 容器网段 勾选“自动设置网段”。 表2 节点配置 配置分类 配置项 配置建议 计算配置 计费模式 选择“按需计费”。 节点类型 选择“弹性云服务器-虚拟机”。 节点规格 选择2vCPUs 8GiB及以上规格即可。 操作系统 选择公共镜像中的Euler镜像。 节点名称 输入自定义名称 。 登录方式 选择“密码”。 密码 输入自定义密码 。 网络配置 节点IP 选择“自动分配”。 弹性公网IP 选择“自动创建”。
  • 编辑应用基本信息 选择目标应用,单击图标,单击“编辑”,进入“部署步骤”页面。 单击“基本信息”,切换到“基本信息”页面,可根据需要对名称、描述、执行主机等信息进行修改。 表1 参数说明 参数项 说明 名称 必填。应用的名称。 所属项目 默认。该应用的归属项目。如果账号下没有项目请您在项目选择框中选择“新建项目”会先弹出“新建项目”页面,这时建立的项目是Scrum。 描述 可选。对应用的描述。 执行主机 可选。资源池是部署软件包时执行部署命令的物理环境的集合,您可以使用华为云托管的官方资源池,您也可以将自有的服务器作为自托管资源池托管到华为云,托管方式请参考自托管资源池场景。 来自流水线 可选。开启后,只能通过流水线驱动执行,不能单独执行。 注意:如果租户账号已配置“全内网安全访问”功能(仅限白名单用户使用),则“执行主机”功能默认选择“自托管资源池”且不可更改。 修改完所有信息,单击“保存”,保存该应用。
  • 参数使用 下面以具体示例演示介绍如何使用自定义参数。 选择目标应用,单击图标,单击“编辑”,进入“部署步骤”页面。 单击“参数设置”,切换到“参数设置”页面,分别创建环境、枚举、字符串三种类型的自定义参数并打开“运行时设置”。 单击“部署步骤”,切换到“部署步骤”页面,在步骤详情中引用自定义参数。 参数引用形式:${参数名},在参数输入框输入“$”符号后会自动出现参数列表,如${Param_1}。 单击“保存并部署”,在弹窗中可重新对参数进行赋值。 单击“确定”,保存并部署该应用。 在流水线关联应用的时候,可将参数动态绑定; 在运行流水线的时候,输入的参数值会替换到应用中并运行; 在流水线中添加一个类型为部署的任务步骤,选择已配置运行时设置参数的应用,运行流水线时可动态设置。
  • 创建并配置参数 介绍应用中自定义参数的创建和配置。 选择目标应用,单击图标,单击“编辑”,进入“部署步骤”页面。 单击“参数设置”,切换到“参数设置”页面。 参数信息说明如下: 基本信息 说明 新建参数 单击“新建参数”,可以新增参数。 名称 参数名称。可修改自定义参数名称。 说明: 自定义参数名称不可与系统预定义参数名称相同。 类型 参数可选类型,包括:字符串类型、枚举类型和环境类型。 默认值 根据需要填写/选择参数值。 说明: 选择环境类型时,如果没有环境,需要手动新建环境。 私密参数 参数为私密参数时,系统会将输入参数做加密存储,使用时进行解密,不可设置“运行时设置”。 运行时设置 打开“运行时设置”开关,表示部署应用时支持变更参数值,并且也会把该参数上报应用。运行时参数需要执行时输入。 参数描述 对本参数的描述。 操作 单击参数所在行,可以删除该参数。 单击“新建参数”,新增一个参数,根据需要自定义参数名称、类型(默认为“字符串”类型)、默认值,设置私密参数及运行时设置等。 字符串类型 参数值为字符串,可在“默认值”列自定义参数值,设置私密参数及运行时设置等。 枚举类型 选中枚举类型后弹出“枚举”对话框,可以设置“可选取值”,如需设置多个,可单击图标添加。如需删除,可单击图标移除。 设置完成后,在“默认值”列的下拉列表选择其中一个值,如下图。 环境类型 该类型参数通过“默认值”列下拉列表选择环境,下拉列表中可选所在应用下创建的所有环境。 如果下拉列表没有可选项,需要在“环境管理”页签新建环境,新建完成后回到参数配置页面,然后单击刷新,将新的环境刷新到下拉列表中即可使用。 修改完所有信息,单击“保存”,保存该应用。
  • 编辑参数 选择目标应用,单击图标,单击“编辑”,进入“部署步骤”页面。 单击“参数设置”,切换到“参数设置”页面。 编辑参数 可对已有参数的参数名称、类型、默认值、私密参数、运行时设置、参数描述进行编辑。并可通过单击图标,拖拽参数行,移动参数顺序。 新增参数 单击“新建参数”,可在已有参数的基础上新增参数。同样单击参数操作列的图标,可在当前参数下方,新增一行参数并设置。 删除参数 单击图标,可对已有参数进行删除。
  • 服务概述 部署(CodeArts Deploy)提供可视化、自动化部署服务。提供丰富的部署步骤,有助于用户制定标准的部署流程,降低部署成本,提升发布效率。 部署服务具有以下特性: 支持主机(物理机、虚拟机)部署和容器部署。 预置Tomcat、SpringBoot、Django等系统模板快速新建应用,提供丰富的原子步骤,支持拖拉拽方式自由编排组装应用。 主机部署场景以环境为粒度,支持多台主机同时部署。 基于云容器引擎服务(CCE),实现容器部署。 基于应用管理与运维平台服务(ServiceStage),实现微服务应用部署。 支持保存自定义模板,通过模板一键创建应用。 支持参数化配置,提供字符串、环境、枚举等参数类型,部署应用时支持参数的动态替换。 与流水线服务无缝集成,支持业务持续发布。 原子步骤独立输出部署日志,提供关键字匹配FAQ,部署失败能够快速定位原因并提供解决方案。
  • 使用部署服务可以做什么? 部署服务提供的功能如下表所示。 表1 功能列表 特性 描述 基础资源管理 可以添加一个或多个主机并进行连通性验证;可以新建主机集群对多个主机统一操作;通过搜索主机名或IP地址查找某主机;主机和主机集群可以修改和删除。 应用管理 可以创建一个或多个应用,应用可以通过预定义模板或者自由编排步骤创建;支持按照名字查找和过滤应用;可以修改和删除应用。 参数设置 应用的步骤支持参数引用,在部署时由您指定参数值,应用支持指定值替换相应参数部署。 动态执行参数 应用支持动态执行参数,在部署时动态输入参数无需修改应用,增强应用的重用性和灵活性。 选择应用包 支持从制品仓库选择应用包。应用包可以在编译构建中自动归档到制品仓库中。 上传应用包 支持从本地上传应用包到制品仓库。 部署动态 应用部署产生的服务动态消息,包括部署成功、部署失败和应用更新和删除消息。 并行部署 可以在一个应用中选择多个主机和多个环境,实现多主机并行部署。 部署详情 可以查看部署详情,可视化显示部署进程、当前部署应用信息。 部署日志 部署详情页面可以查看部署日志,多主机并行部署支持分主机日志查看。 流水线集成 可以在流水线集成应用,编排应用并行或者串行执行;支持流水线参数。
  • 计费相关 部署服务不支持单独购买,开通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社区的约束与限制