简介
本文档介绍如何在Catalyst 9000系列平台上实施应用托管并对其进行故障排除。
先决条件
要求
Cisco 建议您了解以下主题:
- LAN交换基础。
- 熟悉 Cisco IOS® XE和许可。
- 了解交换架构。
- 熟悉基本的Linux命令。
使用的组件
本文档中的信息基于以下软件和硬件版本:
- Catalyst 9300
- Catalyst 9400
- Catalyst 9500
- Cisco IOS® XE和16.12.X或17.X软件
- 有关详细信息,请参阅支持的Catalyst型号应用托管。
注意:有关在其他思科平台上启用这些功能所使用的命令,请参阅相应的配置指南。
本文档中的信息都是基于特定实验室环境中的设备编写的。本文档中使用的所有设备最初均采用原始(默认)配置。如果您的网络处于活动状态,请确保您了解所有命令的潜在影响。
背景信息
企业网络中用于解决各种关键业务使用案例的应用程序至关重要,包括协议分析器等管理工具以及入侵检测服务等安全解决方案。传统上,这些应用运行在外部物理或基于云的虚拟服务器上,但现代需求凸显了此类方法的局限性。
Cisco Catalyst 9000系列交换机通过集成专为现代数字时代设计的高级功能使企业网络发生了革命性的变化。这些交换机由Cisco IOS® XE操作系统和x86 CPU支持,不仅仅是传统网络设备;它们作为应用托管的平台,使企业能够整合基础设施并为边缘计算创造新的可能性。这样,安全代理、IoT传感器和流量监控工具等应用可以直接在交换机上运行,无需外部计算硬件。
应用托管框架的限制
要在Catalyst 9000上启用应用托管框架,需要满足以下要求:
应用托管架构
为了支持Cisco Catalyst 9000交换机上的应用托管功能,该交换机提供硬件资源,使应用可以驻留和执行。在Cisco Catalyst 9000交换机上运行的Cisco IOS XE为应用托管预留专用内存和CPU资源,以便为用户应用提供单独的执行空间,而不会影响交换机的完整性和性能。
此外,应用程序必须驻留在其中一个外部固态驱动器(SSD)存储选项(USB或M2 SATA)中,具体取决于特定的Cisco Catalyst 9000平台。应用程序无权访问内部设备闪存,该闪存为Cisco IOS XE保留以保护其完整性。
为了获得最大的灵活性以及与主操作系统的完全隔离,Cisco Catalyst 9000交换机上的Cisco IOS XE内核和Cisco Application Framework通过利用控制组(Cgroups)和用户命名空间来支持容器化应用。Cgroups限制对物理资源的访问,例如应用程序的CPU和内存。思科应用框架检查是否有足够的资源来激活和安装应用。如果硬件资源不可用于该应用程序,则它无法激活该应用程序,并且会向管理员发送相关消息。
图1.显示Cisco Catalyst 9000平台上Cisco应用框架的可视化表示:

此外,SSD存储通过在SSD存储上提供AES-256硬件加密,并在SSD存储和交换机上提供密码身份验证,从而提供一流的安全性。
AES-256加密完全在硬件中完成。使用密码身份验证时,必须在SSD和交换机上设置密码。将预配置了密码身份验证的SSD插入没有匹配密码配置的Catalyst 9000交换机时,身份验证失败,因为交换机没有配置正确的密码。SSD存储和交换机上的密码必须匹配,才能成功取消身份验证,如图2所示。
如果从Catalyst 9000交换机移除已配置密码的SSD存储并将其插入非Catalyst交换机中,则内容是安全的,不可访问。只有在Catalyst交换机中使用正确的密码解锁后,才能访问任何敏感数据。
图2.显示SSD存储上的验证码:

例如,可以使用以下命令启用或禁用安全性并设置密码:
Cat9k#hw-module switch 1 usbflash1 security ?
disable disable security on USB3.0
enable Enable security on USB3.0
unlock Unlock USB3.0
Cat9k(config)#hw-module switch 1 usbflash1-password
应用托管支持的Catalyst型号
支持以下应用托管功能:
支持的平台
|
Cisco IOS XE版本
|
Catalyst 9300/L
|
16.12.1版本或更高版本
|
Catalyst 9300X
|
17.5.1版本或更高版本
|
Catalyst 9300LM
|
17.9.1版本或更高版本
|
Catalyst 9404 和 9407
|
17.1.1版本或更高版本
|
Catalyst 9410
|
17.5.1版本或更高版本
|
Catalyst 9400X
|
17.8.1版本或更高版本
|
Catalyst 9500高性能和9600系列
|
17.5.1版本或更高版本
|
Catalyst 9500X和9600X系列
|
17.8.1版本或更高版本
|
注意:Cisco Catalyst 9200系列和Catalyst 9500(基于UADP 2.0):C9500-40X、C9500-16X、C9500-24Q、C9500-12Q)型号不支持应用托管。
应用的硬件资源
表1.包含应用的Cisco Catalyst 9000平台硬件资源:

如果默认选项不足,可以使用自定义资源配置文件保留资源、CPU、内存和vCPU。有关设备资源限制,请参阅以下信息:

-
vCPU:这表示单个应用程序可以同时使用的虚拟CPU的最大数量。
-
CPU单元:表示分配给应用程序托管的CPU负载资源总数。每个应用都指定其确保可靠运行所需的最低CPU负载。
-
USB背存储:指后面板凹式USB 3.0插槽。只有此后面板USB 3.0插槽支持应用托管。
-
M.2 SATA存储:表示用于应用数据存储的内部固态驱动器(SSD)。
-
不适用:表示功能或资源对于指定的配置不可用。
此示例说明如何创建自定义配置文件:
Cat9k(config)#app-hosting appid MYAPP
Cat9k(config-app-hosting)#app-resource profile custom
Cat9k(config-app-resource-profile-custom)#cpu 7400
Cat9k(config-app-resource-profile-custom)#memory 2048
Cat9k(config-app-resource-profile-custom)#vcpu 2
应用高可用性
Catalyst 9000交换机支持应用自动重启功能,该功能可在系统切换或重启时保留应用上次配置的运行状态。此功能默认启用,并且主用和备用交换机上都需要相同的存储类型。
表2. Cisco Catalyst 9000平台应用自动重启功能

应用托管框架
默认情况下未启用应用托管框架。思科应用框架(CAF)由思科构建,用于管理在任何网络设备上运行的容器化应用。CAF也称为IOx。Cisco IOx可在网络边缘执行IoT应用(雾计算),同时确保与Cisco IOS软件的安全连接。它可为应用程序托管保留4 GB的磁盘空间。通过CLI禁用IOx或IOx基础设施使用SSD时,会清除分区和应用数据。
这是用于启用应用托管基础设施的Cisco IOS XE CLI配置:
Cat9k(config)#iox
注意:从Cisco IOS XE 16.12.1开始,IoX打包不再为必填项。可以按原样安装Docker应用。这样,用户无需额外打包即可构建并自带应用。应用开发人员可以找到有关在Cisco DevNet站点上托管应用的更多信息
容器网络
该图说明了容器的连接体系结构。它突出显示了Cat9k支持应用托管的所有可能的网络模式。此类设备包括:
- 使用专用内部AppGigabitEthernet接口的前面板数据端口交换
- 管理接口(GigabitEthernet 0/0)
AppGigabitEthernet是一个内部硬件数据端口,硬件交换到前面板数据端口。使用管理接口和前面板数据端口连接容器。在容器中,虚拟网络接口卡(vNIC)显示为标准以太网接口,标记为eth0、eth1等。此设计有助于在容器化环境中实现无缝集成和一致的网络配置。
图3.容器网络图:

Cisco Catalyst 9300、Catalyst 9400和Catalyst 9500X系列交换机上引入的AppGigabitEthernet接口提供专用的应用流量功能。它是一个内部硬件数据端口,通过硬件交换连接到前面板数据端口。AppGigabitEthernet接口可以配置为中继或VLAN特定接口。对于TRUNK接口,它扩展为第2层TRUNK端口,该端口接收的所有流量都可用于应用。对于VLAN接口,应用程序通过指定VLAN ID号连接到特定VLAN网络。
AppGbEthernet;接口仅在Cisco Catalyst 9300系列、Catalyst 9400系列和Catalyst 9500X交换机上可用。配备管理引擎1的Catalyst 9410机箱需要禁用插槽4端口48(如果适用)以启用AppGigabitEthernet端口。Catalyst 9500高性能和9600系列交换机不支持AppGigabitEthernet接口。这些型号上托管的应用程序的连接是通过管理接口通过环回接口从任何前面板端口实现的。
注意:C9300X、C9400X-Sup-2/2XL和C9500X型号具有2个10G AppGigabitEthernet端口。
应用托管网络
对于TRUNK接口,端口接收的所有流量均可供应用使用:
Cat9k(config)#interface AppGigabitEthernet 1/0/1
Cat9k(config)#switchport mode trunk
Cat9k(config-if)#exit
Cat9k(config)#app-hosting appid MYAPP
Cat9k(config-app-hosting)#app-vnic AppGigabitEthernet trunk
Cat9k(config-config-app-hosting-trunk)#guest-interface
Cat9k(config-config-app-hosting-trunk-mode-guest)#end
对于VLAN接口,应用连接到特定VLAN:
Cat9k(config)#interface AppGigabitEthernet 1/0/1
Cat9k(config)#switchport trunk allowed vlan
Cat9k(config-if)#exit
Cat9k(config)#app-hosting appid MYAPP
Cat9k(config-app-hosting)#app-vnic AppGigabitEthernet trunk
Cat9k(config-config-app-hosting-trunk)#vlan guest-interface
Cat9k(config-config-app-hosting-trunk-mode-guest)#end
对于管理接口,应用连接到管理端口(GigabitEthernet0/0):
Cat9k(config)#interface gigabitEthernet 0/0
Cat9k(config-if)#ip address
Cat9k(config-if)#exit
Cat9k(config)#app-hosting appid MYAPP
Cat9k(config-app-hosting)#(config-app-hosting)#app-vnic management guest-interface
Cat9k((config-app-hosting-mgmt-gateway)#end
分配给应用容器的IP地址:容器接口的IP地址可通过交换机CLI显式分配,也可通过DHCP动态获取。
通过AppGigabitEthernet配置应用的静态IP地址:
Cat9k(config)#app-hosting appid MYAPP
Cat9k(config-app-hosting)#app-vnic AppGigabitEthernet trunk
Cat9k(config-config-app-hosting-trunk)#vlan guest-interface
Cat9k(config-config-app-hosting-vlan-access-ip)#guest-ipaddress netmask <-- Container IP Address
Cat9k(config-config-app-hosting-vlan-access-ip)#exit
Cat9k(config-config-app-hosting-trunk)#exit
Cat9k(config-app-hosting)#app-default-gateway guest-interface
Cat9k(config-app-hosting)#exit
通过GigabitEthernet 0/0配置应用的静态IP地址:
Cat9k(config)#app-hosting appid MYAPP
Cat9k(config-app-hosting)#app-vnic management guest-interface
Cat9k(config-app-hosting-mgmt-gateway)#guest-ipaddress netmask
Cat9k(config-app-hosting-mgmt-gateway)#exit
Cat9k(config-app-hosting)#app-default-gateway guest-interface
Cat9k(config-app-hosting)#exit
为应用(DHCP)配置动态IP地址:
Cat9k(config)#app-hosting appid MYAPP
Cat9k(config-app-hosting)#app-vnic AppGigabitEthernet trunk
Cat9k(config-config-app-hosting-trunk)#vlan guest-interface
Cat9k(config-config-app-hosting-vlan-access-ip)#end
Cat9k#
Or through Interface GigabitEthernet 0/0
Cat9k(config)#app-hosting appid MYAPP
Cat9k(config-app-hosting)#app-vnic management guest-interface
Cat9k(config-app-hosting-mgmt-gateway)#end
提示:在安装应用之前,请确保网络配置正确。如果需要更改,请停止、停用和卸载(Stop、Deactivate和Uninstall),然后重新启动。
和应用程序的生命周期
Cisco Catalyst 9000交换机上的应用生命周期包括三个阶段,如图4所示:
- 安装:在此阶段,应用将安装在设备上。但是,应用程序所需的资源尚未分配。
- Activate:应用所需的硬件资源用于确保其功能。
- 开始:应用转换到运行状态,变为完全活动且运行正常。
图4.应用生命周期管理:

Docker运行时选项
如果容器应用需要具有运行时选项,这些选项作为命令行选项(如控制器IP、数据目录等)传递,则可以使用app-resource docker命令配置这些选项。
系统支持多行运行选项字符串配置。以下是用户需要考虑的主要事项:
- 用户最多可以输入/复制粘贴30行docker运行选项。
- 系统按该顺序从第1行到第30行的字符串生成串连字符串。
- 每行run-option中的每个字符串最多可以包含235个字符。
- 每个字符串可以有多个完整的docker run-option,只要它们全部包含在235个字符中。
- 请注意,任何行中的运行选项字符串都不能拆分为下一行。
- 无需使用空格终止每行中的字符串。当系统将所有现有run-option字符串串连成单个字符串时,系统会自动为每行生成一个空格。
- 如果用户对“运行”选项做出任何更改,用户需要停止、停用、激活并重新启动应用程序才能使新的运行选项生效。
以下是Docker选项及其在Cat9k交换机上可能的等效配置的示例:
docker run -v $(APP_DATA):/data --entrypoint startup.sh
Catalyst 9000交换机上的配置:
Cat9k(config)#app-hosting appid MYAPP
Cat9k(config-app-hosting)#app-resource docker
Cat9k(config-app-hosting-docker)#run-opts 1 "-v $(APP_DATA):/data"
Cat9k(config-app-hosting-docker)#run-opts 2 "--entrypoint startup.sh"
对于外部永久数据存储,请使用命令:run-opts 1 "-v /vol/usb1/iox_host_data_share:/(APP_DATA)"
Cat9k(config)#app-hosting appid MYAPP
Cat9k(config-app-hosting)#app-resource docker
Cat9k(config-app-hosting-docker)#run-opts 1 "-v /vol/usb1/iox_host_data_share:/(APP_DATA)"
要从配置中删除运行选项行,请执行与以下示例类似的“no”命令:
Cat9k(config)#app-hosting appid MYAPP
Cat9k(config-app-hosting)#app-resource docker
Cat9k(config-app-hosting-docker)#no run-opts 1 "-v /vol/usb1/iox_host_data_share:/(APP_DATA)"
要删除应用程序配置中的所有运行选项,可以执行no configuration命令:
Cat9k(config)#app-hosting appid MYAPP
Cat9k(config-app-hosting)#no app-resource docker
不受支持的Docker运行时选项列表
由于安全原因或选项不适用于Linux平台,因此列出的应用程序托管框架不支持Docker命令行选项。
Docker选项
|
描述
|
--配售
|
连接到STDIN、STDOUT或STDERR。
|
— 无重设备
|
指定块IO权重(相对设备权重)。
|
—cgroup-parent
|
容器的可选父组。
|
—cidfile
|
将容器ID写入指定的文件。
|
—cpu-count
|
指定CPU计数(仅限Windows)。
|
—cpu-percent
|
指定CPU百分比(仅限Windows)。
|
-cpu
|
指定CPU数量(API 1.25+)。
|
—device-cgroup-rule
|
将规则添加到cgroup allowed devices列表。
|
—device-read-bps
|
限制设备的读取速率(每秒字节数)。
|
— 设备读取IOPS
|
限制设备的读取速率(I/O每秒)。
|
—device-write-bps
|
限制设备的写入速率(每秒字节数)。
|
—device-write-iops
|
限制设备的写入速率(I/O每秒)。
|
—disable-content-trust
|
跳过图像验证。
|
-env-file
|
从文件中加载环境变量。
|
— 交互式(-i)
|
即使未连接STDIN,也要保持打开。
|
—io-maxbandwidth
|
系统驱动器的最大IO带宽限制(仅限Windows)。
|
—io-maxiops
|
系统驱动器的最大IOps限制(仅限Windows)。
|
--ip
|
指定IPv4地址(示例:192.168.100.100)。
|
—ip6
|
指定IPv6地址(示例:2001:db8::44)。
|
— 隔离
|
指定容器隔离技术。
|
— 链接
|
添加指向其他容器的链接。
|
— 名称
|
为容器指定名称。
|
—oomkilldisable
|
禁用容器的OOM杀手。
|
--pid
|
指定要使用的PID命名空间。
|
--平台
|
指定平台(实验;API 1.32+)。
|
— 特权
|
向容器授予扩展权限。
|
--runtime
|
指定用于容器的运行时。
|
— 存储优化
|
定义容器的存储驱动程序选项。
|
—sysctl
|
指定sysctl选项。
|
—tty(-t)
|
分配伪TTY。
|
—userns
|
指定要使用的用户命名空间。
|
—uts
|
指定要使用的UTS命名空间。
|
— 卷驱动程序
|
为容器指定可选的卷驱动程序。
|
配置
后续部分介绍如何在Catalyst 9000上配置和部署APP。
注意:了解在Catalyst 9000系列交换机上无缝工作的合作伙伴解决方案目录应用市场
下载Docker映像并使用SCP、FTP、TFTP或USB存储复制到Cisco交换机:
Cat9k#dir usbflash1:/
Directory of usbflash1:/
17 -rw- 5843233 Jan 23 2025 20:50:01 +00:00 MYAPP.tar
配置网络参数(在本示例中,使用AppGigabitEthernet接口,即192.168.1.10/24,在VLAN 10下并使用Google解析器):
Cat9k(config)#interface AppGigabitEthernet 1/0/1
Cat9k(config-if)#switchport trunk allowed vlan 10
Cat9k(config-if)#exit
Cat9k(config)#app-hosting appid MYAPP
Cat9k(config-app-hosting)#app-vnic AppGigabitEthernet trunk
Cat9k(config-config-app-hosting-trunk)#vlan 10 guest-interface 0
Cat9k(config-config-app-hosting-vlan-access-ip)#guest-ipaddress 192.168.1.10 netmask 255.255.255.0
Cat9k(config-config-app-hosting-vlan-access-ip)#exit
Cat9k(config-config-app-hosting-trunk)#exit
Cat9k(config-app-hosting)#app-default-gateway 192.168.1.1 guest-interface 0
Cat9k(config-app-hosting)#name-sever 8.8.8.8
Cat9k(config-app-hosting)#exit
在交换机上启用IOx框架,然后等待直到所有服务都在运行:
Cat9k(config)#iox
Cat9k#show iox-service
IOx Infrastructure Summary:
---------------------------
IOx service (CAF) : Running
IOx service (HA) : Running
IOx service (IOxman) : Running
IOx service (Sec storage) : Running
Libvirtd 5.5.0 : Running
Dockerd v19.03.13-ce : Running
Application DB Sync Info : Available
Sync Status : Disable
为特定应用设置所需的Docker运行选项:
Cat9k(config)#app-hosting appid MYAPP
Cat9k(config-app-hosting)#app-resource docker
Cat9k(config-app-hosting-docker)#run-opts 1 ""
Cat9k(config-app-hosting-docker)#run-opts 2 ""
从SSD安装应用并验证其部署:
Cat9k#app-hosting install appid MYAPP package usbflash1:MYAPP.tar
Installing package 'usbflash1:MYAPP.tar' for 'MYAPP'. Use 'show app-hosting list' for progress.
Cat9k#show app-hosting list
App id State
---------------------------------------------------------
MYAPP DEPLOYED
激活应用程序并验证其状态:
Cat9k#app-hosting activate appid MYAPP
MYAPP activated successfully
Current state is: ACTIVATED
Cat9k#show app-hosting list
App id State
---------------------------------------------------------
MYAPP ACTIVATED
启动应用程序并验证其运行状态:
Cat9k#app-hosting start appid MYAPP
MYAPP started successfully
Current state is: RUNNING
Cat9k#show app-hosting list
App id State
---------------------------------------------------------
MYAPP RUNNING
保存您的配置更改,以确保这些更改在重新启动后保持不变:
Cat9k#app-hosting start appid MYAPP
MYAPP started successfully
Current state is: RUNNING
Cat9k#show app-hosting list
App id State
---------------------------------------------------------
MYAPP RUNNING
故障排除
下表列出了可用于对应用托管进行故障排除的各种命令:
命令
|
目的
|
show iox-service
|
显示接口错误计数器
|
show app-hosting list
|
显示已安装的设备的列表
|
show app-hosting detail appid MYAPP
|
显示有关设备的详细信息
|
show app-hosting resource
|
显示可用资源
|
show app-hosting utilization appid MYAPP
|
显示设备的利用率信息
|
应用托管将appid MYAPP日志移动到bootflash:
|
使用此命令可捕获应用特定跟踪日志(如果存在)。
|
应用托管将系统技术支持移动到?
bootflash: 目标路径 crashinfo-1: 目标路径 crashinfo: 目标路径 flash-1: 目标路径 flash: 目标路径 webui: 目标路径
|
使用此命令可将系统技术支持移至备用目录。
|
show app-hosting infra
|
使用此命令可检查是否已启用签名验证。
提示:仅当应用托管使用USB/SSD作为介质时,才能禁用应用签名验证。
|
应用托管验证? 禁用应用验证禁用 enable App verification enable
|
使用此命令可启用/禁用签名验证(形式为CLI权限模式)。
|
应用托管连接appid MYAPP会话
|
使用此命令可访问应用控制台并验证容器内进程的状态(从CLI权限模式)。
|
修改Docker容器
如果Docker需要修改,请遵循以下步骤:
Cat9k#app-hosting stop appid MYAPP
MYAPP stopped successfully
Current state is: STOPPED
Cat9k#app-hosting deactivate appid MYAPP
MYAPP deactivated successfully
Current state is: DEPLOYED
Cat9k#app-hosting start appid MYAPP
Cat9k(config)#app-hosting appid MYAPP
Cat9k(config-app-hosting)#app-resource docker
Cat9k(config-app-hosting-docker)#prepend-pkg-opts
Cat9k(config-app-hosting-docker)#
Cat9k(config-app-hosting-docker)#exit
Cat9k(config-app-hosting)#exit
Cat9k(config)#exit
Cat9k#app-hosting activate appid MYAPP
MYAPP activated successfully
Current state is: STOPPED
Cat9k#app-hosting start appid MYAPP
MYAPP started successfully
Current state is: RUNNING
相关信息