Develop/DevOps

[nginx-ingress] virtualserver, virtualserverroute

재융 2024. 12. 4. 01:20
반응형

https://docs.nginx.com/nginx-ingress-controller/configuration/virtualserver-and-virtualserverroute-resources/

 

VirtualServer and VirtualServerRoute resources | NGINX Ingress Controller

MyF5 Your key to everything F5, including support, registration keys, and subscriptions

docs.nginx.com

 

쿠버네티스에서 TLS 인증서가 서비스 대상 namespace에 존재하지않고 다른 namespace에 존재할경우 TLS를 복사해서 서비스 namespace에 옮겨야하는데, 이런경우에 굳이 TLS인증서를 복사하지않고 TLS를 적용 할 수 있는 방법이 있다.

 

Nginx-ingress를 사용할 경우 Virtualserver, VirtualserverRoute를 이용하여 문제를 해결할수있다. VirtualServer는 명시되어있는 routes를 통해 VirtualserverRoute가 떠있는 namespace의 서비스로 트래픽을 흘려보낸다.

- 즉, 트래픽이 들어오는곳은 TLS인증서가 있는 VirtualServer를 통해서, 서비스의 namespace에 떠있는 VirtualserverRoute로 전송

 

 

상황은 다음과같이 설정

- Grafana 서비스는 grafana라는 namespace에 존재. 서비스 이름도 grafana

- TLS인증서는 nginx-ingress라는 namespace에 존재

 

Virtualserver는 우리가 자주 사용하는 ingress 리소스와 동일하다라고 봐도된다. 다만 여기에 spec.route부분에 어느 VirtualserverRoute와 연결할것인지 명시해줘야한다.

apiVersion: k8s.nginx.org/v1
kind: VirtualServer
metadata:
  name: "grafana"
  namespace: "nginx-ingress"
 spec:
   host: "grafana.test.com"
   route:
   - path: "/"
     route: grafana # grafana namespace에 생성할 virtualserverroute 이름
   tls:
     secret: tls-secret

 

Grafana namespace에는 다음과같은 VirtualserverRoute 리소스를 생성한다.

- grafana.test.com이라는 호스트에 접근하게되면 grafana라는 upstream에 명시된 서비스 리소스로 가게됨

- upstreams에는 grafana와 연결된 service 리소스의 내용을 적어주면됨. (현재 grafana namespace에는 grafana라는 service리소스가 10003 포트를 사용하고있음)

apiVersion: k8s.nginx.org/v1
kind: VirtualServerRoute
metadata:
  name: "grafana"
  namespace: "grafana"
spec:
  host: "grafana.test.com"
  subroutes:
  - path: "/"
    action:
      pass: "grafana"
  upstreams:
  - name: "grafana"
    service: "grafana"
    port: 10003
반응형