ALB Ingress Controller 설정
    • PDF

    ALB Ingress Controller 설정

    • PDF

    Article Summary

    VPC 환경에서 이용 가능합니다.

    ALB Ingress Controller를 통해 Kubernetes Ingress를 Load Balancer와 연동하여 트래픽을 라우팅할 수 있습니다.

    Kubernetes 시스템에서 Ingress가 생성되면 ALB Ingress Controller는 Ingress에 설정된 값을 활용하여 Load Balancer 인스턴스를 생성합니다. 인스턴스가 생성되면 Ingress Rule에서 설정한 Service의 노드 포트를 포트 값으로 사용하여 타깃 그룹을 생성하고 인스턴스에 등록합니다.

    주의

    Kubernetes에서 생성한 네이버 클라우드 플랫폼의 로드밸런서를 Kubernetes의 Ingress 리소스가 아닌 콘솔 및 API를 통해 설정하시는 경우, 상태 동기화에 문제가 발생할 수 있습니다. 생성된 로드밸런서에 대한 설정 변경은 반드시 Kubernetes에서 생성된 Ingress 리소스 수정을 통해 이루어져야 합니다.

    ALB Ingress Controller 설치

    클러스터에 ALB Ingress Controller를 설치한 후 준비하는 방법은 다음과 같습니다.

    1. 아래 리전에 해당하는 명령어를 실행하여 ALB Ingress Controller를 설치해 주십시오.

      • kube-system Namespace에 alb-ingress-controller가 생성되며, 필요한 ServiceAccount, ClusterRole, ClusterRoleBinding, IngressClass 가 함께 생성됩니다.
      • 한국

        kubectl --kubeconfig=$KUBE_CONFIG apply -f https://raw.githubusercontent.com/NaverCloudPlatform/nks-alb-ingress-controller/main/docs/install/pub/install.yaml
        
        • Kubernetes 1.19 버전 미만인 경우 https://raw.githubusercontent.com/NaverCloudPlatform/nks-alb-ingress-controller/v0.3.1/docs/install/pub/install.yaml 을 설치해 주십시오.
      • 싱가포르

        kubectl --kubeconfig=$KUBE_CONFIG apply -f https://raw.githubusercontent.com/NaverCloudPlatform/nks-alb-ingress-controller/main/docs/install/pub-sg/install.yaml
        
        • Kubernetes 1.19 버전 미만인 경우 https://raw.githubusercontent.com/NaverCloudPlatform/nks-alb-ingress-controller/v0.3.1/docs/install/pub-sg/install.yaml 을 설치해 주십시오.
      • 일본

        kubectl --kubeconfig=$KUBE_CONFIG apply -f https://raw.githubusercontent.com/NaverCloudPlatform/nks-alb-ingress-controller/main/docs/install/pub-jp/install.yaml
        
        • Kubernetes 1.19 버전 미만인 경우 https://raw.githubusercontent.com/NaverCloudPlatform/nks-alb-ingress-controller/v0.3.1/docs/install/pub-jp/install.yaml 을 설치해 주십시오.
    2. Ingress의 리소스에 spec.ingressClassName: alb 필드를 추가해 주십시오.

      • Kubernetes 1.19 버전 미만인 경우에는 kubernetes.io/ingress.class: alb 어노테이션을 추가해 주십시오.

    ALB Ingress Controller 설정 및 어노테이션

    ALB Ingress Controller 기본 설정

    ALB Ingress Controller의 기본 설정에 대한 설명은 아래와 같습니다.

    • Service type: NodePort
      Ingress를 통해 노출시킬 Service는 모두 NodePort type으로 생성하여야 합니다.
    • Default Rule
      Default Rule은 매칭되는 Rule이 없을 때 적용되는 Rule이며, spec.defaultBackend에 설정할 수 있습니다.
      별도의 ruleuse-annotation 설정은 불가능하며, 설정하지 않았을 경우 80 포트로 설정된 기본 타깃 그룹이 생성됩니다.
    • Rule Priority
      Ingress에서 정의한 Rule의 순서에 따라 우선 순위가 결정됩니다. 가장 위에 있는 Rule의 우선 순위가 1로 설정됩니다.

    ALB Ingress Controller 어노테이션

    Kubernetes Ingress와 Service 오브젝트에 어노테이션을 사용하여 설정을 변경할 수 있습니다.

    아래의 표를 참조하여 필요한 어노테이션을 사용해 주십시오. ALB Ingress Controller의 어노테이션은 모두 alb.ingress.kubernetes.io/로 시작합니다.

    어노테이션기본값적용 리소스설명
    alb.ingress.kubernetes.io/listen-ports[{"HTTP":80}] (인증서 번호가 설정되었다면 [{"HTTPS":443}])IngressListener의 프로토콜 및 포트 설정 리스트.
    사용 가능한 프로토콜: HTTP,HTTPS
    alb.ingress.kubernetes.io/descriptionAutomatically Created By NKSIngress로드 밸런서 메모
    alb.ingress.kubernetes.io/ssl-certificate-noN/AIngress프로토콜이 HTTPS인 리스너에 적용할 Certificate Manager의 인증서 번호
    (인증서 번호는 Resource Manager의 nrn에서 확인 가능)
    (예: nrn:PUB:CertificateManager::000:Certificate/External/${certificateNo})
    alb.ingress.kubernetes.io/ssl-min-versionTLSV10IngressTLS Protocol 버전
    - 설정 가능한 버전 및 값
    TLS v1.0: TLSV10
    TLS v1.1: TLSV11
    TLS v1.2: TLSV12
    alb.ingress.kubernetes.io/enable-http2falseIngress프로토콜이 HTTPS인 리스너의 HTTP/2 활성화 여부
    alb.ingress.kubernetes.io/cipher-suite-list리스너에서 지원하는 모든 cipher suiteIngress리스너에서 지원하는 Cipher Suite 목록
    (예: ["TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA", "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256", "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256"])
    alb.ingress.kubernetes.io/load-balancer-sizesmallIngress로드 밸런서의 부하처리 성능 설정
    설정 가능한 값: small, medium, large
    alb.ingress.kubernetes.io/idle-timeout60Ingress로드 밸런서의 Idle Timeout 설정
    alb.ingress.kubernetes.io/network-typepublicIngress로드 밸런서의 네트워크 유형 설정(생성 시에만 사용)
    사설: private, 공인: public
    alb.ingress.kubernetes.io/subnet-idkube-system configmap(ncloud-config)lbSubnetNoIngress로드 밸런서 생성을 위한 로드 밸런서 전용 서브넷의 ID 값(생성 시에만 사용)
    alb.ingress.kubernetes.io/actions.${actionName}N/AIngressListener Rule의 기능들을 사용하기 위한 설정(하단 설명 참고)
    alb.ingress.kubernetes.io/conditions.${conditionName}N/AIngressIngress Rule의 Host, Path 조건에 추가 조건을 적용하기 위한 설정(하단 설명 참고)
    alb.ingress.kubernetes.io/enable-access-logfalseIngress액세스 로그 수집 설정 (Cloud Log Analytics 상품 이용 신청 필요)
    alb.ingress.kubernetes.io/load-balancer-nameN/AIngress로드 밸런서 이름 (생성 시에만 적용)
    이름 명명 규칙: 길이 3 ~ 30자, 영어/숫자/"-" 만 허용, 영어로 시작
    alb.ingress.kubernetes.io/algorithm-typeround-robinIngress, ServiceTarget Group의 로드 밸런싱 알고리즘 설정
    설정 가능한 값: round-robin, least-connection, source-ip-hash
    alb.ingress.kubernetes.io/unhealthy-threshold-count2Ingress, ServiceHealth Check 실패 임계값
    alb.ingress.kubernetes.io/healthy-threshold-count2Ingress, ServiceHealth Check 성공 임계값
    alb.ingress.kubernetes.io/healthcheck-portTargetGroup 포트Ingress, ServiceHealth Check 포트
    alb.ingress.kubernetes.io/healthcheck-path/Ingress, ServiceHealth Check URL 경로
    alb.ingress.kubernetes.io/healthcheck-interval-seconds30Ingress, ServiceHealth Check 주기(초)
    alb.ingress.kubernetes.io/healthcheck-protocolHTTPIngress, ServiceHealth Check 프로토콜
    HTTP, HTTPS
    alb.ingress.kubernetes.io/backend-protocolHTTPIngress, ServiceTarget Group의 프로토콜
    HTTP, HTTPS
    alb.ingress.kubernetes.io/enable-sticky-sessionfalseIngress, ServiceTarget Group의 Sticky Session 설정
    • alb.ingress.kubernetes.io/actions.${actionName}: actions 모델에 맞게 JSON 형태의 string으로 작성하여 Listener Rule의 추가 기능들을 설정할 수 있습니다. Ingress에 설정된 Rule의 service.name을 사용하고자 하는 ${actionName}으로 설정하고, service.port.nameuse-annotation으로 설정하면 어노테이션이 적용됩니다.
    속성타입설명
    typestringactiontype을 정의
    설정 가능한 값 targetGroup, redirection
    targetGroupobjectactiontypetargetGroup으로 설정한 경우 사용
    targetGroup.targetGroupsarray트래픽을 전달할 Service의 목록
    targetGroup.targetGroups[n].serviceNamestringservice name
    targetGroup.targetGroups[n].servicePortnumberservice port
    targetGroup.enableStickySessionbooleansticky session 활성화 여부
    기본값: false
    redirectionobjectaction의 typeredirection으로 설정한 경우 사용
    redirection.hoststring기본값: #{host}
    redirection.pathstring기본값: /#{path}
    redirection.querystring기본값: #{query}
    redirection.portstringredirection 포트
    기본값: #{port}
    redirection.protocolstring설정 가능한 프로토콜: HTTP, HTTPS
    기본값: #{protocol}
    redirection.statusCodenumber설정 가능한 코드: 301, 302
    • alb.ingress.kubernetes.io/conditions.${conditionName}: conditions 모델에 알맞은 JSON 형태의 string으로 작성하여 Ingress에 정의된 Host, Path 조건 외에 다른 조건들을 추가로 설정할 수 있습니다. 해당 조건들은 Ingress Rule에서 ${conditionName}과 일치하는 serviceName을 가진 Service에 적용됩니다.
    속성타입설명
    fieldstring추가할 조건을 정의
    설정 가능한 값 hostHeader, pathPattern
    hostHeaderobjectcondition의 field를 hostHeader으로 설정한 경우 사용
    hostHeader.valuesarrayhost 목록
    hostHeader.values[n]stringhost
    pathPatternobjectconditionfieldpathPattern으로 설정한 경우 사용
    pathPattern.valuesarraypath 목록
    pathPattern.values[n]stringpath

    라우팅 예제 코드

    • 아래 코드는 경로 /exampleactionNametargets인 어노테이션을 설정하여 두 개의 Service(a, b)로 가중치 기반 라우팅이 되도록 설정하는 예제입니다.

      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: example-alb-ingress
        annotations:
          alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}]'
          alb.ingress.kubernetes.io/actions.targets: >
            {"type":"targetGroup","targetGroup":{"targetGroups":[{"serviceName":"a","servicePort":80,"weight":40},{"serviceName":"b","servicePort":80,"weight":60}],"enableStickySession":false}}
        labels:
          app: example-alb-ingress
      spec:
        ingressClassName: alb
        rules:
          - http:
              paths:
                - path: /example
                  pathType: Prefix
                  backend:
                    service:
                      name: targets
                      port:
                        name: use-annotation
      
    • 아래 코드는 기존 Rule에 설정된 경로 /examplehost 조건 example.compath 조건 /example2를 추가하는 예제입니다.

      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: example-alb-ingress
        annotations:
          alb.ingress.kubernetes.io/conditions.example: >
            [{"field":"hostHeader","hostHeader":{"values":["example.com"]}},{"field":"pathPattern","pathPattern":{"values":["/example2"]}}]
        labels:
          app: example-alb-ingress
      spec:
        ingressClassName: alb
        rules:
          - http:
              paths:
                - path: /example
                  pathType: Prefix
                  backend:
                    service:
                      name: example
                      port:
                        number: 80
      

    이 문서가 도움이 되었습니까?

    Changing your password will log you out immediately. Use the new password to log back in.
    First name must have atleast 2 characters. Numbers and special characters are not allowed.
    Last name must have atleast 1 characters. Numbers and special characters are not allowed.
    Enter a valid email
    Enter a valid password
    Your profile has been successfully updated.