NetScaler CPX를 사용하여 Kubernetes 환경에서 수신 트래픽 부하 분산

2017년 10월 5일

Kubernetes 환경에서 Kubernetes 서비스의 수신 트래픽 부하를 분산하려면 수신 리소스와 수신 컨트롤러가 필요합니다. 수신 리소스는 Kubernetes 서비스의 부하 분산을 구성할 수 있는 Kubernetes 리소스입니다. 부하 분산 장치는 서비스를 위해 외부에 연결할 수 있는 URL을 제공하여 Kubernetes 클러스터 밖에 있는 클라이언트에 서비스를 노출시키고 이러한 URL로 전송되는 트래픽의 부하를 분산합니다. NetScaler CPX는 Kubernetes 환경에서 수신 부하 분산 장치를 사용하여 Kubernetes 클러스터 외부의 클라이언트에 의해 발생하는 Kubernetes 서비스에 대한 종적 트래픽 부하를 분산할 수 있습니다.

수신 컨트롤러에는 Kubernetes와 부하 분산 장치가 통합되어 있습니다. 이 컨트롤러는 Kubernetes API를 통해 수신 리소스를 모니터링하고 확장, 업데이트 롤링 또는 메타데이터 변경으로 인해 서비스에 어떠한 변화가 발생하는 경우 부하 분산 장치의 구성을 업데이트합니다. NetScaler MAS(Management and Analytics System)는 Kubernetes 환경용 NetScaler 수신 컨트롤러를 포함하고 있습니다. Kubernetes 클러스터에 배포된 NetScaler CPX 인스턴스와 수신 컨트롤러를 사용하여 Kubernetes 환경의 수신 트래픽을 처리할 수 있습니다. NetScaler MAS에 대한 자세한 내용은 NetScaler Management and Analytics System 제품 설명서를 참조하십시오.

Kubernetes의 수신 리소스와 컨트롤러에 대한 자세한 내용은 수신 리소스를 참조하십시오.

NetScaler 수신 컨트롤러의 작동 방법

Kubernetes 클러스터를 배포한 후에는 NetScaler MAS에서 Kubernetes 환경 세부 정보를 제공해 NetScaler MAS와 클러스터를 통합해야 합니다. NetScaler MAS는 서비스, 포드, 수신 규칙 등 Kubernetes 리소스의 변경 사항을 모니터링합니다.

Kubernetes 클러스터에 수신 리소스로 NetScaler CPX 인스턴스를 배포하면 자동으로 NetScaler MAS를 함께 등록합니다. 등록 프로세스의 일부로 NetScaler MAS는 NITRO REST API를 사용하여 NetScaler 관련 구성을 구성하기 위해 인스턴스에 연결할 포트와 NetScaler CPX 인스턴스 IP 주소에 대한 정보를 파악합니다.

NetScaler MAS의 Stylebook 엔진은 NetScaler MAS가 서비스, 포드, 수신 규칙 등 Kubernetes에서 수집하는 모든 정보를 처리합니다. Stylebook 엔진은 기존에 프로비저닝된 Stylebook(com.citrix.adc.stylebooks/1.0/cs-lb-mon)을 사용하여 부하 분산에 필요한 가상 서버, 서비스 및 서비스 그룹과 같은 NetScaler 구성을 생성하고 NetScaler CPX 수신 부하 분산 장치에 해당 구성을 적용합니다. StyleBook에 대한 자세한 내용은 Stylebook을 참조하십시오.

다음 다이어그램은 Kubernetes 환경을 보여주며, 수신 트래픽을 처리하기 위해 Kubernetes 클러스터의 NetScaler CPX 수신 리소스와 통합된 NetScaler 수신 컨트롤러가 포함되어 있습니다.

지역화된 이미지

이 예에서는 VIP(가상 IP) 주소를 통해 클러스터 외부로부터 Kubernetes 서비스로 들어오는 트래픽의 부하 분산을 위해 NetScaler CPX 컨테이너가 배포되었습니다. NetScaler CPX 컨테이너는 A 및 B 서비스를 구성하는 여러 Kubernetes 포드 간 요청을 분산시켜 종적 트래픽의 부하를 분산합니다.

중요

NetScaler CPX 호스트 IP 주소를 사용하여 NetScaler CPX 컨테이너로 트래픽을 보내기 위해 도메인 api.example.com에 대한 DNS 구성이 구성되었습니다. 수신 부하 분산 장치로 여러 개의 NetScaler CPX 컨테이너가 구성된 경우 DNS 방법을 사용하여 NetScaler CPX 컨테이너에 걸쳐 수신 트래픽이 분산되도록 하십시오.

NetScaler MAS는 Kubernetes 클러스터에 있는 NetScaler 장치를 관리하고 장치에 대한 풍부한 분석을 통해 통찰력과 문제 해결을 제공합니다. 또한 NetScaler 장치에서 상세한 트래픽 통계를 수집하여 응용 프로그램 성능과 보안에 대한 가시성을 제공합니다.

Kubernetes 환경에서 수신 부하 분산 장치로 NetScaler CPX 배포

NetScaler CPX는 Kubernetes 환경을 위한 수신 부하 분산 장치로 사용될 수 있습니다. 클러스터 내 노드에서 Kubernetes 포드로 NetScaler CPX 컨테이너를 배포하거나, 클러스터 외부의 호스트가 다른 Kubernetes 노드로서 동일한 오버레이 네트워크에 참여하는 경우 해당 호스트에 이 컨테이너를 배포할 수 있습니다.

사전 요구 사항

시작하기 전에 다음을 수행하십시오.

  • Kubernetes 클러스터를 만듭니다. 자세한 내용은 http://kubernetes.io/docs/을 참조하십시오.
  • NetScaler MAS를 배포합니다. NetScaler MAS를 배포하는 방법에 대한 자세한 내용은 http://docs.citrix.com/ko-kr/netscaler-mas/11-1/single-server-deployment.html를 참조하십시오.
  • NetScaler MAS에 Kubernetes 클러스터를 구성합니다. 지침은Kubernetes 환경의 수신 컨트롤러로 NetScaler MAS 사용.
  • NetScaler MAS 서버의 지문을 확인합니다. 지문을 얻으려면 다음을 수행하십시오.
    1. NetScaler MAS에 로그인합니다.
    2. System(시스템) > System Administration(시스템 관리)으로 이동하고 View SSL Certificate(SSL 인증서 보기)을 클릭합니다.
    3. Certificate Details(인증서 세부 정보) 페이지의 Fingerprint(지문) 필드에서 NetScaler MAS 서버의 지문을 복사합니다.

지역화된 이미지

Kubernetes 클러스터 외부에 수신 부하 분산 장치로 NetScaler CPX 배포

NetScaler CPX는 Kubernetes 클러스터 외부에 수신 부하 분산 장치로 배포될 수 있습니다. 클러스터 외부에 있는 호스트는 다른 Kubernetes 노드로서 동일한 오버레이 네트워크에 참여해야 합니다.

NetScaler CPX를 Kubernetes 클러스터 외부에 있는 호스트의 수신 부하 분산 장치로 배포하려면, 호스트에서 다음 docker run 명령을 사용하여 Docker 컨테이너에 NetScaler CPX 인스턴스를 배포합니다.

docker run -dt --privileged=true -p <port_number> -e NS_HTTP_PORT=<netscaler_HTTP_port> -e NS_HTTPS_PORT=<netscaler_HTTPS_port> -e EULA=yes -e NS_MGMT_SERVER=<MAS_IP_address> -e NS_MGMT_FINGER_PRINT="<MAS_finger_print>" -e NS_ROUTABLE=<True|False> -e NS_LB_ROLE=<lb_role> -e HOST=$HOSTNAME store/citrix/netscalercpx:12.0-53.6

예:

docker run -dt --privileged=true -p 5080:80 -p 5443:443 -p 80:5080 -e NS_HTTP_PORT=5080 -p 443:5443 -e NS_HTTPS_PORT=5443 -e EULA=yes -e NS_MGMT_SERVER=10.217.212.226 -e NS_MGMT_FINGER_PRINT="74:EA:04:90:2C:FA:BF:7A:31:C9:52:64:D3:9C:BC:D3:O8:9F:9A:O4" -e NS_ROUTABLE=FALSE -e NS_LB_ROLE=SERVER -e HOST=$HOSTNAME store/citrix/netscalercpx:12.0-53.6

이 명령은 NetScaler CPX Docker 컨테이너를 배포합니다. 다음 표는 docker run 명령에서 사용된 다양한 옵션과 환경 변수에 대한 설명입니다.

옵션 및 NetScaler CPX 관련 환경 변수 설명
-dt NetScaler CPX 컨테이너가 디먼 실행되도록 지정합니다.
–privileged=true NetScaler CPX 컨테이너가 권한 있는 모드에서 실행되도록 지정합니다.
-p NetScaler CPX와 호스트 간 포트를 매핑합니다. 기본적으로 Kubernetes 수신 개체는 클러스터가 포트 80 및 443을 사용하여 액세스하는 것으로 가정합니다.
-p 5080:80 컨테이너의 포트 80과 호스트의 포트 5080을 바인딩합니다.
-p 5443:443 컨테이너의 포트 443과 호스트의 포트 5443을 바인딩합니다.
-p 443:5443 컨테이너의 포트 5443과 호스트의 포트 443을 바인딩합니다.
-p 80:5080 컨테이너의 포트 5080과 호스트의 포트 80을 바인딩합니다.
-e NS_HTTP_PORT 또는 -e NS_HTTPS_PORT NetScaler CPX에 대한 관리 액세스를 위해 사용자 지정 포트를 할당할 수 있게 해주는 NetScaler CPX 관련 환경 변수입니다. NetScaler MAS는 이러한 포트를 사용해 NetScaler CPX에 액세스합니다.
-e NS_MGMT_SERVER NetScaler MAS 서버 IP 주소를 정의할 수 있게 해주는 NetScaler CPX 관련 환경 변수입니다. NetScaler CPX가 배포되면 자동으로 이 IP 주소를 사용하여 NetScaler MAS 서버와 함께 등록합니다.
-e NS_MGMT_FINGER_PRINT NetScaler MAS 지문을 정의하는 NetScaler CPX 관련 환경 변수입니다.
-e NS_ROUTABLE=FALSE NetScaler CPX 컨테이너가 non-IP-per-container 모드에서 실행되도록 지정하는 NetScaler CPX 관련 환경 변수입니다.
-e NS_LB_ROLE=SERVER NetScaler CPX 컨테이너가 수신 리소스로 사용되도록 NetScaler CPX와 NetScaler MAS에 지정하는 NetScaler CPX 관련 환경 변수입니다.
-e HOST=$HOSTNAME NetScaler MAS가 NetScaler CPX 컨테이너에 액세스하는 데 사용할 수 있는 호스트 이름을 지정하는 NetScaler CPX 관련 환경 변수입니다. 호스트 이름이 NetScaler MAS에 의해 확인될 수 있도록 하고, 그렇지 않은 경우 IP 주소를 제공하십시오.

호스트에 NetScaler CPX 인스턴스를 배포하면 자동으로 NetScaler MAS(Management and Analytics System)와 함께 등록합니다. NetScaler MAS UI에 배포된 NetScaler CPX 인스턴스는 Networks(네트워크) > Instances(인스턴스) > NetScaler CPX에서 볼 수 있습니다.

지역화된 이미지

Kubernetes 클러스터 내에 수신 부하 분산 장치로 NetScaler CPX 배포

Kubernetes 클러스터 내에 수신 부하 분산 장치로 NetScaler CPX를 배포하려면 Kubernetes 클러스터에 있는 노드에 Kubernetes 포드로 배포하십시오.

Kubernetes 클러스터 내에 수신 부하 분산 장치로 NetScaler CPX 배포 1. (선택 사항) 클러스터의 특정 노드에 Kubernetes 포드로 NetScaler CPX를 배포하려는 경우 레이블을 사용하여 노드를 지정할 수 있습니다. Kubernetes 노드에 레이블을 지정하려면 kubectl 명령을 사용합니다.

kubectl label nodes <node_IP_address> node-role=<label_name>



예:

kubectl label nodes 10.217.222.224 node-role=ingress

    노드에 레이블을 지정했으면 포드 사양에 레이블을 지정하여 포드를 노드에 배포할 수 있습니다. 2. NetScaler CPX의 포드 사양을 정의하여 NetScaler CPX 컨테이너를 Kubernetes 클러스터의 포드로 배포합니다. 포드 사양은 YAML 파일 또는 JSON 스크립트로 정의됩니다. YAML 파일 또는 JSON 스크립트에는 컨테이너 유형, CPX 이미지 파일 이름, NetScaler MAS 서버 IP 주소 및 NetScaler MAS 서버 지문이 포함되어야 합니다. 다음은 NetScaler CPX의 포드 사양 예입니다.

    apiVersion: v1
    kind: Pod
    metadata:
    name: cpx-ingress
    annotations:
        NETSCALER_AS_APP: "True"
    spec:
        containers:
            - name: cpx-ingress
              image: "cpx:12.0-41.16"
        securityContext:
            privileged: true
        env:
            - name: "EULA"
              value: "yes"
            - name: "NS_MGMT_SERVER"
              value: "10.217.212.226"
            - name: "NS_MGMT_FINGER_PRINT"
              value: "74:EA:04:90:2C:FA:BF:7A:31:C9:52:64:D3:9C:BC:D3:O8:9F:9A:O4"
            - name: "NS_ROUTABLE"
              value: "FALSE"
            - name: "NS_HTTP_PORT"
              value: "5080"
            - name: "NS_HTTPS_PORT"
              value: "5443"
            - name: "NS_LB_ROLE"
              value: "SERVER"
            - name: "HOST"
              value: ""
            - name: "KUBERNETES_TASK_ID"
        valueFrom:
        fieldRef:
        fieldPath: metadata.name
            - name:"HOST"
    valueFrom:
        fieldRef:
            fieldPath: spec.nodeName
        ports:
            - containerPort: 80
              hostPort: 5080
            - containerPort: 443
              hostPort: 5443
            - containerPort: 5080
              hostPort: 80
            - containerPort: 5443
              hostPort: 443
        imagePullPolicy: Always
        nodeSelector:
            node-role: ingress

또는 포드 사양을 정의하여 NetScaler CPX를 복제 컨트롤러로 배포할 수 있습니다. 이렇게 하면 NetScaler CPX가 중단되는 경우 Kubernetes가 클러스터에 NetScaler CPX 컨테이너를 다시 만듭니다. 다음은 샘플 사양입니다.

    apiVersion: v1
    kind: ReplicationController
    metadata:
    name: cpx-ingress
    spec:
        replicas: 1
        selector:
            app: cpx-ingress-device
        template:
        metadata:
            name: cpx-ingress
        annotations:
            NETSCALER_AS_APP: "True"
        labels:
            app: cpx-ingress-device
        spec:
            containers:
                - name: cpx-ingress
                image: "cpx:12.0-41.16"
            securityContext:
                privileged: true
            env:
                - name: "EULA"
                value: "yes"
                - name: "NS_MGMT_SERVER"
                value: "10.217.212.226"
                - name: "NS_MGMT_FINGER_PRINT"
                value: "74:EA:04:90:2C:FA:BF:7A:31:C9:52:64:D3:9C:BC:D3:O8:9F:9A:O4"
                - name: "NS_ROUTABLE"
                value: "FALSE"
                - name: "NS_HTTP_PORT"
                value: "5080"
                - name: "NS_HTTPS_PORT"
                value: "5443"
                - name: "NS_LB_ROLE"
                value: "SERVER"
                - name: "HOST"
                value: ""
                - name: "KUBERNETES_TASK_ID"
        valueFrom:
        fieldRef:
        fieldPath: metadata.name
            - name:"HOST"
    valueFrom:
        fieldRef:
            fieldPath: spec.nodeName
        ports:
            - containerPort: 80
            hostPort: 5080
            - containerPort: 443
            hostPort: 5443
            - containerPort: 5080
            hostPort: 80
            - containerPort: 5443
            hostPort: 443
        imagePullPolicy: Always
        nodeSelector:
            node-role: ingress

다음 표는 위에 나온 예에서 사용된 섹션, 매개 변수 및 환경 변수에 대해 설명합니다.

섹션 매개 변수 설명
containers name NetScaler CPX 컨테이너의 이름입니다.
  image 컨테이너 생성을 위한 이미지를 지정합니다.
securityContext privileged: true NetScaler CPX 컨테이너가 권한 있는 모드에서 실행되도록 지정합니다.
env name: “EULA” NetScaler CPX 관련 환경 변수로서 https://www.citrix.com/products/netscaler-adc/cpx-express.html에 있는 EULA(최종 사용자 사용권 계약)를 읽고 이해했음을 확인하는 데 필요합니다.
  name: “NS_MGMT_SERVER” NetScaler MAS 서버 IP 주소를 정의할 수 있게 해주는 NetScaler CPX 환경 변수입니다. NetScaler CPX가 배포되면 자동으로 이 IP 주소를 사용하여 NetScaler MAS 서버와 함께 등록합니다.
  name: “NS_MGMT_FINGER_PRINT” NetScaler MAS 지문을 정의할 수 있게 해주는 NetScaler CPX 환경 변수입니다.
  name: “NS_ROUTABLE” NetScaler CPX 컨테이너가 non-IP-per-container 모드에서 실행할 수 있게 해주는 NetScaler CPX 환경 변수입니다. 값을 “FALSE”로 설정하십시오.
  name: “NS_HTTP_PORT” 또는 name: “NS_HTTPS_PORT” NetScaler CPX에 대한 관리 액세스를 위해 사용자 지정 포트를 할당할 수 있게 해주는 NetScaler CPX 관련 환경 변수입니다. NetScaler MAS는 이러한 포트를 사용해 NetScaler CPX 컨테이너에 액세스합니다.
  name: “NS_LB_ROLE” NetScaler CPX 컨테이너가 수신 리소스로 사용되도록 NetScaler CPX와 NetScaler MAS에 지정하는 NetScaler CPX 환경 변수입니다.
  name: “HOST” NetScaler CPX 컨테이너가 실행 중인 노드의 호스트 이름입니다. 호스트 이름을 사용하여 NetScaler MAS가 NetScaler CPX 컨테이너에 액세스할 수 있습니다.
  name: “KUBERNETES_TASK_ID” Kubernetes 클러스터에서 NetScaler CPX ID를 식별합니다.
  name: “HOST” NetScaler CPX 컨테이너가 실행 중인 노드의 호스트 이름입니다. 호스트 이름을 사용하여 NetScaler MAS가 NetScaler CPX에 액세스할 수 있습니다.
포트 containerPort: 또는 hostPort: NetScaler CPX 컨테이너와 호스트 간 포트를 매핑합니다. 기본적으로 Kubernetes 수신 개체는 클러스터가 포트 80 및 443에서 액세스하는 것으로 가정합니다.
imagePullPolicy   Kubernetes가 이미지를 가져오는 방법을 지정합니다.
nodeSelector node-role: 포드를 배포하려는 노드의 레이블입니다.

3. 다음 명령을 사용하여 NetScaler CPX의 포드 사양을 배포합니다.

kubectl create –f  (fileName | scriptName)

예:

kubectl create –f sample.yaml

호스트에 NetScaler CPX 인스턴스를 배포하면 자동으로 NetScaler MAS(Management and Analytics System)와 함께 등록합니다. NetScaler MAS UI에 배포된 NetScaler CPX 인스턴스는 Networks(네트워크) > Instances(인스턴스) > NetScaler CPX에서 볼 수 있습니다.

지역화된 이미지

NetScaler CPX를 사용하여 Kubernetes 환경에서 수신 트래픽 부하 분산