在容器中运行第三方应用程序
要在 Junos OS 演化版上运行您自己的应用程序,您可以选择将它们部署为 Docker 容器。容器在 Junos OS 演化版上运行,应用程序在容器中运行,使它们与主机操作系统隔离。 容器安装在挂载在 / var/extensions 的单独分区中。容器在重新启动和软件升级后仍然存在。
Docker 容器未集成到 Junos OS 演化版中,而是使用 Docker 命令完全通过 Linux 创建和管理。有关 Docker 容器和命令的更多信息,请参阅官方 Docker 文档: https://docs.docker.com/get-started/
容器对可以从系统使用的资源有默认限制:
-
Storage – /var/extensions 分区的大小由平台驱动:8GB 或 /var 总大小的 30%,以较小者为准。
-
Memory – 容器没有默认的物理内存限制。这是可以更改的。
-
CPU – 容器没有默认的 CPU 限制。这是可以更改的。
如有必要,可以修改容器的资源限制。请参阅 修改容器的资源限制。
部署 Docker 容器
要部署 docker 容器,请执行以下操作:
管理 Docker 容器
Docker 容器通过标准 Docker Linux 工作流进行管理。使用 docker ps
、 ps
或 top
Linux 命令显示正在运行的 Docker 容器,并使用 Docker 命令管理容器。有关 Docker 命令的详细信息,请参阅: https://docs.docker.com/engine/reference/commandline/cli/
Docker 容器中的自定义应用程序不支持 Junos OS 演化版高可用性功能,如果应用程序具有高可用性功能,则应在每个 RE 上运行该应用程序,以确保它可以自行同步。此类应用程序需要具有管理自身并与所有实例通信所需的业务逻辑。
在容器中启用 Netlink 或 PacketIO
如果您的容器需要额外的功能(如 Netlink 或 PacketIO),则需要为 Docker 命令提供额外的参数。您还需要启用服务才能在某些版本上启用 nlsd
Netlink 功能。以下示例说明如何通过向 Docker 命令添加参数来激活容器的 Netlink 或 PacketIO 功能:
在启动 Docker 服务时创建只读名称持久卷。挂载卷
jnet
将通过 WAN/数据端口挂载 PacketIO 和 Netlink 功能所需的库:--mount source=jnet,destination=/usr/evo
与容器共享主机的网络和 IPC 命名空间。需要通过 WAN/数据端口实现 PacketIO 和 Netlink 功能的容器需要位于主机网络和 IPC 命名空间中:
--network=host --ipc=host
系统重新启动时自动启动容器:
--restart=always
启用 Netlink 和 PacketIO 库所需的网络管理功能:
--cap-add=NET_ADMIN
启用 Netlink 和 PacketIO over WAN/数据端口所需的环境变量:
--env-file=/run/docker/jnet.env
将 jtd0 设备从主机挂载到容器以帮助处理 PacketIO:
--device=/dev/jtd0
将主机的 / dev/shm 目录挂载到容器中,以便通过 WAN/数据端口进行 Netlink 和 PacketIO:
-v /dev/shm:/dev/shm
如果容器应用程序需要多播组管理,请将 / dev/mcgrp 目录从主机装载到容器:
-v /dev/mcgrp:/dev/mcgrp
在 Junos OS 演化版 24.1R1 之后,主机网络命名空间中想要进行 DNS 解析的容器需要将
--dns ::1
选项docker run
传递给命令。Junos OS 演化版 23.4 及更早版本不需要这样做:--dns ::1
如果您的容器需要与 Netlink 相关的处理,则还需要使用以下 CLI 配置在 Junos OS 演化版中启用 Netlink 异步 API(
nlsd
) 进程:[edit] user@host# set system processes nlsd enable
需要 PacketIO 和 Netlink 功能的本机 Linux 或基于容器的应用程序应动态链接。我们建议使用基于 Ubuntu 的 Docker 容器,因为它们是唯一获得瞻博网络正式认证的容器。基于 Ubuntu 的容器应使用与基本 Junos Evolved OS glibc
兼容的 glibc
。
为 Docker 容器选择 VRF
容器从 Docker 守护程序继承虚拟路由和转发 (VRF)。为了在不同的 VRF 中运行容器,需要在相应的 VRF 中启动 Docker 守护程序实例。该 docker@vrf.service
实例允许在相应的 VRF 中启动守护程序。如果未指定 VRF,则 VRF 默认为 vrf0
。
默认情况下运行docker.service
vrf:none
。
特定 VRF 的 docker 守护程序侦听位于 / run/docker-vrf.sock 的相应套接字。
这是在 Linux 上看到的 VRF,而不是 Junos OS Evolved VRF。该实用程序 evo_vrf_name
(从 Junos OS 演化版 24.1 开始提供)可用于查找与 Junos OS 演化版 VRF 对应的 Linux VRF。
Docker 客户端使用以下参数与特定于 VRF 的 docker 守护程序相关联:
--env-file /run/docker-vrf/jnet.env --host unix:///run/docker-vrf.sock or export DOCKER_HOST=unix:///run/docker-vrf.sock
例如,要在中 vrf0
运行容器,请输入以下 Docker 命令和参数:
[vrf:none] user@host:~# docker -H unix:///run/docker-vrf0.sock run --rm -it --network=host --ipc=host --cap-add=NET_ADMIN --mount source=jnet,destination=/usr/evo --device=/dev/jtd0 -v /dev/mcgrp:/dev/mcgrp -v /dev/shm:/dev/shm --env-file=/run/docker-vrf0/jnet.env --dns ::1 debian:stretch ip link 1002: et-01000000000: BROADCAST,MULTICAST,UP mtu 1514 state UP qlen 1 link/ether ac:a:a:18:01:ff brd ff:ff:ff:ff:ff:ff 1001: mgmt-0-00-0000: BROADCAST,MULTICAST,UP mtu 1500 state UP qlen 1 link/ether 50:60:a:e:08:bd brd ff:ff:ff:ff:ff:ff 1000: lo0_0: LOOPBACK,UP mtu 65536 state UP qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
一个容器只能关联到单个 VRF。
修改容器的资源限制
容器的默认资源限制通过位于 / etc/extensions/platform_attributes 的文件进行控制。打开此文件后,您将看到以下文本:
## Edit to change upper cap of total resource limits for all containers. ## applies only to containers and does not apply to container runtimes. ## memory.memsw.limit_in_bytes = EXTENSIONS_MEMORY_MAX_MIB + EXTENSIONS_MEMORY_SWAP_MAX_MIB:-0 ## check current defaults, after starting extensions-cglimits.service ## $ /usr/libexec/extensions/extensions-cglimits get ## please start extensions-cglimits.service to apply changes here ## device size limit will be ignored once extensionsfs device is created #EXTENSIONS_FS_DEVICE_SIZE_MIB= #EXTENSIONS_CPU_QUOTA_PERCENTAGE= #EXTENSIONS_MEMORY_MAX_MIB= #EXTENSIONS_MEMORY_SWAP_MAX_MIB=
若要更改容器的资源限制,请向 EXTENSIONS
文件底部的条目添加值:
-
EXTENSIONS_FS_DEVICE_SIZE_MIB=
控制容器可以使用的最大存储空间。输入以字节为单位的值。默认值为 8GB 或 /var 总大小的 30%,以较小者为准。 -
EXTENSIONS_CPU_QUOTA_PERCENTAGE=
控制容器可以使用的最大 CPU 使用率。输入一个值,以 CPU 使用率的百分比表示。 -
EXTENSIONS_MEMORY_MAX_MIB=
控制容器可以使用的最大物理内存量。输入以字节为单位的值。
在修改容器的资源限制之前,请注意配置中必须支持的规模的 CPU 和内存要求。增加容器的资源限制时要小心,以防止它们对系统造成压力。