本文档介绍在属于Schwarz Digits的STACKIT云上安装和启用Cisco Catalyst 8000V所需的步骤。
Cisco Catalyst 8000V是运行Cisco IOS XE的虚拟路由器。在STACKIT上,C8000V映像作为自定义映像上传,并用于创建虚拟服务器的引导卷。
在创建服务器期间,STACKIT会将提供的用户数据放在配置驱动器上。C8000V在初始引导期间读取引导程序。bootstrap内容取决于预期操作模式:
所有三种模式使用相同的映像、卷、接口和服务器创建顺序。引导程序内容和部署后验证因模式而异。
引导程序可以包含密码、证书或设备身份信息。将其存储在受保护的位置。Base64编码不加密文件。
本文档中的部署工作流程已通过下列软件版本和STACKIT VM类型进行验证。该测试基线记录实验环境;它不会取代当前的Cisco Catalyst 8000V版本说明、平台要求或特定于功能的规模确定指南。
验证中包括以下STACKIT VM类型:
| 实例大小 |
vCPUs |
内存(GiB) |
| c3i.4 |
4 |
8 |
| c3i.8 |
8 |
16 |
| c3i.16 |
16 |
32 |
选择满足预期C8000V部署的CPU、内存、吞吐量和功能要求的风格。
经过验证的C8000V访客报告了STACKIT虚拟化环境,如下所示:
Router#show platform software system hypervisor
Hypervisor: KVM
Manufacturer: STACKIT Cloud
Product Name: OpenStack Nova
Serial Number: <INSTANCE_UUID>
UUID: <INSTANCE_UUID>
Image Variant: None
Router#
本指南使用Homebrew安装STACKIT CLI。还提供其他软件包管理器和安装方法。有关详细信息,请参阅《STACKIT CLI安装指南》。
brew tap stackitcloud/tap
brew install --cask stackit
在运行部署命令之前配置STACKIT CLI环境。
登录到您的STACKIT帐户。
stackit auth login
在您的浏览器中完成身份验证。身份验证成功后,CLI会确认您已登录。
为其余命令设置默认项目。
stackit config set --project-id xxxxxxxx-yyyy-zzzz-aaaa-bbbbbbbbbbbb
如果您不知道项目ID,请列出可用项目。
stackit project list
收集部署所需的值。本示例创建了两个网络和两个NIC:第一个用于管理或传输,第二个用于服务或数据流量。
export PROJECT_ID="<PROJECT_ID>"
export REGION="<REGION>"
export AVAILABILITY_ZONE="<AVAILABILITY_ZONE>"
export MACHINE_TYPE="<MACHINE_TYPE>"
export SERVER_NAME="<C8000V_NAME>"
export IMAGE_NAME="<C8000V_IMAGE_NAME>"
export IMAGE_FILE="/path/to/<C8000V_IMAGE>.qcow2"
export IMAGE_MIN_DISK_SIZE="<MINIMUM_DISK_GB>"
export BOOT_VOLUME_SIZE="<BOOT_VOLUME_GB>"
export IMAGE_UEFI="<true_or_false>"
export MGMT_NETWORK_NAME="${SERVER_NAME}-mgmt"
export DATA_NETWORK_NAME="${SERVER_NAME}-data"
export MGMT_IPV4_PREFIX="<MANAGEMENT_IPV4_PREFIX>"
export DATA_IPV4_PREFIX="<DATA_IPV4_PREFIX>"
export TRUSTED_SOURCE_CIDR="<TRUSTED_SOURCE_IP_OR_NETWORK>/<PREFIX_LENGTH>"
使用已批准网络设计中的非重叠前缀。以CIDR表示法指定TRUSTED_SOURCE_CIDR,包括前缀长度。使用/32允许一个IPv4地址。以下管理规则示例仅允许来自TRUSTED_SOURCE_CIDR的SSH。
验证该文件是否为目标版本的授权映像。在部署记录中记录文件名和校验和。
qemu-img info "$IMAGE_FILE"
if command -v shasum >/dev/null 2>&1; then
shasum -a 256 "$IMAGE_FILE"
else
sha256sum "$IMAGE_FILE"
fi
对于EFI映像,将IMAGE_UEFI设置为true,对于BIOS映像,则设置为false。选择为下载的C8000V映像指定的设置。根据选定的映像和当前产品文档设置最小磁盘大小。
IMAGE_RESPONSE="$(
stackit image create \
--project-id "$PROJECT_ID" \
--region "$REGION" \
--name "$IMAGE_NAME" \
--disk-format qcow2 \
--uefi="$IMAGE_UEFI" \
--min-disk-size "$IMAGE_MIN_DISK_SIZE" \
--local-file-path "$IMAGE_FILE" \
--output-format json
)"
export IMAGE_ID="$(printf '%s' "$IMAGE_RESPONSE" | jq -r '.id')"
printf 'IMAGE_ID=%s\n' "$IMAGE_ID"
stackit image describe "$IMAGE_ID" \
--project-id "$PROJECT_ID" \
--region "$REGION" \
--output-format json |
jq '{id, name, status, diskFormat}'
当映像状态为AVAILABLE时继续。
从自定义映像创建新的引导卷。卷大小必须满足所选映像的磁盘要求。
BOOT_VOLUME_RESPONSE="$(
stackit volume create \
--project-id "$PROJECT_ID" \
--region "$REGION" \
--availability-zone "$AVAILABILITY_ZONE" \
--name "${SERVER_NAME}-boot" \
--source-id "$IMAGE_ID" \
--source-type image \
--size "$BOOT_VOLUME_SIZE" \
--output-format json
)"
export BOOT_VOLUME_ID="$(printf '%s' "$BOOT_VOLUME_RESPONSE" | jq -r '.id')"
printf 'BOOT_VOLUME_ID=%s\n' "$BOOT_VOLUME_ID"
轮询卷直到其状态为AVAILABLE。
stackit volume describe "$BOOT_VOLUME_ID" \
--project-id "$PROJECT_ID" \
--region "$REGION" \
--output-format json |
jq '{id, name, status, size}'
当现有网络和安全组已满足批准的设计时,请使用它们。否则,请创建如下所示的资源。
在创建新网络之前列出现有网络。
stackit network list \
--project-id "$PROJECT_ID" \
--region "$REGION"
如果不存在合适的网络,请创建管理或传输网络以及服务或数据网络。
MGMT_NETWORK_RESPONSE="$(
stackit network create \
--project-id "$PROJECT_ID" \
--region "$REGION" \
--name "$MGMT_NETWORK_NAME" \
--ipv4-prefix "$MGMT_IPV4_PREFIX" \
--output-format json
)"
DATA_NETWORK_RESPONSE="$(
stackit network create \
--project-id "$PROJECT_ID" \
--region "$REGION" \
--name "$DATA_NETWORK_NAME" \
--ipv4-prefix "$DATA_IPV4_PREFIX" \
--output-format json
)"
export MGMT_NETWORK_ID="$(printf '%s' "$MGMT_NETWORK_RESPONSE" | jq -r '.id')"
export DATA_NETWORK_ID="$(printf '%s' "$DATA_NETWORK_RESPONSE" | jq -r '.id')"
printf 'MGMT_NETWORK_ID=%s\nDATA_NETWORK_ID=%s\n' "$MGMT_NETWORK_ID" "$DATA_NETWORK_ID"
如果获批网络已存在,请将MGMT_NETWORK_ID和DATA_NETWORK_ID设置为它们的ID。
为管理NIC创建状态安全组。
SECURITY_GROUP_RESPONSE="$(
stackit security-group create \
--project-id "$PROJECT_ID" \
--region "$REGION" \
--name "${SERVER_NAME}-mgmt" \
--description "Management access for ${SERVER_NAME}" \
--stateful \
--output-format json
)"
export MGMT_SECURITY_GROUP_ID="$(printf '%s' "$SECURITY_GROUP_RESPONSE" | jq -r '.id')"
printf 'MGMT_SECURITY_GROUP_ID=%s\n' "$MGMT_SECURITY_GROUP_ID"
允许来自已批准的源CIDR的SSH。
stackit security-group rule create \
--project-id "$PROJECT_ID" \
--region "$REGION" \
--security-group-id "$MGMT_SECURITY_GROUP_ID" \
--direction ingress \
--ether-type IPv4 \
--protocol-name tcp \
--port-range-min 22 \
--port-range-max 22 \
--ip-range "$TRUSTED_SOURCE_CIDR" \
--description "SSH from approved source"
仅在部署需要时,才添加HTTPS、NETCONF、ICMP或思科SD-WAN控制和数据平面规则。将每个入口规则限制在最窄的实际源上。
创建服务器之前先创建网卡。将管理安全组连接到NIC 1,然后按照预期的C8000V接口顺序提交生成的NIC ID。
MGMT_NIC_RESPONSE="$(
stackit network-interface create \
--project-id "$PROJECT_ID" \
--region "$REGION" \
--network-id "$MGMT_NETWORK_ID" \
--name "${SERVER_NAME}-mgmt" \
--nic-security \
--security-groups "$MGMT_SECURITY_GROUP_ID" \
--output-format json
)"
DATA_NIC_RESPONSE="$(
stackit network-interface create \
--project-id "$PROJECT_ID" \
--region "$REGION" \
--network-id "$DATA_NETWORK_ID" \
--name "${SERVER_NAME}-data" \
--nic-security \
--output-format json
)"
export MGMT_NIC_ID="$(printf '%s' "$MGMT_NIC_RESPONSE" | jq -r '.id')"
export DATA_NIC_ID="$(printf '%s' "$DATA_NIC_RESPONSE" | jq -r '.id')"
printf 'MGMT_NIC_ID=%s\nDATA_NIC_ID=%s\n' "$MGMT_NIC_ID" "$DATA_NIC_ID"
server-create示例首先为GigabitEthernet1提交MGMT_NIC_ID,其次为GigabitEthernet2提交DATA_NIC_ID。其他NIC ID按提交的顺序映射到后续IOS XE接口。在服务器启动后,验证IOS XE生成的映射。
记录每个NIC的NIC ID、网络ID、MAC地址、分配的IP地址和预定的IOS XE接口。
公共IP与特定NIC关联。如果需要外部管理,请将其与NIC 1关联。
当通过专用路径提供管理访问时,省略此步骤。
PUBLIC_IP_RESPONSE="$(
stackit public-ip create \
--project-id "$PROJECT_ID" \
--region "$REGION" \
--associated-resource-id "$MGMT_NIC_ID" \
--output-format json
)"
export PUBLIC_IP_ID="$(printf '%s' "$PUBLIC_IP_RESPONSE" | jq -r '.id')"
printf '%s\n' "$PUBLIC_IP_RESPONSE" | jq '{id, ip, associatedResourceId}'
对于自主模式,使用每行一个IOS XE配置命令创建iosxe_config.txt。
对于控制器模式,在Cisco SD-WAN Manager中生成控制器模式Cloud-Init bootstrap并保留文件名ciscosdwan_cloud_init.cfg。
对于SD-Routing模式,在Cisco SD-WAN Manager中生成SD-Routing-mode Cloud-Init bootstrap并保留文件名ciscosdwan_cloud_init.cfg。
请勿手动编辑Cisco SD-WAN Manager生成的bootstrap。生成的文件包含设备身份和入职信息,必须作为带有凭证的项目加以保护。
hostname <ROUTER_HOSTNAME>
!
ip domain name <DOMAIN_NAME>
!
username <ADMIN_USER> privilege 15 secret <ADMIN_SECRET>
enable secret <ENABLE_SECRET>
!
interface GigabitEthernet1
description Management
ip address dhcp
no shutdown
!
interface GigabitEthernet2
description Service
no ip address
no shutdown
!
crypto key generate rsa modulus 2048
ip ssh version 2
!
line vty 0 4
login local
transport input ssh
!
end
设置所选引导程序的路径并限制对文件的访问。
export BOOTSTRAP_FILE="/path/to/<BOOTSTRAP_FILE>"
chmod 600 "$BOOTSTRAP_FILE"
export USER_DATA_B64="$(base64 < "$BOOTSTRAP_FILE" | tr -d '\r\n')"
特定于C8000V的设置是configDrive:true,是userData中的base64编码引导程序、基于映像的引导卷以及有序的NIC ID。
jq -n \
--arg name "$SERVER_NAME" \
--arg machineType "$MACHINE_TYPE" \
--arg availabilityZone "$AVAILABILITY_ZONE" \
--arg bootVolumeId "$BOOT_VOLUME_ID" \
--arg mgmtNicId "$MGMT_NIC_ID" \
--arg dataNicId "$DATA_NIC_ID" \
--arg userData "$USER_DATA_B64" \
'{
name: $name,
machineType: $machineType,
availabilityZone: $availabilityZone,
configDrive: true,
userData: $userData,
bootVolume: {
source: {
type: "volume",
id: $bootVolumeId
}
},
networking: {
nicIds: [$mgmtNicId, $dataNicId]
},
labels: {
product: "cisco-c8000v"
}
}' > c8000v-server.json
查看请求,但不显示引导程序:
jq 'del(.userData)' c8000v-server.json
使用针对目标环境记录的当前STACKIT IaaS v2终端。根据需要替换STACKIT API URL。
SERVER_RESPONSE="$(
stackit curl \
-X POST \
"https://<STACKIT API URL>/v2/projects/${PROJECT_ID}/regions/${REGION}/servers" \
-H "Content-Type: application/json" \
--data @c8000v-server.json \
--fail
)"
export SERVER_ID="$(printf '%s' "$SERVER_RESPONSE" | jq -r '.id')"
printf '%s\n' "$SERVER_RESPONSE" | jq '{id, name, status, configDrive}'
响应示例:
{
"id": "<SERVER_ID>",
"name": "<C8000V_NAME>",
"status": "CREATING",
"configDrive": true
}
轮询直到服务器达到预期的运行状态。
stackit server describe "$SERVER_ID" \
--project-id "$PROJECT_ID" \
--region "$REGION" \
--output-format json |
jq '{id, name, status, powerStatus}'
确认:
通过批准的管理路径进行连接,并运行与所选版本和模式相应的检查。
show version
show platform software vnic-if interface-mapping
show ip interface brief
show ip route
确认目标模式处于活动状态,已应用第0天配置,并且IOS XE接口与提交的NIC顺序匹配。
控制器模式的其他命令:
show sdwan control connections
show sdwan control local-properties
show sdwan system status
用于SD-Routing模式的其他命令:
show sd-routing control connections summary
show sd-routing control local-properties summary
show sd-routing system status
验证后,轮换临时调配凭据并删除本地请求文件和编码后的变量。
rm -f c8000v-server.json
unset USER_DATA_B64
此部分中的cleanup命令永久删除资源。确认不再需要部署,并且每个资源ID仅属于此C8000V部署。请勿删除现有或共享网络、安全组、映像或其他资源。
清除示例会保留交互式确认提示。在批准操作之前,查看每个STACKIT CLI确认提示中显示的资源。
对于控制器或SD-Routing模式,请在删除STACKIT资源之前完成所有所需的控制器端停用。
检查记录的资源ID,然后继续。
printf 'SERVER_ID=%s\n' "$SERVER_ID"
printf 'PUBLIC_IP_ID=%s\n' "${PUBLIC_IP_ID:-not-created}"
printf 'MGMT_NIC_ID=%s\nDATA_NIC_ID=%s\n' "$MGMT_NIC_ID" "$DATA_NIC_ID"
printf 'BOOT_VOLUME_ID=%s\n' "$BOOT_VOLUME_ID"
printf 'MGMT_SECURITY_GROUP_ID=%s\n' "$MGMT_SECURITY_GROUP_ID"
printf 'MGMT_NETWORK_ID=%s\nDATA_NETWORK_ID=%s\n' "$MGMT_NETWORK_ID" "$DATA_NETWORK_ID"
printf 'IMAGE_ID=%s\n' "$IMAGE_ID"
如果部署具有公共IP,请在删除服务器之前将其分离。
if [ -n "${PUBLIC_IP_ID:-}" ]; then
stackit server public-ip detach "$PUBLIC_IP_ID" \
--server-id "$SERVER_ID" \
--project-id "$PROJECT_ID" \
--region "$REGION"
fi
首先删除服务器。在服务器列表中不再出现服务器后继续。
stackit server delete "$SERVER_ID" \
--project-id "$PROJECT_ID" \
--region "$REGION"
stackit server list \
--project-id "$PROJECT_ID" \
--region "$REGION"
删除可选的公共IP、两个有序的NIC和引导卷。
if [ -n "${PUBLIC_IP_ID:-}" ]; then
stackit public-ip delete "$PUBLIC_IP_ID" \
--project-id "$PROJECT_ID" \
--region "$REGION"
fi
stackit network-interface delete "$MGMT_NIC_ID" \
--network-id "$MGMT_NETWORK_ID" \
--project-id "$PROJECT_ID" \
--region "$REGION"
stackit network-interface delete "$DATA_NIC_ID" \
--network-id "$DATA_NETWORK_ID" \
--project-id "$PROJECT_ID" \
--region "$REGION"
stackit volume delete "$BOOT_VOLUME_ID" \
--project-id "$PROJECT_ID" \
--region "$REGION"
如果仅为此部署创建了管理安全组和网络,请在它们的从属资源消失后将其删除。
stackit security-group delete "$MGMT_SECURITY_GROUP_ID" \
--project-id "$PROJECT_ID" \
--region "$REGION"
stackit network delete "$MGMT_NETWORK_ID" \
--project-id "$PROJECT_ID" \
--region "$REGION"
stackit network delete "$DATA_NETWORK_ID" \
--project-id "$PROJECT_ID" \
--region "$REGION"
将自定义映像用于另一个C8000V部署时,保留该映像。否则,请在删除所有从属启动卷后将其删除。
stackit image delete "$IMAGE_ID" \
--project-id "$PROJECT_ID" \
--region "$REGION"
列出其余资源并确认删除的ID不再存在。故意保留的共享资源仍应显示。
stackit server list --project-id "$PROJECT_ID" --region "$REGION"
stackit public-ip list --project-id "$PROJECT_ID" --region "$REGION"
stackit volume list --project-id "$PROJECT_ID" --region "$REGION"
stackit security-group list --project-id "$PROJECT_ID" --region "$REGION"
stackit network list --project-id "$PROJECT_ID" --region "$REGION"
stackit image list --project-id "$PROJECT_ID" --region "$REGION"
确认在部署后保留的所有本地引导程序对象都已根据组织的凭证保留策略进行处理。
# List servers
stackit server list --project-id "$PROJECT_ID" --region "$REGION"
# List volumes
stackit volume list --project-id "$PROJECT_ID" --region "$REGION"
# List custom images
stackit image list --project-id "$PROJECT_ID" --region "$REGION"
# List network interfaces
stackit network-interface list --project-id "$PROJECT_ID" --region "$REGION"
show version
show platform software vnic-if interface-mapping
show ip interface brief
show ip route
show logging
| 版本 | 发布日期 | 备注 |
|---|---|---|
1.0 |
24-Aug-2026
|
初始版本 |