AOS-CX 버전 10.13부터 Feature Pack이라는 기능이 새롭게 생겼습니다.
Feature Pack이라는 추가적인 소프트웨어 라이선스 구독을 통해 고급 기능을 사용할 수가 있게 되었습니다.

Feature Pack은 Advanced와 Premium 두 가지가 있습니다.
Premium은 CX 10000 스위치의 NAT 기능과 IPSec 기능을 활성화하기 위해 필요한 라이선스입니다.
그 외의 Feature Pack 기능은 Advanced로 사용이 가능합니다.
Advanced Feature Pack을 구독하면, 다음과 같은 기능을 사용할 수 있습니다.
- WAN MACsec
- Reflexive Policy


- ABP (Application-Based Policy): App Recognition 기능을 통해 식별된 애플리케이션별 접근 제어 정책
- Container
오늘은 여기서 CX 스위치 내에 컨테이너 이미지를 설치하는 내용을 얘기해볼까 합니다.
Container(컨테이너)란?
컨테이너 기술은 서버 가상화 기술 중 하나입니다.

VMware와 같은 하이퍼바이저 기술은 각 VM별로 OS가 독립적으로 동작하기 때문에 리소스 및 운영상의 부담이 커집니다.
하지만, 컨테이너는 이러한 Guest OS가 필요 없고 서로 컨테이너간 커널을 공유하기 때문에 위의 문제점을 해결합니다.
이러한 이점으로 컨테이너는 기존의 가상화 기술보다 훨씬 가볍게 동작하며 빠르게 배포하고, 메모리를 훨씬 적게 차지합니다.
그렇기 때문에 하나의 호스트 서버에서 여러 인스턴스들을 빠르고 쉽게 독립적으로 가상 환경을 실행할 수 있게 됩니다.
스위치에 컨테이너 기술이 필요한 이유?
그렇다면, 이런 서버 가상화 기술이 왜 스위치에 필요하게 될까요?
스위치에 컨테이너 이미지를 올릴 상황이 왜 필요할까요?
일반적으로 컨테이너는 웹 애플리케이션 방화벽(WAF), NGINX 및 Traefik과 같은 리버스 프록시, 또는 간단한 DHCP/DNS 서버와 같은 경량 서비스를 배포하는 데 사용됩니다. 이러한 서비스는 물리적 서버 같은 전용 컨테이너 호스트에서 실행됩니다.
즉, AOS-CX 스위치는 리눅스 기반의 OS이기 때문에 AOS-CX에서도 실행할 수 있게 됩니다.
몇 가지 Use Case를 살펴볼까요?
- 네트워크 모니터링: 다른 네트워크 장치의 메트릭 수집. (Prometheus)
- API 게이트웨이: 작업을 자동화하기 위한 경량 API 서버 배포.
- 사이트 복제: 각 위치에 서버를 배포하지 않고도 한 위치에서 다른 위치로 파일을 복사하기 위한 경량 복제 서비스 배포.
- 테스트 서비스: 네트워크 연결성 또는 성능을 확인하기 위한 간단한 서비스입니다. (iPerf)
컨테이너 이미지 설치를 통해 갖는 이점
이 때 이러한 애플리케이션을 컨테이너 이미지로 스위치상에 구동하면 여러 이점을 가질 수가 있게 됩니다.
AOS-CX 스위치의 컨테이너는 기존 인프라를 활용하고 추가 장비의 필요성을 제거함으로써 상당한 비용 절감을 제공합니다.
이러한 설정은 불필요한 유지보수나 업데이트를 줄여 매우 유연하고 문제 해결이 용이합니다.
뿐만 아니라, 기존 서버와 달리 스위치 상의 애플리케이션은 접근이 어렵고 쉽게 제거할 수 없어 보안성이 강화됩니다.
그리고 애플리케이션을 에지에 가깝게 배치함으로써 지연 시간과 대역폭 사용량을 줄여 응답 속도를 높입니다.
스위치에 데이터를 통합하면 서버로의 불필요한 연결을 최소화하여 전체 네트워크 성능을 최적화합니다.
AOS-CX 컨테이너 아키텍처

AOS-CX 운영체제 내에는 컨테이너 이미지를 배포하고 실행하기 위한 여러 요소들이 존재합니다.
1. 컨테이너 매니저: 컨테이너 수명 주기를 관리하는 주요 프로세스로 실행 중인 컨테이너에 로드, 시작 및 구성 전달을 담당
2. RUNc: 컨테이너 런타임은 컨테이너 실행을 담당하는 소프트웨어 구성 요소로, 런타임은 기본 운영 체제 커널과 리소스를 컨테이너에 할당합니다.
3. 컨테이너 네트워크 인터페이스: 컨테이너 간 및 다른 네트워크 리소스와의 통신을 보장하여 일관되고 안정적인 네트워킹을 제공
하지만, 이러한 아키텍처가 AOS-CX 10.16부터 변화하게 됩니다.
컨테이너 매니저의 역할을 Docker가 맡게 됩니다. 즉, 더 풍부하고 포괄적인 에코시스템을 활용할 수 있게 됩니다.
컨테이너 네트워크 연결

컨테이너 이미지는 컨테이너 이미지에 연결된 네트워크 VRF를 통해 연결을 제공합니다.
컨테이너당 하나의 VRF만 구성할 수 있고, 추가적인 VRF를 구성하면 컨테이너 배포 실패가 일어날 수 있습니다.
컨테이너 이미지 배포
그럼 이제 실제로 컨테이너 이미지를 배포하는 예제를 살펴보겠습니다.
컨테이너 관리자는 런칭 인프라로 RUNc를 사용합니다.
따라서 CX 스위치용 컨테이너 이미지를 조작하는 권장 방법은 도커(Docker)를 사용하는 것입니다.
개발머신으로 x86 시스템을 갖고 있다면, 적절한 도커 이미지 파일을 사용하여 스위치용 이미지를 바로 빌드할 수 있습니다.
docker build –t <IMAGE NAME> .
docker save –o <IMAGE NAME>.tar <IMAGE NAME>
ARM 아키텍처라면, 위 명령어를 사용하거나 크로스 컴파일 빌드 옵션을 선택할 수 있습니다.
이를 사용하려면 Docker 버전 19.03 이상이 필요합니다.
docker version
export DOCKER_CLI_EXPERIMENTAL=enabled
docker buildx create --name arm_builder
docker buildx use arm_builder
이미지를 빌드하고 파일로 저장하려면 Docker 파일 디렉터리 내에서 다음 명령을 실행합니다.
docker buildx build --platform linux/arm64 -t <IMAGE NAME> --load .
docker save -o <IMAGE NAME>.tar <IMAGE NAME>
스위치상에 전자 서명 되지 않은 컨테이너 이미지를 설치하기 위해선 allow-unsigned
명령어가 필요합니다.
switch(config)# container demo
The feature being used requires a AOS-CX Advanced Software Feature Pack. For more information, refer to the AOS-CX Feature Pack Deployment Guide.
switch(config-container-demo)# image-location http://10.0.14.186:8080/containers/container.img vrf default allow-unsigned
Allowing unsigned container images poses a potential security risk that can impact both the current device and the entire network. By allowing installation of unsigned applications, you are acknowledging and accepting these risks. HPE shall not be responsible for the consequences of your actions and disclaims all liability.
Continue (y/n)? y
설치된 컨테이너 이미지는 show container
명령어로 확인 가능합니다.
Switch# show container
Container : demo
Container status : operational
Manifest status : success
Image status : verified
Image version : <1.0.0>
Image location VRF : default
Image location URL : http://10.0.14.186:8080/containers/container.img
CPU limit : 10%
Memory limit : 256 MB
VRFs : default
환경 변수 설정
만약 컨테이너 이미지에 별도 설정이 필요한 경우라면, 환경 변수 설정도 가능합니다.
Deephub 이라는 위치 추적 미들웨어 컨테이너 이미지를 한 번 설치해보겠습니다.
Docker 이미지를 설치하고 메모리를 3000MB로 제한합니다.
switch(config)# container deephub
switch(config-container-deephub)# image-location http://10.0.0.1:8000/deephub.tar vrf default allow-unsigned
switch(config-container-deephub)# restrict memory 3000
컨테이너 네트워크를 연결하기 위해 VRF 설정과 포트 매핑을 설정합니다.
switch(config-container-deephub)# network vrf default
switch(config-container-network-vrf-default)# preferred
switch(config-container-network-vrf-default)# port-map host-port 7081 container-port 7081 protocol tcp
switch(config-container-network-vrf-default)# exit
이제 Deephub 세부 설정을 위해 환경 변수를 구성합니다.
switch(config-container-deephub)# env SQLITE_TMPDIR value /data
switch(config-container-deephub)# env DEEPHUB_LICENSE_KEY value 6b05c4cf-1733-4b03-96ee-44a3fdeb80e1
switch(config-container-deephub)# env DEEPHUB_HOST value 0.0.0.0
switch(config-container-deephub)# env DEEPHUB_PORT value 7081
switch(config-container-deephub)# env DEEPHUB_CORS value true
같은 방법으로 Deephub UI 컨테이너 이미지도 설치합니다.
switch(config)# container deephub_ui
switch(config-container-deephub_ui)# image-location http://10.0.0.1:8000/deephub-ui-x86.tar vrf default allow-unsigned
switch(config-container-deephub_ui)# restrict memory 3000
switch(config-container-deephub_ui)# network vrf default
switch(config-container-network-vrf-default)# preferred
switch(config-container-network-vrf-default)# port-map host-port 8082 container-port 8080 protocol tcp
switch(config-container-network-vrf-default)# exit
switch(config-container-deephub_ui)# env DEEPHUB_ROOT_URL value http://localhost:9003
show
명령어로 두 개의 컨테이너 이미지를 확인할 수 있습니다.
switch(config)# show container
Container : deephub
container status : operational
Manifest status : missing
Manifest status reason : The container image does not include a manifest file
Image status : allowed without signature
Image location VRF : default
Image location URL : http://10.0.0.1:8000//deephub.tar
CPU limit : 10%
Memory limit : 3000 MB
VRFs : default
Environment variables:
SQLITE_TMPDIR value /data
DEEPHUB_LICENSE_KEY value 6b05c4cf-1733-4b03-96ee-44a3fdeb80e1
DEEPHUB_HOST value 0.0.0.0
DEEPHUB_PORT value 7081
DEEPHUB_CORS value true
Encrypted environment variables:
Network:
VRF name : default
Preferred : yes
Port map :
7081:7081/tcp
switch(config)# show container
Container : deephub_ui
Container status : operational
Manifest status : missing
Manifest status reason : The container image does not include a manifest file
Image status : allowed without signature
Image location VRF : default
Image location URL : http://10.0.0.1:8000//deephub-ui-x86.tar
CPU limit : 10%
Memory limit : 3000 MB
VRFs : default
Environment variables:
DEEPHUB_ROOT_URL=http://localhost:9003
Encrypted environment variables:
Network:
VRF name : default
Preferred : yes
Port map :
8082:8080/tcp
위 예제를 활용하여 설치한 데모 영상입니다.
트러블슈팅
컨테이너 이미지를 사용하다가 에러 메시지들이 발생할 경우, 아래 내용을 참고하면 좋습니다.
우선 Container Status
값에 대한 설명입니다.
- Down: 컨테이너 초기화를 진행하기 위한 필수 조건이 누락
- initializing: 컨테이너 초기화 및 구성 검증 진행 중
- operational: 컨테이너가 가동 중
- network failed: 네트워크 프로비저닝에 실패
- execution failed: 컨테이너 실행에 실패
- configuration failed: 사용자 구성이 실패
- disabled: 컨테이너 비활성화
- exited: 컨테이너가 실행을 완료하고 종료됨
다음은 컨테이너 Image Status
값에 대한 설명입니다.
- no image: 컨테이너 이미지 URL이 제공되지 않음
- downloading: 컨테이너 이미지 다운로드 중
- downloaded: 컨테이너 이미지 다운로드 성공
- download failed: 컨테이너 이미지 다운로드 실패
- verified: 컨테이너 이미지 서명 검증 성공
- verification failed: 컨테이너 이미지 서명 검증 실패
- allowed without signature: 컨테이너 이미지에 대한 서명은 없지만 허용
그 밖에도 show logging -c container
명령어를 통해 다양한 이벤트 로그를 확인할 수 있습니다.

네트워크 스위치에 뭔가 애플리케이션을 설치한다는 것은 생소한 개념일지도 모릅니다.
하지만, 최근의 스위치는 CPU와 RAM, SSD 등 서버와 같은 물리적 하드웨어를 장착하고 있습니다.
스위치 내부에 직접 애플리케이션을 설치하여 외부에서의 침입이나 침해를 막고 추가적인 하드웨어 설치 비용을 절감할 수 있습니다.
다양한 컨테이너 이미지를 활용하여 보다 풍부한 네트워크 인프라를 운영해보세요.