IBM Cloud Docs
클래식: NLB 2.0을 사용하여 DSR 로드 밸런싱 설정

클래식: NLB 2.0을 사용하여 DSR 로드 밸런싱 설정

버전 2.0 NLB는 클래식 클러스터에서만 작성할 수 있으며 VPC 클러스터에서는 작성할 수 없습니다. VPC 클러스터에서 로드 밸런싱하려면 VPC용 로드 밸런서를 사용하여 앱 노출을 참조하십시오.

포트를 노출하고 계층 4 네트워크 로드 밸런서(NLB)의 포터블 IP 주소를 사용하여 컨테이너화된 앱을 노출하십시오. 버전 2.0 NLB에 대한 자세한 정보는 NLB 2.0의 컴포넌트 및 아키텍처를 참조하십시오.

전제조건

기존 버전 1.0 NLB를 2.0으로 업데이트할 수 없습니다. 새 NLB 2.0을 작성해야 합니다. 버전 1.0 및 버전 2.0 NLB를 한 클러스터에서 동시에 실행할 수 있습니다.

NLB 2.0을 작성하려면 먼저 다음 전제조건 단계를 완료해야 합니다.

  1. NLB 2.0이 다중 구역에 있는 앱 팟(Pod)으로 요청을 전달할 수 있게 하려면 VLAN에 대한 용량 집계를 요청하는 지원 케이스를 여십시오. 이 구성 설정은 네트워크 중단 또는 가동 중단을 발생시키지 않습니다.

    1. IBM Cloud 콘솔에 로그인하십시오.
    2. 메뉴 표시줄에서 지원을 클릭하고 케이스 관리 탭을 클릭한 후 새 케이스 작성을 클릭하십시오.
    3. 케이스 필드에 다음을 입력하십시오. 주제: 네트워크 프로비저닝 하위 주제: 클래식-VLAN
    4. 설명에 Please set up the network to allow capacity aggregation on the public and private VLANs associated with my account. This is related to /docs/containers?topic=containers-loadbalancer-v2#ipvs_provision, and is needed so I can configure NLB v2.0 LoadBalancers in my Classic Kubernetes Cluster. 정보를 추가하십시오. 특정 VLAN(예: 한 클러스터의 공용 VLAN만)에서 용량 집계를 허용하려는 경우에는 설명에 해당 VLAN ID를 지정할 수 있습니다.
    5. 제출을 클릭하십시오.
  2. IBM Cloud 인프라 계정에 대해 VRF(Virtual Router Function)를 사용으로 설정하십시오. VRF를 사용으로 설정하려면 VRF 사용을 참조하십시오. VRF가 이미 사용으로 설정되었는지 확인하려면 ibmcloud account show 명령을 사용하십시오. VRF를 사용할 수 없거나 사용하지 않으려면 VLAN Spanning을 사용으로 설정하십시오. VRF 또는 VLAN Spanning이 사용으로 설정된 경우, NLB 2.0이 패킷을 계정의 다양한 서브넷으로 라우팅할 수 있습니다.

  3. Calico 사전 DNAT 네트워크 정책을 사용하여 NLB 2.0에 대한 트래픽을 관리하는 경우, 해당 정책의 spec 섹션에 applyOnForward: truedoNotTrack: true 피드를 추가하고 preDNAT: true를 제거해야 합니다. applyOnForward: true를 사용하면 Calico 정책이 캡슐화되고 전달된 상태로 트래픽에 전송됩니다. doNotTrack: true를 사용하면 작업자 노드가 연결을 추적하지 않고도 DSR을 사용하여 응답 패킷을 클라이언트에 직접 리턴할 수 있습니다. 예를 들어, 특정 IP 주소의 트래픽만 NLB IP 주소로 이동할 수 있도록 허용하기 위해 Calico 정책을 사용하는 경우 이 정책은 다음과 유사합니다.

    apiVersion: projectcalico.org/v3
    kind: GlobalNetworkPolicy
    metadata:
      name: allowlist
    spec:
      applyOnForward: true
      doNotTrack: true
      ingress:
      - action: Allow
        destination:
          nets:
          - <loadbalancer_IP>/32
          ports:
          - 80
        protocol: TCP
        source:
          nets:
          - <client_address>/32
      selector: ibm.role=='worker_public'
      order: 500
      types:
      - Ingress
    

그런 다음 다중 구역 클러스터 또는 단일 구역 클러스터에서 NLB 2.0 설정에 설명된 단계를 수행하십시오.

다중 구역 클러스터에서 NLB 2.0 설정

시작하기 전에:

  • 중요: NLB 2.0 전제조건을 완료하십시오.

  • 공용 NLB를 다중 구역에 작성하려면 하나 이상의 공용 VLAN의 각 구역에서 포터블 서브넷이 사용 가능해야 합니다. 사설 NLB를 다중 구역에 작성하려면 하나 이상의 사설 VLAN의 각 구역에서 포터블 서브넷이 사용 가능해야 합니다. 클러스터의 서브넷 구성에 있는 단계를 수행하여 서비넷을 추가할 수 있습니다.

  • Ensure that you have the 작가 or 관리자 IBM Cloud IAM service access role for the default namespace.

  • 필요한 수의 작업자 노드가 있는지 확인하십시오.

    • 클래식 클러스터: 에지 작업자 노드로 네트워크 트래픽을 제한하는 경우에는 NLB가 균등하게 배치되도록 각 구역에서 최소한 두 개의 에지 작업자 노드가 사용으로 설정되었는지 확인하십시오.
  • 클러스터 노드가 다시 로드되거나 클러스터 마스터 업데이트에 새 keepalived 이미지가 포함되면 로드 밸런서 가상 IP가 새 노드의 네트워크 인터페이스로 이동됩니다. 이러한 상황이 발생하면 로드 밸런서에 대한 지속적인 연결을 다시 설정해야 합니다. 연결을 신속하게 다시 설정하기 위해 애플리케이션에 재시도 로직을 포함시키는 것을 고려하십시오.

다중 구역 클러스터에 NLB 2.0을 설정하려면 다음을 수행하십시오.

  1. 클러스터에 앱을 배치하십시오. 구성 파일의 메타데이터 섹션에서 배치에 레이블을 추가했는지 확인하십시오. 이 사용자 정의 레이블은 앱이 실행되는 모든 팟(Pod)을 식별하여 로드 밸런싱에 포함시킵니다.

  2. 공용 또는 사설 네트워크로 노출하려는 앱에 대해 로드 밸런서 서비스를 작성하십시오.

    1. 예를 들어, myloadbalancer.yaml이라는 이름의 서비스 구성 파일을 작성하십시오.

    2. 노출하려는 앱에 대한 로드 밸런서 서비스를 정의하십시오. 구역, VLAN 및 IP 주소를 지정할 수 있습니다.

      apiVersion: v1
      kind: Service
      metadata:
        name: myloadbalancer
        annotations:
          service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: <public_or_private>
          service.kubernetes.io/ibm-load-balancer-cloud-provider-zone: "<zone>"
          service.kubernetes.io/ibm-load-balancer-cloud-provider-vlan: "<vlan_id>"
          service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: "ipvs"
          service.kubernetes.io/ibm-load-balancer-cloud-provider-ipvs-scheduler: "<algorithm>"
      spec:
       type: LoadBalancer
       selector:
         <selector_key>: <selector_value>
       ports:
        - protocol: TCP
          port: 8080
          targetPort: 8080 # Optional. By default, the `targetPort` is set to match the `port` value unless specified otherwise.
       loadBalancerIP: <IP_address>
       externalTrafficPolicy: Local
      
      service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type:
      private 또는 public 로드 밸런서를 지정하는 어노테이션입니다.
      service.kubernetes.io/ibm-load-balancer-cloud-provider-zone:
      로드 밸런서 서비스가 배치되는 구역을 지정하기 위한 어노테이션입니다. 구역을 보려면 ibmcloud ks zone ls를 실행하십시오.
      service.kubernetes.io/ibm-load-balancer-cloud-provider-vlan:
      로드 밸런서 서비스가 배치되는 VLAN을 지정하는 어노테이션입니다. VLAN을 보려면 ibmcloud ks vlan ls --zone <zone>을 실행하십시오.
      service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: "ipvs"
      버전 2.0 로드 밸런서를 지정하는 어노테이션입니다.
      service.kubernetes.io/ibm-load-balancer-cloud-provider-ipvs-scheduler:
      선택사항: 스케줄링 알고리즘을 지정하는 어노테이션입니다. 허용되는 값은 라운드 로빈의 경우 "rr" (기본값) 또는 소스 해싱의 경우 "sh". 자세한 정보는 2.0: 스케줄링 알고리즘을 참조하십시오.
      selector
      앱 배치 YAML의 spec.template.metadata.labels 섹션에서 사용한 레이블 키(<selector_key>) 및 값(<selector_value>)입니다.
      port
      서비스가 청취하는 포트입니다.
      loadBalancerIP
      선택사항: 사설 NLB를 작성하거나 공용 NLB의 특정 포터블 IP 주소를 사용하려면 사용하려는 IP 주소를 지정하십시오. IP 주소는 어노테이션에 지정한 구역 및 VLAN에 있어야 합니다. IP 주소를 지정하지 않는 경우: 클러스터가 공용 VLAN에 있으면 포터블 공인 IP 주소가 사용됩니다. 대부분의 클러스터는 공용 VLAN에 있습니다. 클러스터가 사설 VLAN에만 있는 경우, 포터블 사설 IP 주소가 사용됩니다.
      externalTrafficPolicy: Local
      Local로 설정하십시오.

      라운드 로빈 스케줄링 알고리즘을 사용하는 dal12 NLB 2.0 서비스를 만들기 위한 구성 파일 예제입니다:

      apiVersion: v1
      kind: Service
      metadata:
        name: myloadbalancer
        annotations:
          service.kubernetes.io/ibm-load-balancer-cloud-provider-zone: "dal12"
          service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: "ipvs"
          service.kubernetes.io/ibm-load-balancer-cloud-provider-ipvs-scheduler: "rr"
      spec:
        type: LoadBalancer
         selector:
           app: nginx
         ports:
          - protocol: TCP
            port: 8080
            targetPort: 8080 # Optional. By default, the `targetPort` is set to match the `port` value unless specified otherwise.
         externalTrafficPolicy: Local
      
    3. 선택사항: spec.loadBalancerSourceRanges 필드에 IP를 지정하여 제한된 범위의 IP 주소에서만 NLB 서비스를 사용할 수 있도록 하십시오. loadBalancerSourceRanges는 작업자 노드의 Iptables 규칙을 통해 클러스터의 kube-proxy에 의해 구현됩니다. 자세한 내용은 Kubernetes 설명서를 참조하세요.

    4. 클러스터에 서비스를 작성하십시오.

      kubectl apply -f myloadbalancer.yaml
      
  3. NLB 서비스가 정상적으로 작성되었는지 확인하십시오. NLB 서비스가 올바르게 작성되고 앱을 사용할 수 있으려면 몇 분 정도 걸릴 수 있습니다.

    kubectl describe service myloadbalancer
    

    CLI 출력 예:

    NAME:                   myloadbalancer
    Namespace:              default
    Labels:                 <none>
    Selector:               app=liberty
    Type:                   LoadBalancer
    Zone:                   dal10
    IP:                     172.21.xxx.xxx
    LoadBalancer Ingress:   169.xx.xxx.xxx
    Port:                   <unset> 8080/TCP
    NodePort:               <unset> 32040/TCP
    Endpoints:              172.30.xxx.xxx:8080
    Session Affinity:       None
    Events:
        FirstSeen    LastSeen    Count    From            SubObjectPath    Type     Reason                      Message
        ---------    --------    -----    ----            -------------    ----     ------                      -------
        10s            10s            1        {service-controller }      Normal CreatingLoadBalancer    Creating load balancer
        10s            10s            1        {service-controller }        Normal CreatedLoadBalancer    Created load balancer
    

    LoadBalancer Ingress IP 주소는 NLB 서비스에 지정된 포터블 IP 주소입니다.

  4. 공용 NLB를 작성한 경우 인터넷에서 앱에 액세스하십시오.

    1. 선호하는 웹 브라우저를 여십시오.

    2. NLB 및 포트의 포터블 공인 IP 주소를 입력하십시오.

      http://169.xx.xxx.xxx:8080
      
  5. 고가용성을 얻으려면 단계 2 -4를 반복하여 앱 인스턴스가 있는 각 구역에 NLB 2.0을 추가하십시오.

  6. 선택사항: NLB 서비스는 또한 서비스의 NodePort를 통해 앱을 사용할 수 있도록 합니다. NodePort는 클러스터 내의 모든 노드에 대한 모든 공인 및 사설 IP 주소에서 액세스가 가능합니다. NLB 서비스를 사용하는 동안 NodePort에 대한 트래픽을 차단하려면 네트워크 로드 밸런서(NLB) 또는 NodePort 서비스에 대한 인바운드 트래픽 제어를 참조하십시오.

그 다음에는 NLB 하위 도메인을 등록할 수 있습니다.

단일 구역 클러스터에서 NLB 2.0 설정

시작하기 전에:

  • 중요: NLB 2.0 전제조건을 완료하십시오.
  • NLB 서비스에 지정하는 데 사용 가능한 포터블 공인 또는 사설 IP 주소를 보유해야 합니다. 자세한 정보는 클러스터의 서브넷 구성을 참조하십시오.
  • Ensure that you have the 작가 or 관리자 IBM Cloud IAM service access role for the default namespace.
  • 클러스터 노드가 다시 로드되거나 클러스터 마스터 업데이트에 새 keepalived 이미지가 포함되면 로드 밸런서 가상 IP가 새 노드의 네트워크 인터페이스로 이동됩니다. 이러한 상황이 발생하면 로드 밸런서에 대한 지속적인 연결을 다시 설정해야 합니다. 연결을 신속하게 다시 설정하기 위해 애플리케이션에 재시도 로직을 포함시키는 것을 고려하십시오.

단일 구역 클러스터에 NLB 2.0 서비스를 작성하려면 다음을 수행하십시오.

  1. 클러스터에 앱을 배치하십시오. 구성 파일의 메타데이터 섹션에서 배치에 레이블을 추가했는지 확인하십시오. 이 레이블은 로드 밸런싱에 포함될 수 있도록 앱이 실행되는 모든 팟(Pod)을 식별하는 데 필요합니다.

  2. 공용 또는 사설 네트워크로 노출하려는 앱에 대해 로드 밸런서 서비스를 작성하십시오.

    1. 예를 들어, myloadbalancer.yaml이라는 이름의 서비스 구성 파일을 작성하십시오.

    2. 노출하려는 앱에 대해 로드 밸런서 2.0 서비스를 정의하십시오.

      apiVersion: v1
      kind: Service
      metadata:
        name: myloadbalancer
        annotations:
          service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: <public_or_private>
          service.kubernetes.io/ibm-load-balancer-cloud-provider-vlan: "<vlan_id>"
          service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: "ipvs"
          service.kubernetes.io/ibm-load-balancer-cloud-provider-ipvs-scheduler: "<algorithm>"
      spec:
        type: LoadBalancer
        selector:
          <selector_key>: <selector_value>
        ports:
         - protocol: TCP
           port: 8080
           targetPort: 8080 # Optional. By default, the `targetPort` is set to match the `port` value unless specified otherwise.
        loadBalancerIP: <IP_address>
        externalTrafficPolicy: Local
      
      service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type:
      private 또는 public 로드 밸런서를 지정하는 어노테이션입니다.
      service.kubernetes.io/ibm-load-balancer-cloud-provider-vlan:
      선택사항: 로드 밸런서 서비스가 배치되는 VLAN을 지정하는 어노테이션입니다. VLAN을 보려면 ibmcloud ks vlan ls --zone <zone>을 실행하십시오.
      service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: "ipvs"
      로드 밸런서 2.0을 지정하는 어노테이션입니다.
      service.kubernetes.io/ibm-load-balancer-cloud-provider-ipvs-scheduler:
      선택사항: 스케줄링 알고리즘을 지정하는 어노테이션입니다. 허용되는 값은 라운드 로빈의 경우 "rr" (기본값) 또는 소스 해싱의 경우 "sh". 자세한 정보는 2.0: 스케줄링 알고리즘을 참조하십시오.
      selector
      앱 배치 YAML의 spec.template.metadata.labels 섹션에서 사용한 레이블 키(<selector_key>) 및 값(<selector_value>)입니다.
      port
      서비스가 청취하는 포트입니다.
      loadBalancerIP
      선택사항: 사설 NLB를 작성하거나 공용 NLB의 특정 포터블 IP 주소를 사용하려면 사용하려는 IP 주소를 지정하십시오. IP 주소는 어노테이션에 지정한 VLAN에 있어야 합니다. IP 주소를 지정하지 않는 경우:
      • 클러스터가 공용 VLAN에 있는 경우 포터블 공인 IP 주소가 사용됩니다. 대부분의 클러스터는 공용 VLAN에 있습니다.
      • 클러스터가 사설 VLAN에만 있는 경우, 포터블 사설 IP 주소가 사용됩니다.
      externalTrafficPolicy: Local
      Local로 설정하십시오.
    3. 선택사항: spec.loadBalancerSourceRanges 필드에 IP를 지정하여 제한된 범위의 IP 주소에서만 NLB 서비스를 사용할 수 있도록 하십시오. loadBalancerSourceRanges는 작업자 노드의 Iptables 규칙을 통해 클러스터의 kube-proxy에 의해 구현됩니다. 자세한 내용은 Kubernetes 설명서를 참조하세요.

    4. 클러스터에 서비스를 작성하십시오.

      kubectl apply -f myloadbalancer.yaml
      
  3. NLB 서비스가 정상적으로 작성되었는지 확인하십시오. 서비스가 작성되고 앱을 사용할 수 있으려면 몇 분 정도 걸릴 수 있습니다.

    kubectl describe service myloadbalancer
    

    CLI 출력 예:

    NAME:                   myloadbalancer
    Namespace:              default
    Labels:                 <none>
    Selector:               app=liberty
    Type:                   LoadBalancer
    Location:               dal10
    IP:                     172.21.xxx.xxx
    LoadBalancer Ingress:   169.xx.xxx.xxx
    Port:                   <unset> 8080/TCP
    NodePort:               <unset> 32040/TCP
    Endpoints:              172.30.xxx.xxx:8080
    Session Affinity:       None
    Events:
        FirstSeen    LastSeen    Count    From            SubObjectPath    Type     Reason                      Message
        ---------    --------    -----    ----            -------------    ----     ------                      -------
        10s            10s            1        {service-controller }      Normal CreatingLoadBalancer    Creating load balancer
        10s            10s            1        {service-controller }        Normal CreatedLoadBalancer    Created load balancer
    

    LoadBalancer Ingress IP 주소는 NLB 서비스에 지정된 포터블 IP 주소입니다.

  4. 공용 NLB를 작성한 경우 인터넷에서 앱에 액세스하십시오.

    1. 선호하는 웹 브라우저를 여십시오.

    2. NLB 및 포트의 포터블 공인 IP 주소를 입력하십시오.

      http://169.xx.xxx.xxx:8080
      
  5. 선택사항: NLB 서비스는 또한 서비스의 NodePort를 통해 앱을 사용할 수 있도록 합니다. NodePort는 클러스터 내의 모든 노드에 대한 모든 공인 및 사설 IP 주소에서 액세스가 가능합니다. NLB 서비스를 사용하는 동안 NodePort에 대한 트래픽을 차단하려면 네트워크 로드 밸런서(NLB) 또는 NodePort 서비스에 대한 인바운드 트래픽 제어를 참조하십시오.

그 다음에는 NLB 하위 도메인을 등록할 수 있습니다.

스케줄링 알고리즘

스케줄링 알고리즘에 따라 NLB 2.0이 네트워크 연결을 앱 팟(Pod)에 지정하는 방식이 결정됩니다. 클라이언트 요청이 클러스터에 도달하면 NLB는 스케줄링 알고리즘에 따라 요청 패킷을 작업자 노드에 라우팅합니다. To use a scheduling algorithm, specify its Keepalived short name in the scheduler annotation of your NLB service configuration file: service.kubernetes.io/ibm-load-balancer-cloud-provider-ipvs-scheduler: "rr". IBM Cloud Kubernetes Service에서 지원되는 스케줄링 알고리즘은 다음 목록을 확인하십시오. 스케줄링 알고리즘을 지정하지 않으면 기본적으로 라운드 로빈 알고리즘이 사용됩니다. 자세한 내용은 Keepalived 문서를 참조하세요.

지원되는 스케줄링 알고리즘

라운드 로빈(rr)
NLB는 작업자 노드에 대한 연결을 라우팅할 때 앱 팟 (Pod) 의 목록을 순환하여 각 앱 팟 (Pod) 을 동일하게 처리합니다. 라운드 로빈은 버전 2.0 NLB의 기본 스케줄링 알고리즘입니다.
소스 해싱(sh)
NLB가 클라이언트 요청 패킷의 소스 IP 주소를 기반으로 해시 키를 생성합니다. 그런 다음, NLB는 정적으로 지정된 해시 테이블에서 해시 키를 찾아보고 해당 범위의 해시를 처리하는 앱 팟(Pod)으로 요청을 라우팅합니다. 이 알고리즘을 사용하면 특정 클라이언트의 요청이 항상 동일한 앱 팟(Pod)에 전달됩니다. Kubernetes에서는 요청이 작업자의 임의 팟(Pod)으로 전송되도록 하는 Iptables 규칙을 사용합니다. 이 스케줄링 알고리즘을 사용하려면 작업자 노드당 한 개의 앱 팟(Pod)만 배치해야 합니다. 예를 들어, 각 팟(Pod)의 레이블이 run=<app_name>인 경우 앱 배치의 spec 섹션에 다음과 같은 반친화성 규칙을 추가하십시오.
spec:
  affinity:
  podAntiAffinity:
    preferredDuringSchedulingIgnoredDuringExecution:
    - weight: 100
      podAffinityTerm:
        labelSelector:
          matchExpressions:
          - key: run
            operator: In
            values:
            - <APP_NAME>
        topologyKey: kubernetes.io/hostname

지원되지 않는 스케줄링 알고리즘

대상 해싱(dh)
패킷 대상(NLB IP 주소 및 포트)은 수신 요청을 처리하는 작업자 노드를 판별하는 데 사용됩니다. 그러나 IBM Cloud Kubernetes Service의 NLB에 대한 IP 주소와 포트는 변경되지 않습니다. NLB는 NLB가 있는 동일한 작업자 노드 내에 요청을 강제로 보존하므로, 한 작업자에 있는 앱 팟(Pod)만 모든 수신 요청을 처리합니다.
동적 연결 계수 알고리즘
다음 알고리즘은 클라이언트와 NLB 간 연결의 동적 개수에 따라 다릅니다. 그러나 DSR(Direct Service Return)로 인해 NLB 2.0 팟(Pod)이 리턴 패킷 경로에 있을 수 없으므로 NLB는 설정된 연결을 추적하지 않습니다.
  • 최소 연결(lc)
  • 지역성 기반 최소 연결(lblc)
  • 복제를 사용한 지역성 기반 최소 연결(lblcr)
  • 큐 수행 안함(nq)
  • 최단 예상 지연(seq)
가중된 팟(Pod) 알고리즘
다음 알고리즘은 가중된 앱 팟(Pod)에 따라 다릅니다. 그러나 IBM Cloud Kubernetes Service에서는 로드 밸런싱을 위해 모든 앱 팟(Pod)에 동일 가중치가 지정됩니다.
  • 가중치가 부여된 최소 연결(wlc)
  • 가중치 라운드 로빈 (wrr)