본문 바로가기
Work/개발 노트

[k8s] ALB Ingress 사용 시 다수의 리스너 등록하기

by ★용호★ 2020. 10. 15.

목표

Amazon EKS ALB Ingress controller를 사용하여 ALB를 생성하였고, 하고자하는 목표는 아래와 같았다.

  1. Ingress 설정으로 Listen Port를 HTTPS(443) 포트로 지정하였고, Ingress의 rules에 정의되어 있는 대로 URL Path 에 따라 각각 정해진 서비스로 traffic routing 한다. (URL 기반 Routing) → 이 경우에는 정상동작 함을 확인하였다.
    ...
        alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}, {"HTTP": 9090}]'
    ...
     
    spec:
      rules:
        - http:
            paths:
              - path: /grafana*
                backend:
                  serviceName: grafana
                  servicePort: 3000
              - path: /*
                backend:
                  serviceName: web
                  servicePort: 80
  1. HTTP(S) 9090 포트로 들어오는 요청은 443과 다른 별도의 ALB Listener로 생성되어 example.com:9090으로 접속이 가능하도록 설정한다. (Port 기반 Routing) → 해결하지 못함

ALB 를 직접 설정한다면 위 1, 2 번 모두 만족하는 ALB 가 설정이 가능하지만 Kubernetes Ingress를 사용하여 설정을 진행하고자 하는 것이 목표였다.

이슈 내용

위 요구사항에서 3번에 작성되어 있는 것처럼 별도의 Port 기반 ALB Listener를 생성하기 위해 ALB Annotation 문서를 찾아보았으나 관련 내용을 찾을 수 없었다.

ALB Ingress 설정에서 rules 가 배열이므로, 아래와 같이 alb.ingress.kubernetes.io/listen-ports Annotation 설정에 순서에 맞추어 여러개의 port 설정을 넣어봤으나 host가 다를 경우에만 적용되는 듯했고, host가 같을 경우에는 하나의 http 설정을 한 것과 동일한 결과를 얻을 수 있었다. 따라서 annotation 을 통해 여러개의 listener 등록은 가능하지만, 각 리스너별로 별도의 action rules 를 지정하는것이 불가능한 것으로 확인이 되었다.

...
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}, {"HTTP": 9090}]'
...
 
 
spec:
  rules:
  - http:
    - path: /*
        backend:
          serviceName: aa
          servicePort: 8080
  - http:
    - path: /*
        backend:
          serviceName: bb
          servicePort: 8081

Ingress를 사용할 경우 Ingress 설정으로 생성된 Listener를 제외하고 수동으로 Listener를 생성하여 사용할 경우 Ingress에 변경사항이 발생하면 수동으로 생성된 부분은 초기화되는 것을 확인하였다. 결과적으로 Ingress를 통해서만 ALB 설정이 되어야 하기 때문에 동일한 ALB에 여러 Listener를 생성하는 설정 방법이 필요했다.

 

해결 방법

현재 ALB Ingress Controller 버전 사용 시 하나의 Ingress Controller에 Listner를 다수 등록할 수는 있지만 위 요구사항 처럼 다른 Rule을 가진 별도의 리스너를 Ingress를 사용하여 추가하는 것은 불가능하다.

AWS Support를 통해 답변을 받았는데 현재 알파 버전으로만 지원이 가능하고 현시점(2020년 10월)에서 정식 출시는 언제가 될지 알 수 없다고 한다. 그래서 일단 알파 버전으로 테스트를 진행해보았다.

먼저 기존 ALB Ingress Controller를 제거 또는 수정하여, 현재 베타 버전의 이미지로 교체하여 ALB Ingress Controller를 실행한다.

kubectl set image deployment alb-ingress-controller docker.io/amazon/aws-alb-ingress-controller:v1.2.0-alpha.1 -n kube-system

 

별도 리스너로 등록이 필요한 대상 그룹마다 Ingress를 생성하되 각 Ingress를 그루핑 할 수 있는 어노테이션을 추가한다. 이 때 리스너의 등록 순서도 지정할 수 있다.

  • alb.ingress.kubernetes.io/group.name: <그룹명>
    • 모든 Ingress의 그룹명을 동일하게 지정해야 하나의 ALB에 리스너들이 등록된다.
    • /가 포함되면 안되고 [a-z0-9]{1,10}로 제한될 수 있다고 한다.

Ingress를 만들 때 주의해야할 점이 있는데 Ingress의 group명에 대한 어노테이션은 동일하게 설정하되 name을 서로 다르게 해야한다. name이 같으면 당연히 같은 Ingress 설정이라고 판단하고 설정을 덮어쓰게 되어 ALB 리스너에는 마지막으로 적용한 하나의 리스너만 등록된다.

댓글