티스토리 뷰

Ingress 아이콘

Ingress 이놈. HAProxy를 붙였더니 갑자기 이상하게 안되던 놈.

분명 Control plane이 하나인 클러스터에서는 정상적으로 동작했으나, 쿠버네티스 HA구성을 위해 HAProxy를 붙이자마자 이상하게 예전처럼 라우팅을 해주지 않았다.

Ingress의 간단한 동작 방식

원래는 위의 그림과 같이 내가 ingress 리소스를 통해 정의한 라우팅 규칙에 따라서 클러스터 내부에서 돌아가고 있는 서비스에게 외부의 트래픽을 전달해주어야 한다. /argo로 전달되면 ArgoCD로, /grafana면 Grafana로 전달해야 한다.

 

이때 각 서비스에서는 각각 설정된 url 경로에 따라서 동작하기 때문에 서비스 별로 중복되는 경로가 있을 수 있다. 가장 대표적으로 /login 경로가 있겠다. 대부분의 서비스는 로그인으로 권한 관리를 하기 때문이다. 이런 경우 Base URL이라는 것을 설정하여 서비스를 구분한다.

 

ArgoCD는 /argo 경로를 base url로 갖고 subpath들을 자신의 서비스에서 사용하는 url 경로로 사용한다. 마찬가지로 Grafana 서비스는 /grafana 경로를 base url로, subpath를 서비스에서 사용하는 url 경로로 사용한다.

 

 하지만 /argo는 base url의 역할을 할 뿐 실제 서비스의 url path와는 무관해야 한다. 예를 들어 ArgoCD의 경우 /argo로 접속하면 ArgoCD 서비스의 / 경로로 들어가서 /login 경로로 redirect 된다고 하자. 이때 속에서는 /과 /login으로 동작하지만 웹 브라우저에서 보이는 경로는 /argo/와 /argo/login이다. 아래 그림을 참고하자.

이런 Base URL의 설정과 subpath를 서비스의 경로로 사용하는 부분은 Nginx Ingress controller를 사용하는 경우 Ingress 리소스의 metadata.annotation으로 해당 기능을 구현할 수 있다. 정규식을 이용해서 base url 뒤 subpath를 rewrite 하여 서비스의 url로 사용하는 것이다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
  name: argocd-ingress
  namespace: argocd
spec:
  rules:
  - host: argocd.host.com
    http:
      paths:
      - backend:
          serviceName: argocd-server
          servicePort: 80
        path: /argocd(/|$)(.*)

아니 그래서 뭐가 문제였는데?

바로 여기가 문제였다. Base URL에 따라 서비스가 구분이 되고, 보통 /로 들어가면 /login으로 redirect 되는데 HAProxy를 통해 트래픽을 받다 보니 redirect 될 때 HAProxy를 거치면서 ingress가 붙여준 base url이 사라지는 것이다.....ㅠ

 

Ingress는 잘못이 없었다. HAProxy만 붙이면 안 되는 이유가 있었던 것이다.

다음 포스트는 사라진 base url을 유지하여 이전과 동일하게 동작하는 쿠버네티스 Ingress를 구성하는 과정을 설명해 보겠다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함