Summary

k3s 환경에서 localhost로 접근하는 방법에 대해서 정리했습니다.

Why

왜 localhost로 접근하는 방법을 알아야 하는지 의문을 가질 수 있습니다. 웹 GUI는 도메인 연결해서 접근하면 되는데 왜 굳이 localhost로 접근해야 하는지는 보안과 관련이 있습니다.

Admin Application Blcok

보안적인 측면에서 docker-compose 관리 GUI 앱인 dockgeReverse Proxy 관리 GUI 앱인 Nginx Proxy Manager와 같은 관리자 앱들은 굳이 도메인을 열어서 외부에서 접근할 가능성을 조금이라도 열어놓기 싫었습니다. 그래서 외부에서 접근할 일이 있으면 TailScale을 사용해서 터널링을 통해 접근하거나 내부망을 통해서만 접근하기 때문에 localhost접근이 필요했습니다.

Admin URI Block

비슷한 맥락으로 VaultWarden이나 Mealie 등 사용자용 페이지와 관리자용 설정 페이지가 따로 존재하는 앱들이 있습니다. 사용자용 페이지는 당연히 도메인을 연결해서 사용자가 사용할 수 있도록 연결했지만 관리자용 페이지는 굳이 연결을 허용하고 싶지 않기에 URI에 /admin이 들어가면 차단하는 Block-Rule을 적용했습니다. 그래서 /admin이 들어가는 페이지를 사용할 때는 위와 마찬가지로 TailScale이나 내부망을 사용해서 접근합니다.

How

Kubernetes에서는 localhost로 접근할 수 있는 여러가지 방법이 있습니다.

1. port-forward

관리자용 페이지를 자주 들어가지 않거나 디버깅 목적으로 사용되는 표준 방식입니다. IngressService의 노출 없이 안전한 터널을 뚫습니다.

kubectl port-forward --address 0.0.0.0 svc/<service-name> -n <name-space>
  • --address 0.0.0.0 : port-forward는 기본적으로 localhost만 허용합니다. 하지만 저는 외부에서 TailScale을 사용하거나 내부망에서 다른 호스트로 접근하므로 이 옵션을 통해 외부 IP를 허용해야 합니다.

Tip

사용을 종료하려면 Ctrl + c를 통해 터널링을 종료하면 됩니다.

Caution

가장 빠르고 간편한 방법이지만 관리 페이지를 주기적으로 들어간다면 계속 터널링을 했다가 종료했다가 하는 번거로움이 있습니다.

2. NodePort

ServiceNodePort로 변경하면 Docker의 포트 매핑처럼 내부 IP를 통해 접근할 수 있습니다.

Service
apiVersion: v1
kind: Service
metadata:
  name: vaultwarden
  namespace: core-infra
spec:
- type: ClusterIP
+ type: NodePort
  selector:
    app: vaultwarden
  ports:
    - name: http
      port: 80
      targetPort: 80
+     nodePort: 30080

Warning

NodePort는 30000 ~ 32767 사이의 포트번호만 허용됩니다.