在 GCP 上部署 ASA Virtual Auto Scale 解决方案

概述

以下各节介绍 Auto Scale 解决方案的组件如何对 GCP 上的 ASA virtual 发挥作用。

关于 Auto Scale 解决方案

面向 GCP 的 ASA virtual Auto Scale 是一个完整的无服务器实施方案,它利用 GCP 提供的无服务器基础设施(云函数、负载均衡器、Pub/Sub、实例组等)。

面向 GCP 的 ASA virtual Auto Scale 可实现的一些主要功能包括:

  • GCP 部署管理器基于模板的部署。

  • 支持基于 CPU 的扩展指标。

  • 支持 ASA virtual 部署和多可用性区域。

  • 完全自动化配置会自动应用于横向扩展 ASA virtual实例。

  • 对负载均衡器和多可用性区域的支持。

  • 思科提供面向 GCP 的 Auto Scale 部署包以方便部署。

Auto Scale 使用案例

ASA virtual Auto Scale for GCP 是一种自动化水平扩展解决方案,它将 ASA virtual 实例组置于 GCP 内部负载均衡器 (ILB) 与 GCP 外部负载均衡器 (ELB) 之间。

  • ELB 将流量从互联网分发到实例组中的 ASA virtual实例;然后,防火墙将流量转发到应用程序。

  • ILB 将出站互联网流量从应用程序分发到实例组中的 ASA virtual实例;然后,防火墙将流量转发到互联网。

  • 网络数据包决不会在一个连接中同时穿过(内部和外部)负载均衡器。

  • 规模集中的 ASA virtual实例数将根据负载条件自动进行扩展和配置。

图 1. ASA Virtual Auto Scale 使用案例

适用范围

本文档介绍部署 ASA virtual Auto Scale for GCP 解决方案的无服务器组件的详细步骤。


重要


  • 请先阅读整个文档,然后再开始部署。

  • 在开始部署之前,请确保满足前提条件。

  • 请确保遵守此处所述的步骤和执行顺序。


下载部署软件包

ASA virtual Auto Scale for GCP 解决方案是一种基于 GCP 部署管理器模板的部署,它利用 GCP 提供的无服务器基础设施(云功能、负载均衡器、Pub/Sub、实例组等)。

下载启动 ASA virtual auto scale 解决方案所需的文件。您的 ASA 版本的部署脚本和模板可从 GitHub 存储库获取。


注意


请注意,Cisco 提供的自动扩展部署脚本和模板作为开源示例提供,不在常规 Cisco TAC 支持范围内。


Auto Scale 解决方案组件

以下组件构成了适用于 GCP 的 ASA virtual Auto Scale 解决方案。

部署管理器

  • 将您的配置视为代码并执行可重复部署。Google 云部署管理器允许您使用 YAML 以说明性格式指定应用所需的所有资源。您还可以使用 Python 或 Jinja2 模板来参数化配置,同时允许重复使用常见的部署范例。

  • 创建定义资源的配置文件。可以不断重复创建这些资源的过程,可获得一致的结果。有关详细信息,请参阅 https://cloud.google.com/deployment-manager/docs

图 2. 部署管理器视图

GCP 中的托管实例组

托管实例组 (MIG) 会根据您指定的实例模板和可选状态配置来创建其每个托管实例。有关详细信息,请参阅 https://cloud.google.com/compute/docs/instance-groups

图 3. 实例组功能

目标利用率指标

  • 下图显示了目标利用率指标。在制定自动扩展决策时只会使用平均 CPU 利用率指标。

  • 自动扩展程序会根据所选的利用率指标来持续收集使用情况信息,将实际利用率与所需的目标利用率进行比较,并使用这些信息来确定组是需要删除实例(内向扩展)还是添加实例(外向扩展)。

  • 目标利用率水平是您想要维护虚拟机 (VM) 实例的水平。例如,如果根据 CPU 利用率进行扩展,则可以将目标利用率水平设置为 75%,自动扩展程序会将指定实例组的 CPU 利用率保持在或接近 75%。每个指标的利用率水平可根据自动扩展策略进行不同的解释。有关详细信息,请参阅 https://cloud.google.com/compute/docs/autoscaler

图 4. 目标利用率指标

无服务器云功能

当实例在实例组管理器中启动时,您可以使用无服务器 Google Cloud 功能来设置 SSH 密码、启用密码和更改主机名。

  • 在外向扩展期间,当实例组中出现新的 ASA virtual 实例时,您需要设置 SSH 密码、启用密码并更改主机名,因为您无法始终监控外向扩展过程。

  • 在外向扩展过程中,云功能会通过云发布/订阅主题触发。您还有一个带有过滤器的日志接收器,专门用于在外向扩展时添加实例。

使用云功能取消注册无服务器许可证

  • 在内向扩展期间删除实例时,您需要从 ASA virtual 实例中取消注册许可证。

  • 云功能可通过云发布/订阅主题触发。特别是对于删除过程,您有一个带有过滤器的日志接收器,专门用于在内向扩展时删除实例。

  • 在触发时,云功能会通过 SSH 连接到正在删除的 ASA virtual 实例,并运行取消注册许可证的命令。

Autoscale 解决方案简要概述

图 5. Autoscale 解决方案概述

前提条件

GCP 资源

GCP 项目

部署此解决方案的所有组件需要一个现有的或新创建的项目。

网络

确保有三个 VPC 可用/已创建。Auto Scale 部署将不会创建、更改或管理任何网络资源。

ASA virtual 需要 3 个网络接口,因此您的虚拟网络需要 3 个子网以用于:

  • 管理流量

  • 内部流量

  • 外部流量

图 6. VPC 网络视图

防火墙

需要创建允许 VPC 间通信以及运行状况探测的防火墙规则。您必须记下稍后要在部署管理器模板中使用的防火墙标记。

应在子网所连接的网络安全组中打开以下端口:

  • SSH(TCP/22) - 负载均衡器与 ASA virtual 之间的运行状况探测所必需。无服务器函数与 ASA virtual 之间的通信所必需。

  • 应用程序特定协议/端口 - 任何用户应用程序所必需(例如,TCP/80 等)。

准备 ASA 配置文件

准备将被放入部署管理器 jinja 配置文件中的 ASA virtual 配置文件。此配置将用作项目中 ASA virtual 实例模板中的启动脚本。

配置文件应至少包含以下内容:

  • 为所有接口设置 DHCP IP 分配。

  • 网卡 0 应标记为“外部”,因为 GCP 负载均衡器只会将流量转发到网卡 0。

  • Nic0 将用于 SSH 连接 ASA virtual,因为它仅支持 IP 转发。

  • 在 ASA 配置中的外部接口上启用 SSH。

  • 创建 NAT 配置以便将流量从外部转发到内部接口。

  • 创建访问策略以允许所需流量。

  • 对于资源的运行状况,应使用适当的 NAT 规则将其运行状况探测重定向到元数据服务器。

以下是 ASA 配置文件示例,仅供参考

!ASA Version 9.15.1.10
!Interface Config
interface G0/0
nameif inside
security-level 100
ip address dhcp setroute
no shutdown


interface G0/1
nameif management
security-level 50
ip address dhcp setroute
no shutdown

interface M0/0
no management-only
nameif outside
security-level 0
ip address dhcp setroute
no shutdown
!
same-security-traffic permit inter-interface
!
!Due to some constraints in GCP,
!"GigabitEthernet0/0" will be used as a Management interface
!"Management0/0" will be used as a data interface
crypto key generate rsa modulus 2048
ssh 0.0.0.0 0.0.0.0 management
ssh version 2
ssh timeout 60
aaa authentication ssh console LOCAL
ssh authentication publickey {{ properties["publicKey"] }}
username admin privilege 15
username admin attributes
service-type admin

! required config end
dns domain-lookup management
dns server-group DefaultDNS
name-server 8.8.8.8
!
access-list all extended permit ip any any
access-list out standard permit any4
access-group all global
! Objects
object network metadata
host 169.254.169.254
object network ilb
host $(ref.{{ properties["resourceNamePrefix"] }}-ilb-ip.address)
object network hc1
subnet 35.191.0.0 255.255.0.0
object network hc2
subnet 130.211.0.0 255.255.63.0
object network elb
host $(ref.{{ properties["resourceNamePrefix"] }}-elb-ip.address)
object network appServer
host 10.61.2.3
object network defaultGateway
subnet 0.0.0.0 0.0.0.0
! Nat Rules
nat (inside,outside) source dynamic hc1 ilb destination static ilb metadata
nat (inside,outside) source dynamic hc2 ilb destination static ilb metadata
nat (inside,outside) source dynamic defaultGateway interface
	!
	object network appServer
nat (inside,outside) static $(ref.{{ properties["resourceNamePrefix"] }}-elb-ip.address)
object network defaultGateway
nat (outside,inside) dynamic interface
! Route Add
route inside 0.0.0.0 0.0.0.0 10.61.1.1 2
route management 0.0.0.0 0.0.0.0 10.61.3.1 3
license smart register idtoken <licenseIDToken>

构建 GCP 云功能包

ASA virtual GCP 自动扩展解决方案要求您构建两个存档文件,以压缩 ZIP 包的形式提供云功能。

  • scalein-action.zip

  • scaleout-action.zip

有关如何构建 scalein-action.zipscaleout-action.zip 软件包的信息,请参阅自动扩展部署说明。

这些函数尽可能离散以执行特定任务,并可以根据需要进行升级,以提供增强功能和新版本支持。

输入参数

下表定义了模板参数并提供了示例。确定这些值后,您可以在将 GCP 部署管理器模板部署到 GCP 项目时使用这些参数创建 ASA virtual 设备。

表 1. 模板参数

参数名

允许的值/类型

说明

资源创建类型

resourceNamePrefix

字符串

所有资源都使用包含此前缀的名称创建。

示例:demo-test

New

region

GCP 支持的有效区域

[String]

将部署项目的区域的名称。

示例:us-central1

serviceAccountMailId

字符串 [ Email Id]

标识服务账户的邮件地址。

vpcConnectorName

字符串

处理无服务器环境与 VPC 网络之间的流量的连接器的名称。

示例:demo-test-vpc-connector

bucketName

字符串

将上传云功能 ZIP 包的 GCP 存储桶的名称。

示例:demo-test-bkt

cpuUtilizationTarget

十进制 (0,1]

自动扩展程序应维护的实例组中虚拟机的平均 CPU 使用率。

示例:0.5

healthCheckFirewallRuleName

字符串

允许来自运行状况检查探测 IP 范围的数据包的防火墙规则的标签。

示例:demo-test-healthallowall

现有

insideFirewallRuleName

字符串

允许在内部 VPC 中通信的防火墙规则的标签。

示例:demo-test-inside-allowall

现有

insideVPCName

字符串

内部 VPC 的名称。

示例:demo-test-inside

现有

insideVPCSubnet

字符串

内部子网的名称。

示例:demo-test-inside-subnt

现有

machineType

字符串

ASA virtual VM 的计算机类型。

示例:e2-standard-4

maxASACount

整数

实例组中允许的最大 ASA virtual 实例数。

示例:3

mgmtFirewallRuleName

字符串

允许在管理 VPC 中通信的防火墙规则的标签。

示例:demo-test-mgmt-allowall

mgmtVPCName

字符串

管理 VPC 的名称。

示例:demo-test-mgmt

mgmtVPCSubnet

字符串

管理子网的名称。

示例:demo-test-mgmt-subnt

minASACount

整数

在任何给定时间,实例组中可用的最小 ASA virtual 实例数。

示例:1

outsideFirewallRuleName

字符串

允许在外部 VPC 中通信的防火墙规则的标签。

示例:demo-test-outside-allowall

outsideVPCName

字符串

外部 VPC 的名称。

示例:demo-test-outside

outsideVPCSubnet

字符串

外部子网的名称。

示例:demo-test-outside-subnt

publicKey

字符串

ASA virtual VM 的 SSH 密钥。

sourceImageURL

字符串

要在项目中使用的 ASA virtual 的图片。

示例: https://www.googleapis.com/compute/v1/projects/cisco-public/global/images/cisco-asav-9-15-1-15

应用服务器 IP 地址

字符串

内部 Linux 计算机的内部 IP 地址。

示例:10.61.1.2

内部 VPC 网关 IP 地址

字符串

内部 VPC 的网关。

示例:10.61.1.1

管理 VPC 网关 IP 地址

字符串

管理 VPC 的网关。

示例:10.61.3.1

部署 Auto Scale 解决方案

过程


步骤 1

将 Git 存储库克隆到本地文件夹。

git clone git_url -b branch_name 

示例:

步骤 2

在 gcloud CLI 中创建存储桶。

gsutil mb -c nearline gs://bucket_name

示例:

步骤 3

构建压缩的 Zip 包:

  1. 从文件夹 scalein_actionscaleout_action 创建包含以下文件的压缩 Zip 包。

    • main.py

    • basic_functions.py

      requirements.txt

  2. 将压缩的 Zip 包重命名为 scaleout-action.zipscalein-action.zip

     

    在文件夹中导航,选择文件,右键点击,然后选择“压缩 | 存档”(compress | archive) 以生成 GCP 可以读取的 .zip。

步骤 4

将压缩的 Zip 包(scaleout-action.zipscalein-action.zip)上传到云编辑器工作空间。

步骤 5

将部署管理器模板中的以下文件上传到云编辑器工作区内。

  • asav_autoscale.jinja

  • asav_autoscale_params.yaml

  • pre_deployment.jinja

  • pre_deployment.yaml

步骤 6

将压缩的 Zip 包复制到存储桶。

  • gsutil cp scaleout-action.zip gs://bucket_name
  • gsutil cp scalein-action.zip gs://bucket_name

示例:

步骤 7

为内部、外部和管理接口创建 VPC 和子网。

在管理 VPC 中,您需要有 /28 子网,例如 10.8.2.0/28。

步骤 8

您需要三个防火墙规则以用于内部接口、外部接口和管理接口。此外,您还应设置允许运行状况检查探测的防火墙规则。

步骤 9

为预部署和 ASA virtual Autoscale 部署更新 Jinja 和 YAML 文件中的参数。

  1. 打开 asav_autoscale_params.yaml 文件并更新以下参数:

    • resourceNamePrefix: <resourceNamePrefix>

    • region: <region>

    • serviceAccountMailId: <serviceAccountMailId>

    • publicKey: <publicKey>

    • insideVPCName: <Inside-VPC-Name>

    • insideVPCSubnet: <Inside-VPC-Subnet>

    • outsideVPCName: <Outside-VPC-Name>

    • outsideVPCSubnet: <Outside-VPC-Subnet>

    • mgmtVPCName: <Mgmt-VPC-Name>

    • mgmtVPCSubnet: <Mgmt-VPC-Subnet>

    • insideFirewallRuleName: <Inside-Network-Firewall-Tag>

    • outsideFirewallRuleName: <Outside-Network-Firewall-Tag>

    • mgmtFirewallRuleName: <Mgmt-Network-Firewall-Tag>

    • healthCheckFirewallRuleName: <HealthCheck-IP-Firewall-Tag>

    • machineType: <machineType>

     

    对于 ASA virtual Auto Scale,设置了 cpuUtilizationTarget: 0.5 参数,您可以根据自己的要求对其进行编辑。

    此值表示所有 ASA virtual 实例组的 CPU 使用率为 50%。

  2. 打开 asav_autoscale.jinja 文件并更新以下参数。

    • host: <Application server IP address>

    • route inside 0.0.0.0 0.0.0.0: <Inside VPC Gateway IP address> 2

    • route management 0.0.0.0 0.0.0.0: <Management VPC Gateway IP address> 3

    • license smart register idtoken: <licenseIDToken>

  3. 打开 pre_deployment.yaml 文件并更新以下参数。

    • resourceNamePrefix: <resourceNamePrefix>

    • region: <region>

    • serviceAccountMailId: <serviceAccountMailId>

    • vpcConnectorName: <VPC-Connector-Name>

    • bucketName: <bucketName>

步骤 10

使用密钥管理器 GUI 为以下对象创建三个密钥。请参阅https://console.cloud.google.com/security/secret-manager

  • asav-en-password

  • asav-new-password

  • asav-private-key

步骤 11

创建 VPC 连接器。

gcloud beta compute networks vpc-access connectors create <vpc-connector-name> 
--region <region> --subnet=</28 subnet name>

示例:

gcloud beta compute networks vpc-access connectors create demo-vpc-connector 
--region us-central1 --subnet=outside-connect-28
Create request issued for: [demo-vpc-connector]
Waiting for operation [projects/asavgcp-poc-4krn/locations/us-central1/operations/
10595de7-837f-4c19-9396-0c22943ecf15] to complete...done.
Created connector [demo-vpc-connector].

步骤 12

部署预部署 YAML 配置。

gcloud deployment-manager deployments create <pre-deployment-name> 
--config pre_deployment.yaml

示例:

gcloud deployment-manager deployments create demo-predeployment 
--config pre_deployment.yaml                                                                      
The fingerprint of the deployment is b'9NOy0gsTPgg16SqUEVsBjA=='
Waiting for create [operation-1624383045917-5c55e266e596d-4979c5b6-66d1025c]...done.
Create operation operation-1624383045917-5c55e266e596d-4979c5b6-66d1025c 
completed successfully

步骤 13

创建 ASA virtual Auto Scale 部署。

gcloud deployment-manager deployments create <deployment-name> 
--config asav_autoscale_params.yaml

示例:

gcloud deployment-manager deployments create demo-asav-autoscale 
--config asav_autoscale_params.yaml
The fingerprint of the deployment is b'1JCQi7Il-laWOY7vOLza0g=='
Waiting for create [operation-1624383774235-5c55e51d79d01-1a3acf92-4f3daf16]...done.
Create operation operation-1624383774235-5c55e51d79d01-1a3acf92-4f3daf16 
completed successfully.

步骤 14

为 ILB 创建路由,以便将数据包从内部应用转发到互联网。

gcloud beta compute routes create <ilb-route-name> 
--network=<inside-vpc-name> --priority=1000 --destination-range=0.0.0.0/0 
--next-hop-ilb=<ilb-forwarding-rule-name> --next-hop-ilb-region=<region>

示例:

gcloud beta compute routes create demo-ilb --network=sdt-test-asav-inside 
--priority=1000 --destination-range=0.0.0.0/0 --next-hop-ilb=demo-asav-fr-ilb 
--next-hop-ilb-region=us-central1
Created [https://www.googleapis.com/compute/beta/projects/asavgcp-poc-4krn/global
/routes/demo-ilb].

步骤 15

创建云路由器和云 NAT。

gcloud compute routers create <cloud-router-name> 
--project=<project-name> --region <region> --network=<outside-vpc-name> 
--advertisement-mode=custom
gcloud compute routers nats create <cloud-nat-name> 
--router=<cloud-router-name> --nat-all-subnet-ip-ranges --auto-allocate-nat-external-ips 
--region=<region>

示例:

gcloud compute routers create demo-cloud-router --project=asavgcp-poc-4krn 
--region us-central1 --network=sdt-test-asav-outside --advertisement-mode=custom
Creating router [demo-cloud-router]...done.

gcloud compute routers nats create demo-cloud-nat 
--router=demo-cloud-router --nat-all-subnet-ip-ranges 
--auto-allocate nat-external-ips --region=us-central1
Creating NAT [demo-cloud-nat] in router [demo-cloud-router]...done.

Auto Scale 逻辑

  • 自动调节程序将目标 CPU 利用率水平视为实例组中一段时间内所有 vCPU 的平均使用量的一部分。

  • 如果总 vCPU 的平均利用率超过目标利用率,则自动扩展程序会添加更多 VM 实例。如果总 vCPU 的平均利用率低于目标利用率,则自动扩展程序会删除实例。

  • 例如,设置 0.75 的目标利用率会告知自动扩展程序将实例组中所有 vCPU 的平均利用率保持在 75%。

  • 扩展决策中只会使用 CPU 利用率指标。

  • 该逻辑基于以下假设:负载均衡器将尝试在所有 ASAs 之间平均分配连接,一般来说,所有 ASAs 应平均加载。

日志记录和调试

可以按如下方式查看云功能的日志。

  • 外向扩展函数日志

    图 7. 外向扩展函数日志
  • 内向扩展功能日志

    图 8. 内向扩展功能日志

准则和限制

  • 仅支持 IPv4。

  • 支持的许可只有 BYOL。PAYG 不适用于 GCP 上的 ASA virtual

  • 外部负载均衡器由模板创建,因此,负载均衡器的公共 IP 的任何特定 DNS 要求均不在此范围内。

  • 假设应用位于用户创建的负载均衡器之后,并且 ASA virtual 会将所有流量路由到该负载均衡器(而不是直接将流量发送到特定应用 IP)。

  • 不考虑有关 TAG、冗余和负载均衡器关联性配置需求的详细信息。

  • ASA virtual 凭证会显示为:

    • 无服务器代码中的明文。

    • 在实例组中的所有实例中。

    • 在实例模板中(如果您使用的是共享 GCP 账户)。

    此类敏感数据可以使用 GCP 中的公共密钥服务来加以保护。


重要


思科建议定期跟踪向许可服务器的 ASA virtual 注册,以检查外向扩展 ASA 是否按预期向许可服务器注册,以及是否从许可证服务器中删除了内向扩展 ASA virtual 实例。


故障排除

以下是 ASA virtual Auto Scale for GCP 的常见错误情况和调试提示:

  • main.py 未找到 - 确保仅从文件生成 Zip 软件包。您可以转到云功能并检查文件树。不应有任何文件夹。

  • 部署模板时出错 - 确保“<>”中的所有参数值均已填写。jinja 和 .yaml 也是一样,或者已存在具有相同名称的部署。

  • Google 函数无法访问 ASA virtual - 确保已创建 VPC 连接器并在 YAML 参数文件中提及了相同的名称。

  • SSH 连接 ASA virtual 时身份验证失败 - 确保公共密钥和私钥对正确无误。

  • 许可证注册失败 - 确保许可证 ID 令牌正确无误。此外,请确保已创建云 NAT 并且 ASA virtual 能够访问 tools.cisco.com。