ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ALB Ingress 로 subdomain 분기 설정
    NAVER Cloud 2021. 12. 20. 18:45

    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 과 동일한 이름의 서비스로 분기되는 것을 확인할 수 있다. 

    반응형

    댓글

Designed by Tistory.