본문 바로가기

Data&Processing

하나의 ELB 에서 여러개 Kubernetes 서비스 제공하기

AWS Kubernetes(EKS)에서 하나의 ELB로 여러개의 서비스 제공하는 방법을 나누어보기로 하겠습니다.(providing multiple kubernetes services with one ELB)

 

 EKS구성시 개발한 서비스를 외부/내부로 서비스를 하기위해서는 load balancer가 필요하게 되며, ingress-nginx를 사용하면 AWS에서도 ALB, ELB, NLB 의 load balancer(이하 LB)를 사용할수있게 됩니다.

 가격이 그리 비싼건아니지만, 개발편의등의 목적으로 하나의 LB에 여러가지 서비스를 제공하고 싶은 경우가 있는데, nginx가 reverse-proxy 기능을 통해서 하나의 ip로 여러가지를 제공하는것 처럼 ingress-nginx 도 비슷한게 있지 않을까 하고 찾아보게 되었습니다. ingress를 설치한 namespace와 다른 서비스namespace가 같으면 아래와 같은 방법은 필요없없고 그냥 ingress에서 같은 namespace의 서비스명을 지정해주면 됩니다.

 

 nginx service name 에서 지정하는 service를  external service로 하고, 해당 external service를 다른 namespace에 service를 지정하면 됩니만, alb의 경우에는 nodeport와 loadbalancer 타입만을 지정할수 있어서 다른 namespace service는 nginx에서 사용할수가 없습니다. 

https://kubernetes-sigs.github.io/aws-alb-ingress-controller/guide/ingress/annotation/

 

Annotation - AWS ALB Ingress Controller

 Ingress annotations You can add kubernetes annotations to ingress and service objects to customize their behavior. Note Annotations applied to service have higher priority over annotations applied to ingress. Location column below indicates where that an

kubernetes-sigs.github.io

따라서 NLB와 ELB에서만 하나의 LB에서 여러개의 다른 namespace에 있는 서비스를 접근/제공할수 있게 됩니다. AWS ELB 는 https://kubernetes.github.io/ingress-nginx/deploy/#aws 를 통해서 설치하면 되며, 해당 ELB를 통한 서비스 제공을 예로 들도록 하겠습니다.

"airflow" namespace에 있는 airflow service와 "monitor" namespace에 있는 grafana service를 하나의 ELB를 통해서 서비스하려면,

 

ingress설정

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress1
  namespace: ingress-nginx
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: airflow.zoo.com
    http:
      paths:
      - path: /
        backend:
          serviceName: airflow
          servicePort: 8080
  - host: grafana.zoo.com
    http:
      paths:
      - path: /
        backend:
          serviceName: grafana
          servicePort: 3000

ingress와 동일한 namespace에 서비스설정

apiVersion: v1
kind: Service
metadata:
  name: airflow-svc
  namespace: ingress-nginx
spec:
  type: ExternalName
  externalName: airflow.airflow.svc.cluster.local
  ports:
    - name: airflow
      protocol: TCP
      port: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: grafana-svc
  namespace: ingress-nginx
spec:
  type: ExternalName
  externalName: grafana.monitor.svc.cluster.local
  ports:
    - name: grafana
      protocol: TCP
      port: 3000

 

External Service가 바라보는 service는 nodeport Service 로 하면 확실하게 됩니다.(다른서비스는 테스트 해보지 못함)