블로그 | NGINX

NGINX Agent for Kubernetes를 사용하여 NGINX Plus의 Docker 이미지 빌드

파브리지오 피오루치 썸네일
파브리지오 피오루치
2023년 4월 18일 게시

F5 NGINX 관리 제품군은 단일 창에서 NGINX 데이터 평면을 관리하기 위한 모듈 제품군입니다. NGINX Management Suite는 NGINX 오픈 소스 및 NGINX Plus 인스턴스 관리를 간소화하여 애플리케이션 및 API의 확장, 보안, 모니터링 프로세스를 간소화합니다.

NGINX Management Suite에서 관리하려는 각 NGINX 인스턴스에 NGINX 에이전트를 설치하여 제어 평면과 원격 구성 관리를 통한 통신을 활성화해야 합니다.

베어 메탈이나 가상 머신(VM)에서 실행되는 NGINX 인스턴스의 경우 설명서에서 설치 지침을 제공합니다. 이 게시물에서는 NGINX Plus 및 NGINX Agent용 Docker 이미지를 빌드하는 방법을 보여드리며, 이를 통해 NGINX Management Suite의 적용 범위를 Kubernetes 또는 기타 마이크로서비스 인프라에 배포된 NGINX Plus 인스턴스로 확대합니다.

결과 Docker 이미지에 포함하려는 내용에 따라 세 가지 빌드 옵션이 있습니다.

[편집자 - 이 게시물은 Kubernetes에서 Docker 이미지 실행 의 1단계에서 지침 을 명확히 하고 ACM_DEVPORTAL 필드를 추가하기 위해 2023년 4월에 업데이트되었습니다.]

필수 조건

NGINX Management Suite의 Instance Manager 모듈 버전 2.8.0 이상을 지원하여 NGINX Plus와 NGINX Agent의 Docker 이미지를 만드는 데 필요한 리소스의 GitHub 저장소를 제공합니다.

Docker 이미지를 빌드하려면 다음이 필요합니다.

  • Linux 호스트(베어 메탈 또는 VM)
  • 도커 20.10+
  • 대상 Docker 이미지를 푸시할 수 있는 개인 레지스트리
  • 개발자 포털에 대한 지원을 활용하려는 경우 Instance Manager 및 API Connectivity Manager가 있는 실행 중인 NGINX Management Suite 인스턴스
  • NGINX Plus 및 선택적으로 NGINX App Protect에 대한 구독( 또는 30일 무료 평가판 )

Docker 이미지를 실행하려면 다음이 필요합니다.

  • 실행 중인 Kubernetes 클러스터
  • Kubernetes 클러스터에 액세스할 수 있는 kubectl

Docker 이미지 빌드

Docker 이미지를 빌드하려면 다음 지침을 따르세요.

  1. GitHub 저장소를 복제합니다.

    $ git clone https://github.com/nginxinc/NGINX-Demos Cloning into 'NGINX-Demos'... 
    remote: Enumerating objects: 126, done. 
    remote: Counting objects: 100% (126/126), done. 
    remote: Compressing objects: 100% (85/85), done. 
    remote: Total 126 (delta 61), reused 102 (delta 37), pack-reused 0 
    Receiving objects: 100% (126/126), 20.44 KiB | 1.02 MiB/s, done. 
    Resolving deltas: 100% (61/61), done.
    
  2. 빌드 디렉토리로 변경:

    $ cd NGINX-Demos/nginx-agent-docker/
    
  3. docker ps를 실행하여 Docker가 실행 중인지 확인한 다음 build.sh 스크립트를 실행하여 원하는 소프트웨어를 Docker 이미지에 포함합니다. 기본 옵션은 다음과 같습니다.

    • ‑C – NGINX Plus 라이선스 인증서 파일의 이름(아래 샘플 명령의 nginx-repo.crt )
    • ‑K – NGINX Plus 라이선스 키 파일의 이름(아래 샘플 명령의 nginx-repo.key )
    • ‑t – 형식의 레지스트리 및 대상 이미지

      <레지스트리_이름> / <이미지_이름> : <태그>

      (아래 샘플 명령의 registry.ff.lan:31005/nginx-plus-with-agent:2.7.0 )

    • ‑n – NGINX Management Suite 인스턴스의 기본 URL(아래 샘플 명령의 https://nim.f5.ff.lan )

    추가 옵션은 다음과 같습니다.

    • ‑d – NGINX API Connectivity Manager를 사용할 때 개발자 포털에 대한 데이터 플레인 지원 추가
    • ‑w – NGINX App Protect WAF 추가

    다양한 소프트웨어 조합에 대한 명령은 다음과 같습니다.

    • NGINX Plus 및 NGINX Agent:

      $ ./scripts/build.sh -C nginx-repo.crt -K nginx-repo.key \
      -t registry.ff.lan:31005/nginx-plus-with-agent:2.7.0 \
      -n https://nim.f5.ff.lan
      
    • NGINX Plus, NGINX Agent 및 NGINX App Protect WAF( ‑w 옵션 추가):

      $ ./scripts/build.sh -C nginx-repo.crt -K nginx-repo.key \-t registry.ff.lan:31005/nginx-plus-with-agent:2.7.0 -w \
      -n https://nim.f5.ff.lan
      
    • NGINX Plus, NGINX Agent 및 개발자 포털 지원( ‑d 옵션 추가):

      $ ./scripts/build.sh -C nginx-repo.crt -K nginx-repo.key \ -t registry.ff.lan:31005/nginx-plus-with-agent:2.7.0 -d \ 
      -n https://nim.f5.ff.lan
      

    기본 이미지에 대한 빌드 추적 샘플은 다음과 같습니다. 마지막에 나오는 빌드 완료 메시지는 빌드가 성공적으로 완료되었음을 나타냅니다.

    $ ./scripts/build.sh -C nginx-repo.crt -K nginx-repo.key -t registry.ff.lan:31005/nginx-plus-with-agent:2.7.0 -n https://nim.f5.ff.lan => Target docker image is nginx-plus-with-agent:2.7.0 
    [+] Building 415.1s (10/10) FINISHED 
    => [internal] load build definition from Dockerfile
    => transferring dockerfile: 38B
    => [internal] load .dockerignore 
    => transferring context: 2B 
    => [internal] load metadata for docker.io/library/centos:7
    => [auth] library/centos:pull token for registry-1.docker.io
    => CACHED [1/4] FROM docker.io/library /centos:7@sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4
    => [internal] load build context 
    => transferring context: 69B 
    => [2/4] RUN yum -y update  && yum install -y wget ca-certificates epel-release curl  && mkdir -p /deployment /etc/ssl/nginx  && bash -c 'curl -k $NMS_URL/install/nginx-agent | sh' && echo "A  299.1s 
    => [3/4] COPY ./container/start.sh /deployment/
    => [4/4] RUN --mount=type=secret,id=nginx-crt,dst=/etc/ssl/nginx/nginx-repo.crt  --mount=type=secret,id=nginx-key,dst=/etc/ssl/nginx/nginx-repo.key  set -x  && chmod +x /deployment/start.sh &  102.4s  
    => exporting to image 
    => exporting layers 
    => writing image sha256:9246de4af659596a290b078e6443a19b8988ca77f36ab90af3b67c03d27068ff 
    => naming to registry.ff.lan:31005/nginx-plus-with-agent:2.7.0 
    => Build complete for registry.ff.lan:31005/nginx-plus-with-agent:2.7.0
    

    Kubernetes에서 Docker 이미지 실행

    다음 지침에 따라 배포 매니페스트를 준비하고 Kubernetes에서 NGINX Agent로 NGINX Plus를 시작하세요.

    1. 선호하는 텍스트 편집기를 사용하여 manifests/1.nginx-with-agent.yaml을 열고 다음과 같이 변경합니다(코드 조각에는 변경 가능하거나 변경해야 하는 기본값이 주황색으로 강조 표시되어 있음).

      • spec.template.spec.containers 섹션에서 기본 이미지 이름( your.registry.tld/nginx-with-nim2-agent:tag )을 Docker 이미지 빌드 3단계에서 ‑t 옵션으로 지정한 Docker 이미지 이름(이 경우, registry.ff.lan:31005/nginx-plus-with-agent:2.7.0 )으로 바꿉니다.

        spec:
          ...
          template:
            ...    
            spec:
              containers:
              - name: nginx-nim
                image: your.registry.tld/nginx-with-nim2-agent:tag
        
      • spec.template.spec.containers.env 섹션에서 표시된 각 이름 에 대한 필드에 다음과 같이 대체합니다.

        • NIM_HOST – (필수) 기본값( nginx-nim2.nginx-nim2 )을 NGINX Management Suite 인스턴스의 FQDN 또는 IP 주소(이 경우 nim2.f5.ff.lan )로 바꿉니다.
        • NIM_GRPC_PORT – (선택 사항) 기본값을 교체합니다.443 ) gRPC 트래픽에 대해 다른 포트 번호를 사용합니다.
        • NIM_INSTANCEGROUP – (선택 사항) 기본값( lab )을 NGINX Plus 인스턴스가 속한 인스턴스 그룹으로 바꿉니다.
        • NIM_TAGS – (선택 사항) 기본값( preprod,devops )을 NGINX Plus 인스턴스의 태그 목록(쉼표로 구분)으로 바꿉니다.
        spec:
          ...
          template:
            ...    
          spec:
            containers:
              ...
              env:
                - name: NIM_HOST
                ...
                  value: "nginx-nim2.nginx-nim2"
                - name: NIM_GRPC_PORT
                  value: "443"
                - name: NIM_INSTANCEGROUP
                  value: "lab"
                - name: NIM_TAGS
                  value: "preprod,devops"
        
      • 또한 spec.template.spec.containers.env 섹션에서 표시된 조건이 적용되는 경우 다음 이름 - 필드 쌍의 주석 처리를 제거합니다.

        • NIM_WAFNIM_WAF_PRECOMPILED_POLICIES – NGINX App Protect WAF가 이미지에 포함되어 있습니다( Docker 이미지 빌드 의 3단계에서 -w 옵션을 포함했습니다). 따라서 값은 "true" 입니다.
        • ACM_DEVPORTAL – App Connectivity Manager 개발자 포털에 대한 지원이 이미지에 포함되어 있습니다( Docker 이미지 빌드 의 3단계에서 -d 옵션을 포함했습니다). 따라서 값은 "true" 입니다.
        spec:
          ...
          template:
            ...    
          spec:
            containers:
              ...
              env:
                - name: NIM_HOST
                ...
                #- name: NAP_WAF
                #  value: "true"
                #- name: NAP_WAF_PRECOMPILED_POLICIES
                #  value: "true"
                ...
                #- name: ACM_DEVPORTAL
                #  value: "true"
        
    2. 지정된 대로 nginxwithAgentStart.sh 스크립트를 실행하여 매니페스트를 적용하고 두 개의 포드를 시작합니다( 복제본에서 지정):2 매니페스트의 사양 섹션에 있는 지침(각각 NGINX Plus 및 NGINX Agent 포함):

      $ ./scripts/nginxWithAgentStart.sh start$ ./scripts/nginxWithAgentStart.sh stop
      
    3. 두 개의 Pod가 실행 중인지 확인합니다. 각 Pod는 NGINX Plus 인스턴스와 NGINX Agent를 실행하여 NGINX Management Suite 제어 평면과 통신합니다.

      $ kubectl get pods -n nim-test  NAME                        READY  STATUS   RESTARTS  AGE 
      nginx-nim-7f77c8bdc9-hkkck  1/1    Running  0         1m 
      nginx-nim-7f77c8bdc9-p2s94  1/1    Running  0         1m
      
    4. NGINX Management Suite에서 NGINX Instance Manager GUI에 액세스하고 두 개의 NGINX Plus 인스턴스가 Online 상태로 실행 중인지 확인합니다. 이 예에서는 NGINX App Protect WAF가 활성화되어 있지 않습니다.

      NGINX Management Suite Instance Manager 버전 2.7.0의 인스턴스 개요 창 스크린샷

    시작하기

    이 게시물에서 논의된 NGINX 솔루션을 사용해보려면 오늘 30일 무료 체험판을 시작하거나 저희에게 연락하여 사용 사례에 대해 논의해 보세요 .

    NGINX Agent를 다운로드하세요. 무료이며 오픈 소스입니다.


"이 블로그 게시물에는 더 이상 사용할 수 없거나 더 이상 지원되지 않는 제품이 참조될 수 있습니다. 사용 가능한 F5 NGINX 제품과 솔루션에 대한 최신 정보를 보려면 NGINX 제품군을 살펴보세요. NGINX는 이제 F5의 일부가 되었습니다. 이전의 모든 NGINX.com 링크는 F5.com의 유사한 NGINX 콘텐츠로 리디렉션됩니다."