ALB Ingress Controller 활용 예제
    • PDF

    ALB Ingress Controller 활용 예제

    • PDF

    기사 요약

    Ncloud Kubernetes Service에서는 Service와 Ingress에 어노테이션을 추가하여 다양한 라우팅 전략을 구현할 수 있습니다. 이 가이드에서는 ALB Ingress Controller 설정을 바탕으로 사용할 수 있는 예제를 제공합니다.

    예제용 워크로드 설치

    예제용 Deployment 및 Service는 아래 명령어를 실행하여 설치할 수 있습니다. 명령어 실행시 'naver', 'cloud', 'platform' 이라는 이름의 Deployment 및 Service가 생성됩니다:

    kubectl --kubeconfig=$KUBE_CONFIG apply -f https://raw.githubusercontent.com/NaverCloudPlatform/nks-alb-ingress-controller/main/docs/examples/fin/nks-alb-ingress-sample-services.yaml
    

    ALB Ingress Controller 활용 예제

    경로 기반 라우팅 예제

    이 예제는 지정된 경로에 따라 요청을 서로 다른 서비스로 라우팅하는 방법을 보여줍니다. /naver 경로로 들어오는 요청은 naver 서비스로 라우팅되며, /cloud 경로로 들어오는 요청은 cloud 서비스로 라우팅됩니다.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: path-ingress
    spec:
      ingressClassName: alb
      rules:
      - http:
          paths:
          - path: /naver
            pathType: Prefix
            backend:
              service:
                name: naver 
                port:
                  number: 80
          - path: /cloud
            pathType: Prefix
            backend:
              service:
                name: cloud
                port:
                  number: 80
    

    호스트 기반 라우팅 예제

    이 예제는 지정된 호스트에 따라 요청을 서로 다른 서비스로 라우팅하는 방법을 보여줍니다. svc.naver.com 호스트로 들어오는 모든 요청은 naver 서비스로 라우팅되며, svc.cloud.com 호스트로 들어오는 모든 요청은 cloud 서비스로 라우팅됩니다.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: host-ingress
    spec:
      ingressClassName: alb
      rules:
      - host: svc.naver.com
        http:
          paths:
          - path: /*
            pathType: Prefix
            backend:
              service:
                name: naver
                port:
                  number: 80
      - host: svc.cloud.com
        http:
          paths:
          - path: /*
            pathType: Prefix
            backend:
              service:
                name: cloud
                port:
                  number: 80
    

    HTTP 헤더 기반 라우팅 예제

    이 예제는 HTTP 헤더 값을 기반으로 트래픽을 라우팅하는 방법을 보여줍니다. alb.ingress.kubernetes.io/conditions 어노테이션을 사용하여 HTTP 헤더 규칙을 정의합니다. 아래 경우, 'HeaderName'이라는 HTTP 헤더에 'HeaderValue1' 또는 'HeaderValue2' 값이 포함되어 있는 요청만 네이버 서비스로 라우팅됩니다.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: condition-ingress
      annotations:
        alb.ingress.kubernetes.io/conditions.naver: >
          [{"field":"httpHeader","httpHeader":{"key": "HeaderName", "values":["HeaderValue1", "HeaderValue2"]}}]
    spec:
      ingressClassName: alb
      rules:
        - http:
            paths:
              - path: /*
                pathType: Prefix
                backend:
                  service:
                    name: naver
                    port:
                      number: 80
    

    Service의 Port Name 활용 예제

    Ingress 규칙에서 서비스의 포트 이름(port.name)을 사용하여 트래픽 라우팅 규칙을 정의할 수 있습니다. 이를 위해, 서비스 정의 시 port.name을 명시적으로 지정해야 합니다. 이 예제는 네이버 서비스의 포트에 http-web이라는 이름을 지정하고 Ingress 규칙에서 이를 참조합니다.

    apiVersion: v1
    kind: Service
    metadata:
      name: naver
    spec:
      ports:
      - name: http-web
        nodePort: 30080
        port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app: naver
      type: NodePort
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: portname-ingress
    spec:
      ingressClassName: alb
      rules:
      - http:
          paths:
          - path: /naver
            pathType: Prefix
            backend:
              service:
                name: naver
                port:
                  name: http-web
    

    HTTP를 HTTPS로 리다이렉트 예제

    이 예제는 ssl-redirect 어노테이션을 활용하여 HTTP로 들어오는 트래픽을 HTTPS로 리다이렉트하는 방법을 보여줍니다. 예제를 수행하기 위해서는 다음 요소가 필요합니다.

    • 도메인
    • Certificate Manager에 등록된 해당 도메인의 인증서

    HTTP(80)로 들어오는 트래픽을 HTTPS(443)으로 리다이렉트하려면 아래 예제와 같이 Ingress를 생성해 주십시오.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS":443}]'
        alb.ingress.kubernetes.io/ssl-certificate-no: "1004"
        alb.ingress.kubernetes.io/ssl-redirect: "443"
      name: redirect-ingress
    spec:
      ingressClassName: alb
      defaultBackend:
        service:
          name: cloud
          port:
            number: 80
    
    • 위 설정에서 80 포트를 443 포트로 리다이렉트하기 위해 두 개의 포트를 등록하는 부분은 아래와 같습니다.

      alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS":443}]'
      
    • 위 설정에서 HTTPS 리스너에 등록할 인증서 번호를 나타내는 부분은 아래와 같습니다.

      alb.ingress.kubernetes.io/ssl-certificate-no: "1004"
      
      참고

      인증서 번호는 Resource Manager의 nrn에서 확인할 수 있습니다. (예: nrn:PUB:CertificateManager::000:Certificate/External/${certificateNo})

    • 위 설정에서 리다이렉트할 포트를 등록하는 부분은 아래와 같습니다.

      alb.ingress.kubernetes.io/ssl-redirect: "443"
      

    멀티 인증서 사용 예제

    로드밸런서에 여러 인증서를 등록할 수 있습니다. 이 예제에서는 기본(default) 인증서와 추가 인증서를 설정하는 방법을 보여줍니다.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS":443}]'
        alb.ingress.kubernetes.io/ssl-certificate-no: "1234, 1004"
        alb.ingress.kubernetes.io/ssl-redirect: "443"
      name: multi-ssl-ingress
    spec:
      ingressClassName: alb
      rules:
      - http:
          paths:
          - path: /*
            pathType: Prefix
            backend:
              service:
                name: naver 
                port:
                  number: 80
    
    • 위 설정에서 인증서를 등록하는 부분은 아래와 같습니다. 첫 번째 인증서가 기본 인증서로 추가되며 나머지 인증서는 추가 인증서로 설정됩니다.

      alb.ingress.kubernetes.io/ssl-certificate-no: "1234, 1004"
      

    action을 통한 가중치 기반 라우팅 예제

    이 예제에서는 Ingress 규칙과 함께 어노테이션을 사용하여 특정 경로에 대한 트래픽 처리 방식을 정의합니다. /navercloud 경로에 대해서 어노테이션을 통해 트래픽이 naver와 cloud 서비스로 분산되도록 설정됩니다.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: action-ingress
      annotations:
        alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}]'
        alb.ingress.kubernetes.io/description: 'alb ingress controller'
        alb.ingress.kubernetes.io/actions.navercloud: >
          {"type":"targetGroup","targetGroup":{"targetGroups":[{"serviceName":"naver","servicePort":80,"weight":50},{"serviceName":"cloud","servicePort":80,"weight":50}]}}
    spec:
      ingressClassName: alb
      defaultBackend:
        service:
          name: naver
          port:
            number: 80
      rules:
        - http:
            paths:
              - path: /platform
                pathType: Prefix
                backend:
                  service:
                    name: platform
                    port:
                      number: 80
              - path: /navercloud
                pathType: Exact
                backend:
                  service:
                    name: navercloud
                    port:
                      name: use-annotation
    
    • 위 설정에서 트래픽을 naver와 cloud 서비스로 분산하는 부분은 아래와 같습니다.
      alb.ingress.kubernetes.io/actions.navercloud: >
        {"type":"targetGroup","targetGroup":{"targetGroups":[{"serviceName":"naver","servicePort":80,"weight":50},{"serviceName":"cloud","servicePort":80,"weight":50}]}}
      
    • 어노테이션을 적용하기 위해서는 Ingress 명세 내에 정의된 경로와 actions.${actionName} 의 actionName 이 일치해야 합니다.

    action을 통한 서로 다른 네임스페이스에 존재하는 서비스 설정 예제

    이 예제에서는 Ingress 규칙과 함께 어노테이션을 사용하여 서로 다른 네임스페이스에 있는 서비스를 하나의 Ingress에서 관리합니다. /navercloud 경로로 접근할 때, navercloud 네임스페이스에 존재하는 naver 서비스로 라우팅됩니다.

    apiVersion: v1
    kind: Service
    metadata:
      name: naver
      namespace: navercloud
    spec:
      type: NodePort
      selector:
        app: naver
      ports:
        - port: 80
          targetPort: 80
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: naver
      namespace: navercloud
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: naver
      template:
        metadata:
          labels:
            app: naver
        spec:
          containers:
            - name: naver
              image: io.kr.ncr.ntruss.com/nks/hello:plain-text
              ports:
                - containerPort: 80
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: action-ingress
      annotations:
        alb.ingress.kubernetes.io/actions.navercloud: >
          {"type":"targetGroup","targetGroup":{"targetGroups":[{"serviceName":"navercloud/naver","servicePort":80,"weight":100}]}}
    spec:
      ingressClassName: alb
      defaultBackend:
        service:
          name: cloud 
          port:
            number: 80
      rules:
        - http:
            paths:
              - path: /navercloud
                pathType: Exact
                backend:
                  service:
                    name: navercloud
                    port:
                      name: use-annotation
    
    • 위 설정에서 다른 네임스페이스에 존재하는 서비스를 정의하는 부분은 아래와 같습니다. action 내부의 서비스는 namespace/service 형식으로 지정되어야 합니다.
      alb.ingress.kubernetes.io/actions.navercloud: >
        {"type":"targetGroup","targetGroup":{"targetGroups":[{"serviceName":"navercloud/naver","servicePort":80,"weight":100}]}}
      
    • 어노테이션을 적용하기 위해서는 Ingress 명세 내에 정의된 경로와 actions.${actionName} 의 actionName 이 일치해야 합니다.
    • action 내부에 기재된 서비스는 NodePort 타입이어야 합니다.

    condition을 통한 조건 추가 예제

    이 예제에서는 Ingress 규칙과 함께 어노테이션을 사용하여 특정 경로에 대한 조건 추가 방식을 정의합니다. 명세 내부에 기재된 룰을 통해 /naver 경로에 대해 naver 서비스로 라우팅하며 어노테이션을 통해 조건을 추가합니다.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: condition-ingress
      annotations:
        alb.ingress.kubernetes.io/conditions.naver: >
          [{"field":"hostHeader","hostHeader":{"values":["svc.naver.com"]}},{"field":"pathPattern","pathPattern":{"values":["/cloud"]}}]
    spec:
      ingressClassName: alb
      rules:
        - http:
            paths:
              - path: /naver
                pathType: Prefix
                backend:
                  service:
                    name: naver
                    port:
                      number: 80
    
    • 위 설정에서 svc.naver.com 호스트 헤더 조건과 추가 경로를 적용하는 부분은 아래와 같습니다.
      alb.ingress.kubernetes.io/conditions.naver: >
        [{"field":"hostHeader","hostHeader":{"values":["svc.naver.com"]}},{"field":"pathPattern","pathPattern":{"values":["/cloud"]}}]
      
    • 어노테이션을 적용하기 위해서는 Ingress 명세 내에 정의된 경로와 conditions.${conditionName} 의 conditionName이 일치해야 합니다.

    타겟그룹 별 헬스 체크 경로 설정 예제

    어노테이션의 적용 대상이 Ingress, Service 인 경우, 해당 어노테이션은 두 리소스 유형에서 사용할 수 있습니다. 동일한 어노테이션이 Ingress, Service 에 존재하는 경우 Service에 적용된 어노테이션이 우선적으로 적용됩니다.

    이 예제에서는 경로별로 등록된 서비스의 헬스체크를 각각 다르게 설정합니다. 각 서비스에 대한 특정 헬스체크 설정은 서비스의 어노테이션을 통해 구현됩니다.

    # naver-service.yaml
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        alb.ingress.kubernetes.io/healthcheck-path: /naver
      name: naver
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app: naver
      type: NodePort
    ---
    # cloud-service.yaml
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        alb.ingress.kubernetes.io/healthcheck-path: /cloud
      name: cloud
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app: cloud
      type: NodePort
    ---
    # healthcheck-alb.yaml
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: healthcheck-alb
      annotations:
        kubernetes.io/ingress.class: alb
        alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}]'
        alb.ingress.kubernetes.io/healthcheck-path: "/"
    spec:
      defaultBackend:
        service:
          name: platform 
          port:
            number: 80
      rules:
      - http:
          paths:
          - path: /naver
            pathType: Prefix
            backend:
              service:
                name: naver
                port:
                  number: 80
          - path: /cloud
            pathType: Prefix
            backend:
              service:
                name: cloud
                port:
                  number: 80
    
    • 위 설정에서 /naver 경로로 라우팅되는 타겟 그룹의 헬스체크 조건은 아래와 같습니다. 타겟 그룹 별로 특정 헬스체크 조건을 적용하고자 할 때, 이러한 설정들은 해당 서비스의 어노테이션을 통해 정의되어야 합니다.
      alb.ingress.kubernetes.io/healthcheck-path: /naver
      

    Sticky Session 지정 예제

    로드밸런서의 Sticky Session은 리스너의 룰에서 설정 가능한 Sticky Session 기능과 타겟 그룹에서 설정 가능한 Sticky Session 기능으로 제공됩니다.
    이 예제에서는 생성되는 모든 타겟그룹의 Sticky Session을 설정하고, action을 통해 생성된 룰의 Sticky Session을 사용하도록 설정합니다.

    참고
    • 네이버 클라우드 플랫폼의 Application Load Balancer는 타깃 그룹으로 서버를 지정하므로 Ncloud Kubernetes Service 상품에서 Sticky Session 기능이 정상적으로 동작하지 않을 수 있습니다.
    • Sticky Session 기능을 활용하려면 서비스의 externalTrafficPolicy를 Local로 설정하고, 한 노드에 한 개의 파드만 배포해야 합니다.
    • 이 기능은 추후 개선될 예정이며, 되도록 운영 어플리케이션의 세션 관리 기능을 이용해야 합니다.
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: sticky-ingress 
      annotations:
        alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}]'
        alb.ingress.kubernetes.io/enable-sticky-session: 'true'
        alb.ingress.kubernetes.io/actions.targets: >
          {"type":"targetGroup","targetGroup":{"targetGroups":[{"serviceName":"naver","servicePort":80,"weight":50},{"serviceName":"cloud","servicePort":80,"weight":50}],"enableStickySession":true}}
    spec:
      ingressClassName: alb
      rules:
      - http:
          paths:
          - path: /navercloud
            pathType: Prefix
            backend:
              service:
                name: targets 
                port:
                  name: use-annotation 
          - path: /platform
            pathType: Prefix
            backend:
              service:
                name: platform 
                port:
                  number: 80
    
    • 위 설정에서 타겟그룹의 Sticky Session을 사용하는 부분은 아래와 같습니다.
      alb.ingress.kubernetes.io/enable-sticky-session: 'true'
      
    • 위 설정에서 /navercloud 경로로 들어오는 요청에 Sticky Session을 사용하는 부분은 아래와 같습니다.
      alb.ingress.kubernetes.io/actions.targets: >
        {"type":"targetGroup","targetGroup":{"targetGroups":[{"serviceName":"naver","servicePort":80,"weight":50},{"serviceName":"cloud","servicePort":80,"weight":50}],"enableStickySession":true}}
      

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

    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.