DevOps/Kubernetes

[EKS] Ingress 서비스 별 URL 관리

깜태 2022. 11. 24. 16:02
728x90

상황

어플리케이션이 여러 개 있는 상황에서 URL 별로 로드밸런싱이 필요해졌다.

기존에는 메인 API 서버 하나만 Ingress로 설정하였고, VPC 내부에서 K8S ClusterIP 타입의 서비스를 이용해

다른 서비스를 호출하는 방식으로 해결해왔다.

하지만 서버를 호출하는 객체가 여럿으로 늘고 외부에서 호출할 필요가 생기면서,

어플리케이션 별로 URL 작업이 필요해졌다.

 

시행착오

배포할 때, argoCD의 applicationSet 배포 패턴을 사용하고 있었다.

처음에는 api 서버 프로젝트의 ingress에다 다른 앱의 서비스를 붙이려고 시도해봤는데,

인식을 못해 타겟그룹도 안생기고 503 에러가 발생했다.

backend service does not exist kubernetes

그럼 applicationSet의 상위로 올라가 applicationSet 전체를 알아볼 수 있는 폴더 레벨로 가서 진행해야될까? 생각하였지만, 그렇게 하면 서비스 파일만 따로 빼내고 변경하다보면, 구조가 너무 복잡하게 꼬이고 될지 안될지도 모른 채로 고생할 것 같아 검색해보다가 알게 되었다.

해결 방법

ingress는 도메인 연결 시에만 적용하는건 줄 알았는데 그게 아니였다.

각 어플리케이션마다 ingress를 추가하고, 메타데이터에 alb.ingress.kubernetes.io/group.namealb.ingress.kubernetes.io/group.order 를 설정한 뒤, labels를 동일하게 적용하면 된다.

auth서버의 ingress 1개와 기존의 외부와 연결하는 ingress에 변경하고, 추가해봤더니 해결됐다.

기존 api-ingress.yaml (https 보안까지 들어가 있다)

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: {{ .Values.appName }}-ingress
  namespace: {{ .Values.namespace }}
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/group.name: my-api
    alb.ingress.kubernetes.io/group.order: '6'
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: instance
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]'
    alb.ingress.kubernetes.io/certificate-arn: {{ .Values.ingress.acm }}
    alb.ingress.kubernetes.io/actions.redirect-to-https: '{"Type":"redirect","RedirectConfig":{"Port":"443","Protocol":"HTTPS","StatusCode":"HTTP_301"}}'
    external-dns.alpha.kubernetes.io/hostname: {{ .Values.dnsName }}
    service.beta.kubernetes.io/aws-load-balancer-ip-address-type: dualstack
  labels:
    app: example-ingress
spec:
  rules:      
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: {{ .Values.appName }}-svc
                port:
                  number: 80

auth-ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: {{ .Values.appName }}-ingress
  namespace: {{ .Values.namespace }}
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/group.name: example-api
    alb.ingress.kubernetes.io/group.order: '1'
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: instance
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]'
    # alb.ingress.kubernetes.io/actions.redirect-to-https: '{"Type":"redirect","RedirectConfig":{"Port":"443","Protocol":"HTTPS","StatusCode":"HTTP_301"}}'
  labels:
    app: example-ingress
spec:
  rules:      
    - http:
        paths:          
          - path: /v1/auth
            pathType: Prefix
            backend:
              service:
                name: {{ .Values.appName }}-svc
                port:
                  number: 80
          - path: /v1/verification
            pathType: Prefix
            backend:
              service:
                name: {{ .Values.appName }}-svc
                port:
                  number: 80

추가된 ALB에서의 규칙을 캡쳐해봤다.

 

깔끔하게 적용되었다.

 

일부만 캡처하였지만, 어플리케이션을 계속 추가해도 문제없이 작동하는 것을 확인했다.

 

참고

https://jenakim47.tistory.com/75

728x90