华为云用户手册

  • 请求消息 表3 请求Header参数 参数 是否必选 参数类型 描述 Content-Type 是 String 消息体的类型(格式),默认取值为“application/json;charset=utf8”。 X-Auth-Token 是 String 调用接口的认证方式分为Token和AK/SK两种,如果您使用的Token方式,此参数为必填,请填写Token的值。Token获取方式,请参考获取用户Token。
  • 响应示例 [ { "id": "8177d237-b912-4167-a90d-33c603610d0b", "host": "provider..demo-java-chassis-cse-v2.servicecomb", "name": "provider", "service_source_name": "cscs", "engine_id": "d68a5ca7-b5b6-4917-a464-0adef94b8067", "engine_type": "servicecomb", "swimlane_group_id": null, "swimlane_group_name": null, "status": null }, { "id": "8d8d5d85-2ae6-463b-b2e9-0fa9d9a0aa7d", "host": "test.static", "name": "test", "service_source_name": "static", "engine_id": null, "engine_type": null, "swimlane_group_id": null, "swimlane_group_name": null, "status": "MICROSERVICE_OF_TARGET_SERVICE_UNROUTING" }]
  • 请求消息 表2 请求Header参数 参数 是否必选 参数类型 描述 Content-Type 是 String 消息体的类型(格式),默认取值为“application/json;charset=utf8”。 X-Auth-Token 是 String 调用接口的认证方式分为Token和AK/SK两种,如果您使用的Token方式,此参数为必填,请填写Token的值。Token获取方式,请参考认证鉴权。
  • URI GET /v3/{project_id}/cas/configs 表1 路径参数 参数 是否必选 参数类型 描述 project_id 是 String 租户项目ID。获取方法,请参考获取项目ID。 表2 查询参数 参数 是否必选 参数类型 描述 name 否 String 配置文件名称。 config_group_id 否 String 配置分组ID。 component_id 否 String 组件ID。 limit 否 integer 指定个数,取值[0, 100]。 offset 否 integer 指定偏移量。 order_by 否 String 排序字段,默认按创建时间排序。 create_time,配置文件创建时间。 name,配置文件名称。 update_time,配置文件修改时间。 order 否 String 排序方式。 desc,降序排序,默认排序方式。 asc,升序排序。
  • 请求消息 表3 请求Header参数 参数 是否必选 参数类型 描述 Content-Type 是 String 消息体的类型(格式),默认取值为“application/json;charset=utf8”。 X-Auth-Token 是 String 调用接口的认证方式分为Token和AK/SK两种,如果您使用的Token方式,此参数为必填,请填写Token的值。Token获取方式,请参考ServiceStage错误码。
  • 响应示例 {"configs": [{"id": "f5a52d93-1587-45cf-b8fe-5c7f204b98d1","config_group_id": "4808b50d-d7f3-401b-9175-968cb4f9892b","name": "test-config1","description": null,"type": "properties","content": "testKey = testValue","version": "v1","project_id": "2cfeefc3e4c54a5aa7548b8350e638d7","sensitive": false,"create_time": 1717486892611,"update_time": 1717486892611,"components": [{"application_id": "8a3be48a-6401-4e8c-bbce-033745252227","component_id": "4b611997-4acd-4538-a06b-32fd2475e057","component_name": "component-test1","environment_id": "d2d7180c-7739-4cbb-bd8e-0911ba31cf51"}],"creator": "ss-test"},{"id": "2cb1897e-c23b-48a5-993c-dc7ad3c552a0","config_group_id": "f3e6d5b4-4d7d-4009-b806-22cfed2ac6ea","name": "test-config2","description": null,"type": "properties","content": "testKey = testValue","version": "v1","project_id": "2cfeefc3e4c54a5aa7548b8350e638d7","sensitive": false,"create_time": 1717486590467,"update_time": 1717486590467,"components": [],"creator": "ss-test"}],"count": 2}
  • 响应消息 表4 响应参数 参数 参数类型 描述 count Integer 配置文件总数。 configs Array of objects 配置文件列表,请参考表5。 表5 configs 参数 参数类型 描述 config_group_id String 配置分组ID。 id String 配置文件ID。 name String 配置文件名称。 description String 配置文件描述。 creator String 创建人。 type String 配置文件类型: yaml properties content String 配置文件内容。 version String 配置文件版本号。 project_id String 项目ID。 sensitive Boolean 配置文件内容是否加密: true,加密。 false,不加密。 components Array of objects 配置文件绑定的组件列表,请参考表6。 create_time Integer 创建时间。 update_time Integer 修改时间。 表6 components 参数 参数类型 描述 application_id String 应用ID。 component_id String 组件ID。 component_name String 组件名称。 environment_id String 环境ID。
  • 响应示例 {"runtime_stacks": [{"id": "1c5e7000-f2f2-4fc2-988f-0a22ca67940f","name": "OpenJDK11","project_id": "578ac30b81034b89a7255b3af26db9c9","deploy_mode": "virtualmachine","type": "Java","version": "1.3.7","spec": {"os": "Linux","sdk": "OpenJDK-11.0.23","parameters": null},"system": 1,"status": "Supported","create_time": 1722416061588,"update_time": 1722416098865,"component_count": 3},{"id": "b153f6b8-9335-46a1-913e-c2d8f966d4b2","name": "CustomJdk","project_id": "578ac30b81034b89a7255b3af26db9c9","deploy_mode": "virtualmachine","type": "Java","version": "1.0.0","spec": {"os": null,"sdk": null,"parameters": {"jdk_url": "obs://cyf/bisheng-jdk-8u412-linux-aarch64.tar.gz"}},"system": 0,"status": "Disable","creator": "cyf","create_time": 1722932102641,"update_time": 1722932102641,"component_count": 0}],"total": 2}
  • 请求消息 表2 请求Header参数 参数 是否必选 参数类型 描述 Content-Type 是 String 消息体的类型(格式),默认取值为“application/json;charset=utf8”。 X-Auth-Token 是 String 调用接口的认证方式分为Token和AK/SK两种,如果您使用的Token方式,此参数为必填,请填写Token的值。Token获取方式,请参考认证鉴权。
  • URI POST /v3/{project_id}/cas/swimlane-group/{lane_group_id}/swimlane/{lane_id}/components-action 表1 路径参数 参数 是否必选 参数类型 描述 project_id 是 String 租户项目ID。获取方法,请参考获取项目ID。 lane_group_id 是 String 泳道组ID。获取方法,请参考获取所有泳道组。 lane_id 是 String 泳道ID。获取方法,请参考获取泳道组下所有泳道。
  • 请求消息 表2 请求Header参数 参数 是否必选 参数类型 描述 Content-Type 是 String 消息体的类型(格式),默认取值为“application/json;charset=utf8”。 X-Auth-Token 是 String 调用接口的认证方式分为Token和AK/SK两种,如果您使用的Token方式,此参数为必填,请填写Token的值。Token获取方式,请参考认证鉴权。 表3 请求Body参数 参数 是否必选 参数类型 描述 action 是 String 泳道组件实例纳管移除操作。 ADD:纳管组件。 REMOVE:移除组件。 instance_ids 是 Array of String 组件实例列表。
  • 响应示例 { "id": "8f8a5b33-ee1f-4a70-b3a9-c1b179a69fd2", "name": "base", "swimlane_group_id": "5447f910-ab74-4d15-b2ab-dd0945900ce9", "type": "BASE", "tag": "base", "route_status": "ENABLE", "rule_match_mode": null, "project_id": "86a1f7b663b349e89071a3090d9d81f3", "rules": null, "creator": "w00842292", "create_time": 1722848532908, "update_time": 1722848532908, "instances": [ { "componentId": "0b582884-1ad0-4183-8d6d-16998f54818f", "id": "887f99d7-4ce5-431d-924f-6a328cb05572", "name": "comp-uh59l7s2", "version": "1.0.0", "application_id": "70502782-4f93-4eda-af19-415bac2d12ae", "application_name": "app-apitest-1o6l", "replica": 0 } ], "instance_count": 1, "weight": 100, "batch_status": null, "latest_opt": null, "release_plan_id": null}
  • 响应示例 {"swimlanes" : [{"id" : "9974a8b3-cbd7-4084-bac9-194f7d5ba3da","name" : "gray","swimlane_group_id" : "b76dad96-66cf-4ae7-aa55-11b6d630e777","type" : "GRAY","tag" : "gray","weight" : 0,"route_status" : "DISABLED","rule_match_mode" : null,"project_id" : "4008a952b3f44b5a919c9a48d90811f3","rules" : null,"creator" : "test_user","create_time" : 1722928561358,"update_time" : 1722928561358}],"count" : 1}
  • 响应消息 表3 响应参数 参数 参数类型 描述 swimlanes Array of objects 泳道列表,请参考表4。 count Integer 泳道列表数量。 表4 swimlanes 参数 参数类型 描述 id String 泳道ID。 name String 泳道名称。 swimlane_group_id String 所属的泳道组ID。 type String 泳道类型。 BASE:基线泳道。 GRAY:灰度泳道。 tag String 泳道标签,根据标签来控制流量的走向。 route_status String 泳道路由状态。 ENABLE:开启路由。 DISABLED:关闭路由。 rule_match_mode String 路由规则匹配模式。 当泳道组灰度类型为基于内容,即gray_release_type为CONTENT时生效。 ALL:匹配所有的规则。 ANY:匹配任一规则。 rules Array of objects 路由规则。当泳道组灰度类型为基于内容,即gray_release_type为CONTENT时生效。请参考表5。 weight Integer 泳道流量权重。范围在0-100之间。 当泳道组灰度类型为基于流量,即gray_release_type为WEIGHT时生效。 project_id String 项目ID。 create_time Integer 创建时间。 update_time Integer 更新时间。 creator String 创建人。 表5 rules 参数 参数类型 描述 type String 灰度匹配规则类型。当前只支持HEADER,即基于Header头进行匹配。 key String 键。 value String 值。 condition String 匹配条件。 EXACT:精确匹配。 PREFIX:前缀匹配。 REGEX:正则匹配。
  • 请求消息 表2 请求Header参数 参数 是否必选 参数类型 描述 Content-Type 是 String 消息体的类型(格式),默认取值为“application/json;charset=utf8”。 X-Auth-Token 是 String 调用接口的认证方式分为Token和AK/SK两种,如果您使用的Token方式,此参数为必填,请填写Token的值。Token获取方式,请参考获取用户Token。
  • 响应示例 { "gateways": [ { "id": "71949725-9c8f-483a-a05f-74d33ff1613e", "name": "microGateway-cy8bhr", "target_services": [ { "id": "8177d237-b912-4167-a90d-33c603610d0b", "host": "provider..demo-java-chassis-cse-v2.servicecomb", "name": "provider", "engine_id": "d68a5ca7-b5b6-4917-a464-0adef94b8067", "engine_type": "servicecomb" } ], "engine_id": "d68a5ca7-b5b6-4917-a464-0adef94b8067" } ], "id": "ba1ca687-1895-4fc3-88ca-9db02ce2a14e", "name": "test", "gray_release_type": "WEIGHT", "description": "test-descption", "project_id": "578ac30b81034b89a7255b3af26db9c9", "creator": "test_user", "create_time": 1726623793113, "update_time": 1726623793113, "swimlanes": [ { "id": "1cd0cb71-5d5d-41a0-8b05-f7ed53400cf7", "name": "base", "swimlane_group_id": "ba1ca687-1895-4fc3-88ca-9db02ce2a14e", "type": "BASE", "tag": "base", "route_status": "ENABLE", "rule_match_mode": null, "project_id": "578ac30b81034b89a7255b3af26db9c9", "rules": null, "creator": "test_user", "create_time": 1726626094346, "update_time": 1726626094346, "instances": [ { "componentId": "c14f17b7-ac44-4738-8b57-4be7eff7a956", "environmentId": "d1b623d9-3350-4777-8979-5b4b571ca518", "id": "5fd78836-301e-4750-bdc9-be8a9e43b19a", "name": "weater-beta", "version": "2024.0914.17114", "application_id": "69993ce9-e468-3349-acb8-a30b85b17de5", "application_name": "weathermap", "status": "RUNNING", "engine_id": "d68a5ca7-b5b6-4917-a464-0adef94b8067", "runtime_stack": { "id": "656d9392-658f-4c2c-bb4f-3702a1169267", "url": "openjdk-{arch}:8-1.3.8", "type": "Java", "name": "OpenJDK8", "deploy_mode": "container", "app_spec_name": "", "version": "1.3.8", "status": "Supported", "release_note": "Fixed some security issues and bugs.", "spec": { "os": "EulerOS 2.9.8", "sdk": "OpenJDK-8u411", "digest": null }, "parameters": null, "system": null }, "replica": 1 } ], "instance_count": 1, "weight": 50, "batch_status": null, "latest_opt": null, "release_plan_id": null }, { "id": "414dccf2-3c15-47c2-8479-0337a5ccc4d9", "name": "gray", "swimlane_group_id": "ba1ca687-1895-4fc3-88ca-9db02ce2a14e", "type": "GRAY", "tag": "gray", "route_status": "ENABLE", "rule_match_mode": null, "project_id": "578ac30b81034b89a7255b3af26db9c9", "rules": null, "creator": "test_user", "create_time": 1726627610327, "update_time": 1726627610327, "instances": null, "instance_count": 0, "weight": 50, "batch_status": null, "latest_opt": null, "release_plan_id": null } ], "swimlane_count": 2, "engine_ids": [ "d68a5ca7-b5b6-4917-a464-0adef94b8067" ]}
  • 请求示例 修改ID为ba1ca687-1895-4fc3-88ca-9db02ce2a14e的泳道组网关路由配置。 { "gray_release_type": "WEIGHT", "swimlanes": [ { "id": "1cd0cb71-5d5d-41a0-8b05-f7ed53400cf7", "weight": 50 }, { "id": "414dccf2-3c15-47c2-8479-0337a5ccc4d9", "weight": 50 } ]}
  • 响应消息 表6 响应参数 参数 参数类型 描述 id String 泳道组ID。 name String 泳道组名称。 description String 泳道组描述。 creator String 创建人。 project_id String 项目ID。 gray_release_type String 泳道组灰度类型。 WEIGHT:基于流量比例进行全链路灰度。 CONTENT:基于内容进行全链路灰度。 engine_ids Array of String 网关目标服务引擎ID。 gateways Array of objects 目标服务列表,请参考表7。 swimlane_count Integer 泳道数量。 swimlanes Array of objects 泳道列表,请参考表9。 create_time Integer 创建时间。 update_time Integer 更新时间。 表7 gateways 参数 参数类型 描述 id String 网关ID。 name String 网关名称。 engine_id String 目标服务引擎ID,对应于目标服务对应的服务来源所用的引擎ID。 target_services Array of objects 目标服务列表,对应于网关服务管理中的服务。请参考表8。 表8 target_services 参数 参数类型 描述 id String 目标服务ID。 name String 目标服务名称。 host String 目标服务host信息。 host信息由目标服务的接入引擎后的微服务名、微服务所在环境名、微服务所属应用名称已经微服务接入的引擎类型组成,以点号(.)分隔。 例如,unit-controller.testing.test-application.servicecomb。unit-controller为接入引擎的微服务名称,testing为unit-controller微服务所在环境名,test-application为unit-controller微服务所属应用名称,servicecomb表示unit-controller微服务接入的是ServiceComb引擎。 表9 swimlanes 参数 参数类型 描述 id String 泳道ID。 name String 泳道名称。 swimlane_group_id String 所属的泳道组ID。 type String 泳道类型。 BASE:基线泳道。 GRAY:灰度泳道。 tag String 泳道标签,根据标签来控制流量的走向。 route_status String 泳道路由状态。 ENABLE:开启路由。 DISABLED:关闭路由。 rule_match_mode String 路由规则匹配模式。包括ALL和ANY。 ALL表示匹配所有的规则、ANY表示匹配任一规则。 当泳道组灰度类型为基于内容,即gray_release_type为CONTENT时生效。 rules Array of objects 路由规则。 当泳道组灰度类型为基于内容,即gray_release_type为CONTENT时生效。 请参考表10。 weight Integer 泳道流量权重。范围在0-100之间。 当泳道组灰度类型为基于流量,即gray_release_type为WEIGHT时生效。 instances Array of objects 泳道中纳管的组件列表。 请参考表11。 instance_count Integer 泳道中纳管的组件个数。 latest_opt String 泳道上一步的操作。 CLONE:克隆。 UPGRADE:升级。 ROLLBACK:回滚。 CREATE:创建。 release_plan_id String 泳道上一步操作关联的发布单ID。 project_id String 项目ID。 create_time Integer 创建时间。 update_time Integer 更新时间。 creator String 创建人。 表10 rules 参数 参数类型 描述 type String 灰度匹配规则类型。当前只支持HEADER,即基于Header头进行匹配。 key String 键。 value String 值。 condition String 匹配条件。 EXACT:精确匹配。 PREFIX:前缀匹配。 REGEX:正则匹配。 表11 instances 参数 参数类型 描述 id String 应用组件实例ID。 name String 应用组件实例名称。 version String 应用组件版本号。 application_id String 应用ID。 component_id String 组件ID。 application_name String 应用名称。 status String 实例状态。 engine_id String 组件关联引擎ID。 runtime_stack Object 运行时,请参考表12。 replica Integer 实例副本数。 表12 runtime_stack 参数 参数类型 描述 name String 技术栈名称。 type String 技术栈类型,支持Java、Tomcat、Nodejs、Php、Docker、Python。 当部署模式为虚机部署时,仅支持Java、Tomcat、Nodejs;容器部署上述类型都支持。 version String 技术栈版本。 deploy_mode String 部署模式。 container,容器部署。 virtualmachine,虚机部署。
  • 请求消息 表2 请求Header参数 参数 是否必选 参数类型 描述 Content-Type 是 String 消息体的类型(格式),默认取值为“application/json;charset=utf8”。 X-Auth-Token 是 String 调用接口的认证方式分为Token和AK/SK两种,如果您使用的Token方式,此参数为必填,请填写Token的值。Token获取方式,请参考获取用户Token。 表3 请求Body参数 参数 是否必选 参数类型 描述 gray_release_type 是 String 泳道组灰度类型。 WEIGHT:基于流量比例进行全链路灰度。 CONTENT:基于内容进行全链路灰度。 swimlanes 是 Array of objects 泳道列表,请参考表4。 表4 swimlanes 参数 是否必选 参数类型 描述 rule_match_mode 是 String 路由规则匹配模式。当泳道组灰度类型为基于内容,即gray_release_type为CONTENT时生效。 ALL:匹配所有的规则。 ANY:匹配任一规则。 rules 是 Array of objects 路由规则。当泳道组灰度类型为基于内容,即gray_release_type为CONTENT时生效。请参考表5。 weight 是 Integer 泳道流量权重,范围在0-100之间。当泳道组灰度类型为基于流量,即gray_release_type为WEIGHT时生效。 表5 rules 参数 是否必选 参数类型 描述 type 是 String 灰度匹配规则类型。当前只支持HEADER,即基于Header头进行匹配。 key 是 String 键。 value 是 String 值。 condition 是 String 匹配条件。 EXACT:精确匹配 PREFIX:前缀匹配。 REGEX:正则匹配。
  • 请求消息 表2 请求Header参数 参数 是否必选 参数类型 描述 Content-Type 是 String 消息体的类型(格式),默认取值为“application/json;charset=utf8”。 X-Auth-Token 是 String 调用接口的认证方式分为Token和AK/SK两种,如果您使用的Token方式,此参数为必填,请填写Token的值。Token获取方式,请参考获取用户Token。
  • 资源和成本规划 该解决方案主要部署如下资源,以下费用仅供参考,具体请参考华为云官网价格详情,实际收费以账单为准。 表1 资源和成本规划(按需计费) 华为云服务 配置示例 每月预估花费 华为云Flexus云服务器X实例 按需计费 区域:华北-北京四 规格:Flexus云服务器X实例 | 性能模式(关闭)| x1.2u.4g | 2核 | 4 GB 镜像:CentOS 7.9 64bit 系统盘:高IO | 40GB 购买量:2 352.22元 弹性公网IP EIP 区域:华北-北京四 计费模式:按需计费 线路:动态BGP 公网带宽:按流量计费 带宽大小:300Mbit/s 购买量:2 0.80元/GB 合计 - 352.22元 + 弹性公网IP EIP费用 表2 资源和成本规划(包年包月) 华为云服务 配置示例 每月预估花费 华为云Flexus云服务器X实例 包年包月 区域:华北-北京四 规格:Flexus云服务器X实例 | 性能模式(关闭)| x1.2u.4g | 2核 | 4 GB 镜像:CentOS 7.9 64bit 系统盘:高IO | 40GB 购买量:2 244.00元 弹性公网IP EIP 区域:华北-北京四 计费模式:按需计费 线路:动态BGP 公网带宽:按流量计费 带宽大小:300Mbit/s 购买量:2 0.80元/GB 合计 - 244.00元 + 弹性公网IP EIP费用
  • 方案架构 该解决方案基于Flexus云服务器X实例帮助您快速搭建公网IP不变业务迁移系统。 图1 方案架构图 该解决方案将会部署如下资源: 客户源端 创建两台Flexus云服务器X实例,并部署Nginx、Keepalived应用,实现主备切换。 创建两个弹性公网IP EIP并绑定到云服务器,用于提供访问公网和被公网访问能力。 目的端 创建两台Flexus云服务器X实例,模拟业务。 创建两个弹性公网IP EIP并绑定到云服务器,用于提供访问公网和被公网访问能力。
  • 快速部署 本章节主要帮助用户快速部署“公网IP不变业务迁移最佳实践”解决方案 表1 参数说明 参数名称 类型 是否可选 参数解释 默认值 vpc_name string 必填 虚拟私有云名称,该模板使用新建VPC,不允许重名。取值范围:1-54个字符,支持中文、英文字母、数字、_(下划线)、-(中划线)、.(点)。 migrating-services-without-changing-ip-addresses-demo secgroup_name string 必填 安全组名称,该模板新建安全组,请参考安全组规则修改进行配置。取值范围:1-64个字符,支持字母、数字、中文、下划线(_)、中划线(-)、英文句号(.)。 migrating-services-without-changing-ip-addresses-demo ecs_name string 必填 云服务器实例名称,不支持重名。取值范围:1-64个字符,支持中文、英文字母、数字、_(下划线)、-(中划线)、.(点)。 migrating-services-without-changing-ip-addresses-demo flexus_flavor string 必填 云服务器实例规格,支持弹性云服务器 E CS 及华为云Flexus 云服务器X实例。Flexus 云服务器X实例规格ID命名规则为x1.?u.?g,例如2vCPUs4GiB规格ID为x1.2u.4g,具体华为云Flexus 云服务器X实例规格请参考控制台。弹性云服务器规格名称,具体请参考官网弹性云服务器规格清单。 x1.2u.4g ecs_password string 必填 云服务器密码,长度为8-26位,密码至少必须包含大写字母、小写字母、数字和特殊字符(!@$%^-_=+[{}]:,./?)中的三种,仅支持小写字母、数字、中划线(-)、英文句号(.)。修改密码,请参考重置云服务器密码登录ECS控制台修改密码。管理员账户默认root。 空 ecs_volume_size number 必填 云服务器系统盘大小,磁盘类型默认为高IO,单位:GB,取值范围为40-1,024,不支持缩盘。 100 bandwidth_size number 必填 弹性公网带宽大小,该模板计费方式为按流量计费。单位:Mbit/s,取值范围:1-300Mbit/s。 300 charging_mode string 必填 计费模式,默认自动扣费,取值为prePaid(包年包月)或postPaid(按需计费)。 postPaid charge_period_unit string 必填 计费周期单位,当计费方式设置为prePaid,此参数是必填项。有效值为:month(包月)和year(包年)。 month charge_period number 必填 计费周期,当计费模式设置为prePaid,此参数是必填项。可选值为:1-3(year)、1-9(month)。 1 登录华为云解决方案实践,选择“公网IP不变业务迁移最佳实践”,单击“一键部署”,跳转至解决方案创建资源栈界面。 图1 解决方案实施库 在选择模板界面中,单击“下一步”。 图2 选择模板 在配置参数界面中,参考表1 参数填写说明完成自定义参数填写,单击“下一步”。 图3 配置参数 在资源设置界面中,在权限委托下拉框中选择“rf_admin_trust”委托(可不选),单击“下一步”。 图4 资源栈设置 在配置确认界面中,单击“创建执行计划”。 图5 配置确认 在弹出的创建执行计划框中,自定义填写执行计划名称,单击“确定”。 图6 创建执行计划 单击“部署”,并且在弹出的执行计划确认框中单击“执行”。 图7 执行计划 图8 执行计划确认 (可选)如果计费模式选择“包年包月”,在余额不充足的情况下(所需总费用请参考表2)请及时登录费用中心,手动完成待支付订单的费用支付。 待“事件”中出现“Apply required resource success”,表示该解决方案已经部署完成。 图9 部署完成 父主题: 实施步骤
  • 动态添加路由 动态添加路由(keepalived):源端通过公网访问目的端时,对应的业务需要使用自己的源端公网IP作为出口IP,因此需要配置虚拟IP的转发路由。 由于虚拟IP地址会进行漂移,并且在未绑定虚拟IP地址的服务器上不能添加虚拟IP对应的路由规则,所以当虚拟IP漂移到主备云服务器中的一台时,需要为主备服务器动态添加路由。 请登录源端(上海一)的主备服务器,执行步骤1-步骤2的操作。 创建添加路由脚本命令:vim /etc/keepalived/addRoute.sh 替换以下字段的值: destination1:web1服务EIP1 destination2:web2服务EIP2 destinationVip1:虚拟IP1 destinationVip2:虚拟IP2 添加如下内容 #!/bin/bash# 要检查的路由目的地destination1="1.94.xx.22"destination2="113.44.xx.99"destinationVip1="172.16.0.203"destinationVip2="172.16.0.47"# 使用ip route show查找路由,通过grep检查输出if ip route show | grep -q "$destination1" ; then echo "路由到 $destination1 存在。"else echo "路由到 $destination1 不存在。" ip route add $destination1 via 172.16.0.1 dev eth0 src $destinationVip1fiif ip route show | grep -q "$destination2" ; then echo "路由到 $destination2 存在。"else echo "路由到 $destination2 不存在。" ip route add $destination2 via 172.16.0.1 dev eth0 src $destinationVip2fi 为路由脚本添加可执行权限 命令:chmod +x /etc/keepalived/addRoute.sh 添加路由脚本:在Nginx监控脚本中加入添加路由脚本,替换原有内容。 vim /etc/keepalived/chk_nginx.sh 加入添加以下路由执行脚本 #!/bin/bashsh /etc/keepalived/addRoute.shcounter=$(ps -C nginx --no-heading|wc -l)if [ "${counter}" = "0" ]; then systemctl start nginx.service sleep 2 counter=$(ps -C nginx --no-heading|wc -l) if [ "${counter}" = "0" ]; then systemctl stop keepalived.service fifi 在主服务器上可以查看已配置的路由信息 命令:ip route
  • 验证主备服务器的自动切换功能 接验证主备切换所示,主服务器为Flexus-X-HA2,远程登录Flexus-X-HA2,并执行以下命令,查看虚拟IP是否已绑定到Flexus-X-HA2。回显类似如下信息,可以看到虚拟IP1(172.16.0.203)和虚拟IP2(172.16.0.47)已绑定至eth0网卡上,再次确认Flexus-X-HA2为主服务器。 命令:ip a 图5 网卡信息 执行以下命令,停止主服务器的Keepalived服务或者重启主ECS二选一,本示例中主服务器为Flexus-X-HA2。 停止Keepalived服务命令:systemctl stop keepalived.service重启主ECSreboot 打开浏览器,输入绑定在虚拟IP1上的EIP1(1.94.xxx.236)、输入绑定在虚拟IP2上的EIP2(115.120.xxx.252),验证主服务器挂掉之后能否正常访问网页。 网页如下图所示,表示网页访问正常。 图6 web1 图7 web2 执行以下命令,验证主ECS是否切换成Flexus-X-HA1。远程登录Flexus-X-HA1,并执行以下命令,查看虚拟IP是否已绑定到Flexus-X-HA1的eth0网卡上。 回显类似如下信息,可以看到虚拟IP1(172.16.0.203)和虚拟IP2(172.16.0.47)已绑定至eth0网卡上,此时确认Flexus-X-HA1为主ECS。 命令:ip addr show 图8 网卡信息
  • 安全组规则修改(可选) 安全组实际是网络流量访问策略,包括网络流量入方向规则和出方向规则,通过这些规则为安全组内具有相同保护需求并且相互信任的云服务器、云容器、云数据库等实例提供安全保护。 如果您的实例关联的安全组策略无法满足使用需求,比如需要添加、修改、删除某个TCP端口,请参考以下内容进行修改。 添加安全组规则:根据业务使用需求需要开放某个TCP端口,请参考添加安全组规则添加入方向规则,打开指定的TCP端口。 修改安全组规则:安全组规则设置不当会造成严重的安全隐患。您可以参考修改安全组规则,来修改安全组中不合理的规则,保证云服务器等实例的网络安全。 删除安全组规则:当安全组规则入方向、出方向源地址/目的地址有变化时,或者不需要开放某个端口时,您可以参考删除安全组规则进行安全组规则删除。
  • 配置转发规则 在源端(上海一)的主备服务器上分别配置Nginx的转发规则,执行以下命令,创建转发配置文件,添加如下内容。 命令:vim /etc/nginx/conf.d/web-src.conf 修改替换以下内容 server:web服务绑定的两个EIP server_name:虚拟IP绑定的两个EIP upstream web1 {server 1.94.xx.22:80;}upstream web2 {server 113.44.xx.99:80;}server {listen 80;server_name 1.94.xxx.236;access_log /var/log/nginx/web1.access.log main;error_log /var/log/nginx/web1.error.log crit;location / {proxy_pass http://web1;proxy_set_header Host $http_host;}}server {listen 80;server_name 115.120.xxx.252;access_log /var/log/nginx/web2.access.log main;error_log /var/log/nginx/web3.error.log crit;location / {proxy_pass http://web2;proxy_set_header Host $http_host;}} 执行以下命令热加载生效Nginx配置 命令:nginx -s reload
  • 创建rf_admin_trust委托(可选) 进入华为云官网,打开控制台管理界面,鼠标移动至个人账号处,打开“ 统一身份认证 ”菜单。 图1 控制台管理界面 图2 统一身份认证菜单 进入“委托”菜单,搜索“rf_admin_trust”委托。 图3 委托列表 如果委托存在,则不用执行接下来的创建委托的步骤 如果委托不存在,则需执行以下步骤创建委托 单击步骤2界面中的“创建委托”按钮,在委托名称中输入“rf_admin_trust”,委托类型选择“云服务”,选择“ RFS ”,单击“下一步”。 图4 创建委托 在搜索框中输入“Tenant Administrator”权限,并勾选搜索结果,单击“下一步”。 图5 选择策略 选择“所有资源”,并单击“下一步”完成配置。 图6 设置授权范围 “委托”列表中出现“rf_admin_trust”委托则创建成功。 图7 委托列表
  • 客户源端配置(region:上海一 模拟客户源端) 购买Flexus X实例:访问Flexus云服务器X实例控制台,参考购买Flexus X实例教程,按如下配置购买X实例。 表1 X实例相关配置 资源类型 资源数量 配置 示例说明 虚拟私有云VPC 和子网 1 IPv4网段:172.16.0.0/24 子网IPv4网段:172.16.0.0/24 详见创建虚拟私有云和子网指南。 弹性 云服务器ECS 2 按需计费 区域:华东-上海一 规格:性能模式(关闭)| 2核 | 4 GB 镜像:CentOS 7.9 64bit 系统盘:通用型SSD | 40GB 本示例中,需要两个ECS作为主备倒换,配置说明如下: 名称:本示例分别为Flexus-X-HA1和Flexus-X-HA2。 安全组:本示例中Flexus-X-HA1和Flexus-X-HA2使用同一个安全组。 私有IP地址:Flexus-X-HA1为172.16.0.127,Flexus-X-HA2为172.16.0.97 弹性公网IP 2 线路:全动态BGP 公网带宽:按流量计费 带宽大小:300Mbit/s 本示例中EIP1为1.94.xxx.236,EIP2为115.120.xxx.252。 表2 安全组配置 方向 策略 类型 协议端口 源地址/目的地址 描述 入方向 允许 IPv4 TCP: 22 源地址:0.0.0.0/0 放通安全组内ECS的SSH(22)端口,用于远程登录Linux ECS。 入方向 允许 IPv4 TCP: 80 源地址:0.0.0.0/0 放通安全组内ECS的HTTP(80)端口,用于外部通过HTTP协议访问ECS上部署的网站。 入方向 允许 IPv4 全部 源地址:当前安全组 针对IPv4,用于安全组内ECS之间网络互通。 入方向 允许 IPv6 全部 源地址:当前安全组 针对IPv6,用于安全组内ECS之间网络互通。 出方向 允许 IPv4 全部 目的地址:0.0.0.0/0 针对IPv4,用于安全组内ECS访问外部,允许流量从安全组内ECS流出。 出方向 允许 IPv6 全部 目的地址:::/0 针对IPv6,用于安全组内ECS访问外部,允许流量从安全组内ECS流出。 申请虚拟IP地址:在源端子网中申请两个虚拟IP地址,具体方法请参见申请虚拟IP地址(本示例中虚拟IP1为172.16.0.203,虚拟IP2为172.16.0.47)。 图8 虚拟IP地址 安装Nginx、Keepalived软件包及相关依赖:登录主备Flexus-X-HA1、Flexus-X-HA2服务器,执行以下命令,安装Nginx、Keepalived软件包及相关依赖包 命令:yum install nginx keepalived -y 配置nginx:修改index.html文件内容,用来验证网站的访问情况。执行以下命令,打开“/usr/share/nginx/html/index.html”文件。将文件中原有的内容,全部替换成以下内容。 命令:vim /usr/share/nginx/html/index.htmlFlexus-X-HA1改为Welcome to Flexus-X-HA1Flexus-X-HA2改为Welcome to Flexus-X-HA2 启动Nginx:执行以下命令,设置Nginx服务开机自启动,并启动Nginx服务。 命令:systemctl enable nginxsystemctl start nginx.service 验证Nginx:打开浏览器,并输入EIP地址,验证Nginx单节点的访问情况,网页如下图所示,表示Flexus-X-HA1和Flexus-X-HA2的Nginx配置成功。 图9 Flexus-X-HA1 图10 Flexus-X-HA2 配置Keepalived:执行以下命令,打开“/etc/keepalived/keepalived.conf”文件,根据实际情况,替换配置文件中的IP参数,并将文件中原有的内容,全部替换成以下内容。 命令:vim /etc/keepalived/keepalived.conf Flexus-X-HA1: mcast_src_ip和unicast_src_ip参数值:替换为Flexus-X-HA1的私有IP地址,本示例为172.16.0.127。 virtual_ipaddress参数值:替换为虚拟IP地址,本示例为172.16.0.47和172.16.0.203 ! Configuration File for keepalivedglobal_defs {router_id master-node}vrrp_script chk_http_port { script "/etc/keepalived/chk_nginx.sh" interval 2 weight -5 fall 2 rise 1 }vrrp_instance VI_1 { state MASTER interface eth0 mcast_src_ip 172.16.0.127 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } unicast_src_ip 172.16.0.127 virtual_ipaddress { 172.16.0.47 172.16.0.203 } track_script { chk_http_port }} Flexus-X-HA2: mcast_src_ip和unicast_src_ip参数值:替换为Flexus-X-HA2的私有IP地址,本示例为172.16.0.97。 virtual_ipaddress参数值:替换为虚拟IP地址,本示例为172.16.0.47和172.16.0.203。 ! Configuration File for keepalivedglobal_defs {router_id master-node}vrrp_script chk_http_port { script "/etc/keepalived/chk_nginx.sh" interval 2 weight -5 fall 2 rise 1 }vrrp_instance VI_1 { state MASTER interface eth0 mcast_src_ip 172.16.0.97 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } unicast_src_ip 172.16.0.97 virtual_ipaddress { 172.16.0.47 172.16.0.203 } track_script { chk_http_port }} 配置Nginx监控脚本:主备服务器执行以下命令,打开“/etc/keepalived/chk_nginx.sh”文件,将文件中原有的内容,全部替换成以下内容。 命令:vim /etc/keepalived/chk_nginx.sh#!/bin/bashcounter=$(ps -C nginx --no-heading|wc -l)if [ "${counter}" = "0" ]; then systemctl start nginx.service sleep 2 counter=$(ps -C nginx --no-heading|wc -l) if [ "${counter}" = "0" ]; then systemctl stop keepalived.service fifi 脚本权限:主备服务器执行以下命令,为“chk_nginx.sh”文件添加执行权限。 命令:chmod +x /etc/keepalived/chk_nginx.sh 启动Keepalived:主备服务器执行以下命令,设置Keepalived服务开机自启动,并启动Keepalived服务。 命令:systemctl enable keepalivedsystemctl start keepalived.service 绑定虚拟IP:将Flexus-X-HA1和Flexus-X-HA2两台服务器的EIP进行解绑,具体方法参见解绑弹性公网IP。然后将虚拟IP绑定至实例和弹性公网IP详见:将虚拟IP绑定至实例或者EIP指南。(注意控制台绑定完成需要登录服务器配置虚拟IP地址),如下图所示。 图11 虚拟IP绑定 表3 虚拟ip配置 虚拟IP 2 虚拟IP1:172.16.0.203 虚拟IP2:172.16.0.47 绑定实例:将两个虚拟IP绑定至Flexus-X-HA1和Flexus-X-HA2 绑定弹性公网IP:将虚拟IP1绑定至EIP1(1.94.xx.236),将虚拟IP2绑定至EIP2(115.120.xx.252)。 (可选)关闭主备服务器的IP转发功能(本示例中服务器默认关闭):使用虚拟IP构建主备场景的高可用集群时,需要关闭备云服务器的IP转发功能,当主备云服务器切换后,则需要确保新的云服务器也关闭IP转发功能。为了避免云服务器主备切换后遗漏配置,建议您将主备云服务器的IP转发功能全都关闭。关闭IP转发功能的操作如下: 切换root用户。命令:su root执行以下命令,查看IP转发功能是否已开启。命令:cat /proc/sys/net/ipv4/ip_forward回显结果:1为开启,0为关闭,默认为0。回显为0,任务结束。回显为1,继续执行以下操作。以下提供两种方法修改配置文件,二选一即可。方法一:执行以下命令,打开“/etc/sysctl.conf”文件。命令:vim /etc/sysctl.conf按i进入编辑模式。修改net.ipv4.ip_forward = 0。按ESC退出,并输入:wq!保存配置。方法二:执行sed命令,命令示例如下:命令:sed -i '/net.ipv4.ip_forward/s/1/0/g' /etc/sysctl.conf执行以下命令,使修改生效。命令:sysctl -p /etc/sysctl.conf 重启主备服务器:执行以下命令,分别重启主备服务器Flexus-X-HA1和Flexus-X-HA2 命令:reboot 验证自动切换功能:打开浏览器,分别输入EIP1(1.94.xx.236)、EIP2(115.120.xx.252),验证主服务器的网页访问情况,网页如下图所示,表示此时主服务器是Flexus-X-HA1,表明配置正常。 图12 图13 确认网卡是否正确配置:远程登录Flexus-X-HA1,并执行以下命令,查看虚拟IP是否已绑定到Flexus-X-HA1的eth0网卡上,回显类似如下信息,虚拟IP1(172.16.0.203)和虚拟IP2(172.16.0.47)已绑定至eth0网卡上,再次确认Flexus-X-HA1为主服务器。 命令:ip addr show 图14 主服务器网卡配置 主备切换:执行以下命令,停止主服务器的Keepalived服务或者重启主云服务器二选一,本示例中主云服务器为Flexus-X-HA1。 停止Keepalived服务命令: systemctl stop keepalived.service重启主云服务器命令:reboot 验证主备切换:执行以下命令,验证主服务器是否切换成Flexus-X-HA2。远程登录Flexus-X-HA2,并执行以下命令,查看虚拟IP是否已绑定到Flexus-X-HA2的eth0网卡上。 命令:ip addr show 图15 备服务器网卡配置 验证自动切换功能:打开浏览器,并分别输入EIP1(1.94.xx.236)、EIP2(115.120.xx.252),验证Flexus-X-HA2作为主服务器时的网页访问情况。 网页如下图所示,表示此时主服务器是Flexus-X-HA2,且网页访问正常。 图16 图17
  • 名词解释 华为云Flexus云服务器X实例:Flexus云服务器X实例是新一代面向中小企业和开发者打造的柔性算力云服务器。Flexus云服务器X实例功能接近ECS, 同时还具备独有特点,例如Flexus云服务器X实例具有更灵活的vCPU内存配比、支持热变配不中断业务变更规格、支持性能模式等。 弹性云服务器 ECS:是一种云上可随时自助获取、可弹性伸缩的计算服务,可帮助您打造安全、可靠、灵活、高效的应用环境。 虚拟私有云 VPC:是用户在华为云上申请的隔离的、私密的虚拟网络环境。用户可以基于VPC构建独立的云上网络空间,配合弹性公网IP、云连接、云专线等服务实现与Internet、云内私网、跨云私网互通,帮您打造可靠、稳定、高效的专属云上网络。 弹性公网IP EIP:提供独立的公网IP资源,包括公网IP地址与公网出口带宽服务。可以与弹性云服务器、裸金属服务器、虚拟IP、弹性负载均衡、NAT网关等资源灵活地绑定及解绑,提供访问公网和被公网访问能力。
共100000条