|

스위치에 컨테이너 이미지 올리기

⏱️ 예상 읽기 시간: 약 18분 (18 min read)

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)
switch(config-container-prometheus)# mount 1
switch(config-container-mount-1)# source usb /data
switch(config-container-mount-1)# destination /prometheus
switch(config-container-mount-1)# exit
switch(config-container-prometheus)# mount 2
switch(config-container-mount-2)# source usb /config
switch(config-container-mount-2)# destination /etc/prometheus
switch(config-container-mount-2)# exit
  • API 게이트웨이: 작업을 자동화하기 위한 경량 API 서버 배포.
switch(config-container-kong)# mount 1
switch(config-container-mount-1)# source usb /config
switch(config-container-mount-1)# destination /etc/kong
switch(config-container-mount-1)# exit
  • DHCP 서버: 네트워크 엣지단에 DHCP 서버 컨테이너 배포
switch(config-container-dnsmasq)# mount 1
switch(config-container-mount-1)# source usb /config
switch(config-container-mount-1)# destination /etc/dnsmasq
switch(config-container-mount-1)# exit
switch(config-container-dnsmasq)# mount 2
switch(config-container-mount-2)# source usb /leases
switch(config-container-mount-2)# destination /var/lib/dnsmasq
switch(config-container-mount-2)# exit
  • 사이트 복제: 각 위치에 서버를 배포하지 않고도 한 위치에서 다른 위치로 파일을 복사하기 위한 경량 복제 서비스 배포.
  • 테스트 서비스: 네트워크 연결성 또는 성능을 확인하기 위한 간단한 서비스입니다. (iPerf)
컨테이너 이미지 설치를 통해 갖는 이점

이 때 이러한 애플리케이션을 컨테이너 이미지로 스위치상에 구동하면 여러 이점을 가질 수가 있게 됩니다.

AOS-CX 스위치의 컨테이너는 기존 인프라를 활용하고 추가 장비의 필요성을 제거함으로써 상당한 비용 절감을 제공합니다.
이러한 설정은 불필요한 유지보수나 업데이트를 줄여 매우 유연하고 문제 해결이 용이합니다.

뿐만 아니라, 기존 서버와 달리 스위치 상의 애플리케이션은 접근이 어렵고 쉽게 제거할 수 없어 보안성이 강화됩니다.

그리고 애플리케이션을 에지에 가깝게 배치함으로써 지연 시간과 대역폭 사용량을 줄여 응답 속도를 높입니다.
스위치에 데이터를 통합하면 서버로의 불필요한 연결을 최소화하여 전체 네트워크 성능을 최적화합니다.

AOS-CX 컨테이너 아키텍처

AOS-CX 운영체제 내에는 컨테이너 이미지를 배포하고 실행하기 위한 여러 요소들이 존재합니다.

1. Docker 엔진: CX 스위치와 컨테이너 인프라간 인터페이스를 제공하는 주요 프로세스

2. 컨테이너 매니저: 컨테이너 수명 주기를 관리하는 주요 프로세스로 실행 중인 컨테이너에 로드, 시작 및 구성 전달을 담당

3. RUNc: 컨테이너 런타임은 컨테이너 실행을 담당하는 소프트웨어 구성 요소로, 기본 운영 체제 커널과 리소스를 컨테이너에 할당

4. Conainerd/containerd-shim: Containerd는 CX에서 컨테이너 수명 주기를 관리하기 위해 Docker가 사용하는 컨테이너 런타임

5. 컨테이너 네트워크 인터페이스: 컨테이너 간 및 다른 네트워크 리소스와의 통신을 보장하여 일관되고 안정적인 네트워킹을 제공

6. Docker 네트워크 브릿지 플러그인: 컨테이너 매니저로 배포된 컨테이너의 브리지 네트워크 구성을 허용

컨테이너 매니저의 역할을 Docker가 맡게 됩니다. 즉, 더 풍부하고 포괄적인 에코시스템을 활용할 수 있게 됩니다.

AOS-CX 10.16.1005에서는 Docker 25.0.2-ce 버전을 사용합니다.

Kubernetes나 Openshift와 같은 3rd Party 솔루션으로 CX의 Docker 오케스트레이션은 불가합니다.

컨테이너 네트워크 연결

컨테이너 이미지는 컨테이너 이미지에 연결된 네트워크 VRF를 통해 연결을 제공합니다.
컨테이너당 하나의 VRF만 구성할 수 있고, 추가적인 VRF를 구성하면 컨테이너 배포 실패가 일어날 수 있습니다.

CX-Device# show container
Container                 : app2
  Container status        : configuration failed
  Container status reason : container has more than one network VRF
단일 VRF를 사용하여 네트워크 연결

각 컨테이너는 자체적으로 내부 네임스페이스를 가지며, 이더넷 인터페이스(eth0)가 지정된 VRF의 일부인 컨테이너 브릿지에 연결됩니다.
이를 통해 출발지 NAT(양방향 통신 시 목적지 NAT 포함)를 사용하여 해당 환경과 외부(호스트/네트워크) 간 트래픽을 브리지할 수 있습니다.

스위치에 컨테이너 이미지 올리기 - image 33
다른 VRF를 사용하여 네트워크 연결

컨테이너가 서로 다른 VRF에 연결된 경우, 각 VRF(네트워크 네임스페이스)는 자체 컨테이너 브리지(container_br0)를 갖습니다.
각 네트워크 네임스페이스는 서로 다른 IP 서브넷을 사용합니다.

스위치에 컨테이너 이미지 올리기 - image 34

컨테이너 이미지 배포

그럼 이제 실제로 컨테이너 이미지를 배포하는 예제를 살펴보겠습니다.

컨테이너 관리자는 런칭 인프라로 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        : administratively disabled
  Manifest status         : no image
  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

AOS-CX 10.16.1005 버전부터는 컨테이너를 생성했을 때 바로 이미지를 다운로드 하지 않습니다.
만약 컨테이너를 활성화하지 않으면, CX 스위치는 이미지를 자동으로 다운로드 하지 않습니다.

switch(config)# container demo
switch(config-container-app1)# enable
switch(config-container-app1)# show container demo
  Container               : demo
  Container status        : operational
<----- Snipped ----->
환경 변수 설정

만약 컨테이너 이미지에 별도 설정이 필요한 경우라면, 환경 변수 설정도 가능합니다.

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 명령어를 통해 다양한 이벤트 로그를 확인할 수 있습니다.

컨테이너 지원 플랫폼

컨테이너 이미지를 배포하고 설치하여 운영하는 것은 모든 AOS-CX 스위치에 지원하는 것은 아닙니다.
아래 표에서 각 스위치 모델별로 지원 가능여부를 확인할 수 있습니다.

참고: CX 6300L은 지원하지 않습니다. CX 8325는 8325P와 8325H까지 포함합니다.


네트워크 스위치에 뭔가 애플리케이션을 설치한다는 것은 생소한 개념일지도 모릅니다.
하지만, 최근의 스위치는 CPU와 RAM, SSD 등 서버와 같은 물리적 하드웨어를 장착하고 있습니다.

스위치 내부에 직접 애플리케이션을 설치하여 외부에서의 침입이나 침해를 막고 추가적인 하드웨어 설치 비용을 절감할 수 있습니다.

다양한 컨테이너 이미지를 활용하여 보다 풍부한 네트워크 인프라를 운영해보세요.

유사 게시물

  • [ACP-DC 교육#8] 소규모 데이터센터를 위한 2-티어 디자인

    ⏱️ 예상 읽기 시간: 약 13분 (13 min read) 레이어 2 투-티어 디자인은 기존의 전통적인 프로토콜을 사용하기 때문에 배포, 운영, 문제 해결이 간단합니다. 오버레이 프로토콜이나 복잡한 설계에 대한 전문 지식이 없어도 다룰 수 있습니다. 이 아키텍처는 중소규모 데이터센터에 적합하지만, 더 큰 환경에서는 데이터센터 POD 단위로…

  • [ACP-DC 교육#10] VSX (2)

    ⏱️ 예상 읽기 시간: 약 8분 (8 min read) 지난 글에서는 HPE Aruba Networking AOS-CX 스위치의 가상화 기술인 VSX에 대해 알아보았습니다. VSX의 구성요소와 VSF와의 차이점, 장점 등을 설명했는데요. 오늘은 실용적인 부분들을 다뤄볼까 합니다. 실제 VSX를 활용해서 소프트웨어 라이브 업그레이드 방법이라든가 Split brain과 같은 기술을 살펴보겠습니다….

  • [ACMA 교육#7] AOS 8 라이센스 (2)

    ⏱️ 예상 읽기 시간: 약 3분 (3 min read) 지난 포스팅에서는 AOS 8에서의 라이센스 종류에 대해 살펴보았습니다. 이번에는 이 라이센스를 어떻게 관리하고 활성화 할 수 있는지 살펴보겠습니다. 라이센스 중앙 관리 AOS 8.x는 중앙 관리형 라이센스 아키텍처를 지원하여, 관리 장치(MD)그룹이 라이센스 풀을 공유합니다. 기본(Primary) 및 백업(Backup)…

  • [ACSA 교육#7] IPv4 헤더

    ⏱️ 예상 읽기 시간: 약 2분 (2 min read) 그림은 Layer 3의 패킷에 추가되는 IPv4 헤더 정보를 보여줍니다. 헤더에서 중요한 필드는 다음과 같습니다. TTL(Time To Live): 이 필드는 Layer 3에서 패킷의 무한 순환을 방지하기 위한 방법으로 데이터의 유효기간을 나타냅니다. 라우터가 잘못 설정된 경우, IP 패킷은 두…

  • [ACSA 교육#4] 트래픽의 종류

    ⏱️ 예상 읽기 시간: 약 2분 (2 min read) 오늘은 트래픽의 종류에 대해서 알아볼까 합니다.컴퓨터 통신은 세가지로 분류될 수 있습니다. Unicast Multicast Broadcast Unicast Unicast 는 일대일 통신(송신기 1대 – 수신기 1대)을 나타냅니다. 쉽게 예를 들어보면, 교실에 여러 학생이 있다고 가정해보겠습니다. 그리고 선생님이 교실 문…

  • [ACSA 교육#8] TCP 헤더

    ⏱️ 예상 읽기 시간: 약 7분 (7 min read) 지난 포스팅에서는 Layer 3 네트워크 계층에서의 IPv4 헤더에 대해서 알아보았습니다. 오늘은 전송계층, Layer 4에서 볼 수 있는 TCP와 UDP에 대해서 알아볼까 합니다. 3-Way Handshake 먼저 TCP는 애플리케이션 데이터를 처리하기 전에 먼저 목적지까지 안정적으로 데어터가 전달될 수…