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/
따라서 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 로 하면 확실하게 됩니다.(다른서비스는 테스트 해보지 못함)