ALB Ingress 로 subdomain 분기 설정
ALB를 사용해서 abc.com/path1, /path2 와 같은 분기도 많이 처리하지만, subdomain 분기도 사용할 수 있기에 테스트를 진행해 보았다. 전체적으로 아래와 같은 구성이고, alb annotation을 사용해서 더 다양한 방식으로 분기할 수 있다.
1. alb ingress controller 설치
alb ingress 를 사용하기 위해서는 네이버클라우드의 ALB 를 생성할 수 있는 alb ingress controller 를 설치해야 한다.
네이버클라우드 가이드 문서에 나와있는대로 설치한다. (https://guide.ncloud-docs.com/docs/k8s-k8suse-albingress)
kubectl --kubeconfig=$KUBE_CONFIG apply -f https://raw.githubusercontent.com/NaverCloudPlatform/nks-alb-ingress-controller/main/docs/install/pub/install.yaml
2. Pod, Service 배포
각 subdomain 별로 다른 서비스를 연결할 예정이므로 deployment, service manifest 를 배포한다.
서비스 구성 예제 역시 네이버클라우드 ALB 가이드에 나와있는 manifest 를 참고한다.
kubectl --kubeconfig=$KUBE_CONFIG apply -f https://gist.githubusercontent.com/NaverCloudPlatformDeveloper/0e6262b996f74229719807cb5ae007fc/raw/3ce72e7961bc2407bfb87e153c94672e6ee6a1cf/nks-alb-ingress-sample-services.yaml
나는 다른 서비스들과 구분하기 위해 alb 라는 namespace 를 만들어서 배포했다.
아래와 같이 pod, service 들이 생성되어 있는지 확인한다.
# kctl get all -n alb
NAME READY STATUS RESTARTS AGE
pod/cloud-8569cb49bf-hwg9k 1/1 Running 0 3h22m
pod/naver-7d855c949f-lzh6h 1/1 Running 0 3h22m
pod/platform-68754dccf9-t27t4 1/1 Running 0 3h22m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/cloud NodePort 198.19.215.85 <none> 80:31115/TCP 3h22m
service/naver NodePort 198.19.133.166 <none> 80:30781/TCP 3h22m
service/platform NodePort 198.19.240.183 <none> 80:31307/TCP 3h22m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/cloud 1/1 1 1 3h22m
deployment.apps/naver 1/1 1 1 3h22m
deployment.apps/platform 1/1 1 1 3h22m
NAME DESIRED CURRENT READY AGE
replicaset.apps/cloud-8569cb49bf 1 1 1 3h22m
replicaset.apps/naver-7d855c949f 1 1 1 3h22m
replicaset.apps/platform-68754dccf9 1 1 1 3h22m
3. ingress 배포
lblb.ga 라는 도메인을 구입했고, 각 서비스 별로 platform.lblb.ga , naver.lblb.ga, cloud.lblb.ga 로 설정하도록 구성했다.
ingress를 생성해서 ALB 가 생성되면 해당 ALB 의 도메인을 각 서브도메인별로 cname 처리한다.
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: sample-alb-ingress
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}]'
alb.ingress.kubernetes.io/description: 'alb ingress controller'
labels:
app: sample-alb-ingress
spec:
backend:
serviceName: naver
servicePort: 80
rules:
- host: platform.lblb.ga
http:
paths:
- backend:
serviceName: platform
servicePort: 80
- host: naver.lblb.ga
http:
paths:
- backend:
serviceName: naver
servicePort: 80
- host: cloud.lblb.ga
http:
paths:
- backend:
serviceName: cloud
servicePort: 80
ingress 역시 서비스와 동일한 alb namespace 에 생성했다.
kubectl create -f ingress.yaml -n alb
# ingress & ALB 생성 확인
kctl get ingress -n alb
NAME CLASS HOSTS ADDRESS PORTS AGE
sample-alb-ingress <none> platform.lblb.ga,naver.lblb.ga,cloud.lblb.ga ing-alb-samplealbingress-xxxxx-xxxxxxx-40dd5ce2b433.kr.lb.naverncp.com 80 80m
이때 ALB 의 리스너 규칙 설정에 ingress.yaml 에 설정한 것과 동일하게 규칙이 들어가 있어야 한다.
4. DNS 에서 cname 설정
5. 접속 테스트
ingress.yaml 에 기재한대로 subdomain 과 동일한 이름의 서비스로 분기되는 것을 확인할 수 있다.