네트워크 로드 밸런서(NLB) 서비스를 통해 내 앱에 연결할 수 없는 이유는 무엇입니까?

NLB(네트워크 부하 분산기) 서비스를 통해 앱에 접속할 수 없는 경우, NLB 연결 문제를 해결하십시오.

클래식 인프라

사용자가 클래식 클러스터에서 NLB 서비스를 작성하여 앱을 노출했습니다.

NLB의 공인 IP 주소를 사용하여 앱에 연결하려고 할 때 연결에 실패했거나 제한시간이 초과되었습니다.

다음과 이유 중 하나로 인해 로드 NLB가 제대로 작동하지 않을 수 있습니다.

  • 클러스터가 아직 완전히 배치되지 않았습니다.
  • NLB 서비스의 구성 스크립트에 오류가 포함되어 있습니다.

NLB 서비스의 고가용성을 보장할 수 있도록 2개 이상의 작업자 노드가 있으며 완전히 배치된 표준 클러스터를 설정했는지 확인하십시오.

  1. 작업자 노드를 나열하십시오. CLI 출력에서 작업자 노드의 상태준비가 표시되고 머신 유형무료 이외의 특성이 표시되는지 확인하십시오.

    ibmcloud ks worker ls --cluster CLUSTER_NAME_OR_ID
    
  2. 버전 2.0 NLB의 경우: NLB 2.0 전제조건을 완료했는지 확인하십시오.

  3. NLB 서비스의 구성 파일이 정확한지 확인하십시오.

    • 버전 2.0 NLB
        apiVersion: v1
        kind: Service
        metadata:
          name: myservice
          annotations:
            service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: "ipvs"
        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.
          externalTrafficPolicy: Local
        ```
        1. **LoadBalancer**를 서비스 유형으로 정의했는지 확인하십시오.
        2. `service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: "ipvs"` 어노테이션을 포함했는지 확인하십시오.
        3. LoadBalancer 서비스의 `spec.selector` 섹션에서 `<selector_key>`  `<selector_value>`가 배치 YAML의 `spec.template.metadata.labels` 섹션에서 사용한 키/값 쌍과 동일한지 확인하십시오. 레이블이 일치하지 않으면 LoadBalancer 서비스의 ** Endpoints** 섹션에 `<none>`이 표시되며 인터넷에서 사용자의 앱에 액세스할  없습니다.
        4. 앱에서 청취하는 **port**를 사용했는지 확인하십시오.
        5. `externalTrafficPolicy`를 `Local`로 설정했는지 확인하십시오.
    
    * 버전 1.0 NLB
    
    ```yaml {: screen}
        apiVersion: v1
        kind: Service
        metadata:
          name: myservice
        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.
        ```
        1. **LoadBalancer**를 서비스 유형으로 정의했는지 확인하십시오.
        2. LoadBalancer 서비스의 `spec.selector` 섹션에서 `<selector_key>`  `<selector_value>`가 배치 YAML의 `spec.template.metadata.labels` 섹션에서 사용한 키/값 쌍과 동일한지 확인하십시오. 라벨이 일치하지 않으면 LoadBalancer 서비스의 **‘엔드포인트(Endpoints)**  섹션에 **‘없음(none)’으로** 표시되며, 인터넷을 통해 앱에 접속할  없습니다.
        3. 앱에서 청취하는 **port**를 사용했는지 확인하십시오.
    
    
  4. 선택 서비스를 확인하고 Events 섹션을 검토하여 잠재적 오류를 찾으십시오.

    kubectl describe service <myservice>
    

    다음 오류 메시지를 찾으십시오.

하나의 노드가 있는 클러스터는 NodePort 유형의 서비스를 사용해야 합니다.
NLB 서비스를 사용하려면 두 개 이상의 작업자 노드가 있는 표준 클러스터가 있어야 합니다.
NLB 서비스 요청을 이행하는 데 사용할 수 있는 클라우드 제공자 IP가 없습니다. 클러스터에 포터블 서브넷을 추가하고 다시 시도하십시오.
이 오류 메시지는 NLB 서비스에 할당할 수 있는 이동식 공용 IP 주소가 더 이상 남아 있지 않음을 나타냅니다. 클러스터의 포터블 공인 IP 주소를 요청하는 방법에 대한 정보는 클러스터에 서브넷 추가를 참조하십시오. 포터블 공인 IP 주소를 클러스터에 사용할 수 있게 되면 NLB 서비스가 자동으로 작성됩니다.
요청된 클라우드 제공자 IP <cloud-provider-ip>를 사용할 수 없습니다. 다음 클라우드 제공자 IP를 사용할 수 있습니다. <available-cloud-provider-ips>
loadBalancerIP 섹션을 사용하여 로드 밸런서 YAML의 포터블 공인 IP 주소를 정의했지만 이 포터블 공인 IP 주소는 포터블 공용 서브넷에서 사용할 수 없습니다. 구성 스크립트의 loadBalancerIP 섹션에서 기존 IP 주소를 삭제하고, 사용 가능한 휴대용 공용 IP 주소 중 하나를 추가하십시오. 사용 가능한 포터블 공인 IP 주소를 자동으로 할당할 수 있도록 스크립트에서 loadBalancerIP 섹션을 제거할 수도 있습니다.
NLB 서비스에 사용 가능한 노드가 없음
NLB 서비스를 배치하기에 충분한 작업자 노드가 없습니다. 그 이유 중 하나는 작업자 노드가 두 개 이상인 표준 클러스터를 배치했지만 작업자 노드의 프로비저닝에 실패했기 때문일 수 있습니다.
  1. kubectl get nodes를 실행하여 사용 가능한 작업자 노드를 나열하십시오.
  2. 두 개 이상의 사용 가능한 작업자 노드가 있는 경우 ibmcloud ks worker get --cluster <cluster_name_or_ID> --worker <worker_ID>를 실행하여 작업자 노드 세부사항을 나열하십시오.
  3. kubectl get nodesibmcloud ks worker get 명령에서 리턴된 작업자 노드의 공인 및 사설 VLAN ID가 일치하는지 확인하십시오.
  1. 사용자 정의 도메인을 사용하여 로드 밸런서 서비스에 연결하는 경우 사용자 정의 도메인이 NLB 서비스의 공인 IP 주소에 맵핑되었는지 확인하십시오.
    1. NLB 서비스의 공인 IP 주소를 찾으십시오.
        kubectl describe service <service_name> | grep "LoadBalancer Ingress"
        ```
    2. 사용자 정의 도메인이 포인터 레코드(PTR)에 있는 NLB 서비스의 포터블 공인 IP 주소에 맵핑되었는지 확인하십시오.