- Multipass 이용한 kubernetes 로컬 구축
- 로컬 k8s 에서 ngrok ingress controller 로 서비스 인터넷 노출하기 (expose kubernetes services to internet for test)
- Github Self-hosted runner 구축 후 배포 Pipeline 만들기
- ArgoCD 설치 및 github action 배포 환경 구성
소개
로컬환경에서 github webhook 테스트와 같이 잠시 외부 인터넷 노출이 필요한 테스트용 서비스가 있을시 ngrok 을 자주 사용을 하고 있습니다.
로컬 환경에 대해서 인터넷 노출을 위해 별도의 고정 Public IP, DNAT, DNS 설정 등이 필요 없이 간편하게 ngrok 임시 도메인을 통해 외부에서 접속이 가능해서인데요.
그동안은 주로 localhost 에서 특정 포트를 리스닝하는 서비스를 만들고 바로 ngrok agent 로 인터넷 노출을 하는 방식으로 심플하게 사용하였는데요.
로컬의 multipass+kubernetes 환경에 배포한 서비스를 외부에 노출시키고 싶은 일이 생겨 알아보다가 ngrok 에서 kubernetes ingress controller 로 지원한다고 하여 테스트를 해보았습니다.
ngrok 에 대하여
먼저 ngrok 에 대해 간단히 살펴보면 아래와 같습니다.
- 로컬 서비스를 일시적으로 외부 인터넷 노출시켜주는 터널링 도구
- 리버스 프록시 툴
- application 의 front door 역할 가능
ngrok 은 agent 를 설치하여 외부 노출용으로 사용을 할수도 있고, SDK 를 이용하여 application 에서 직접 이용할 수도 있습니다.
ngrok kubernetes ingress controller 구축
ngrok kubernetes ingress controller 를 이용하여 로컬에 구축한 multipass + kubernetes 환경의 서비스를 외부로 노출시켜보려 합니다.
구성은 아래와 같습니다.
사전 필요 작업과 기본적인 구성 절차는 ngrok docs 따라 아래 작업을 우선 완료해봅니다.
- ngrok dashboard 접속 및 로그인
Authtoken
을 만들고,API key
만들고,- Domain 및 Edge 를 만듭니다.
- 만들었던
Authtoken
과API Key
를 환경변수 저장합니다. - cluster 에 helm 이용하여
ngrok ingress conroller
를 설치합니다.
이제 테스트하기 위해 node.js 로 만들어 두었던 Application 을 app
namespace 에 배포 해 줍니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: checkingress
namespace: app
labels:
app: checkingress
spec:
replicas: 2
selector:
matchLabels:
app: checkingress
template:
metadata:
labels:
app: checkingress
spec:
containers:
- name: checkingress-container
image: doyunsang/prv-repo:v22 # from docker hub repository
ports:
- containerPort: 5555
imagePullSecrets:
- name: myregistrykey
그리고 동일한 namespace 에 Service
와 Ingress
를 만들어 줍니다
apiVersion: v1
kind: Service
metadata:
name: checkingress-ngrok
namespace: app
spec:
ports:
- name: http
port: 5555
targetPort: 5555
selector:
app: checkingress
---
# ngrok Ingress Controller Configuration
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: checkingress-ngrok
namespace: app
spec:
ingressClassName: ngrok
rules:
# ngrok dashboard - domain 에서 도메인 생성한 값으로 host 에 적용
- host: macaque-moved-moccasin.ngrok-free.app
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: checkingress-ngrok
port:
number: 5555
배포가 모두 완료되면 ingress 에서 설정하였던 도메인 macaque-moved-moccasin.ngrok-free.app
으로 접속해봅니다.
인터넷에서도 ngrok 도메인으로 잘 접속이 됩니다.
참고 – ngrok ingress controller 의 default 설치 namespace 를 변경하고 싶을 경우
위 ngrok docs 에서는 기본적으로 ingress controller 를 ngrok-ingress-controller
에 설치하고 있는데요.
혹시나 다른 namespace 에 설치하고 싶을 경우도 있을텐데요.
helm install 시 args 로 다른 namespace 명으로 값을 전달해주면 되지만 아래 에러를 만날수도 있습니다.
$ helm install ngrok-ingress-controller ngrok/kubernetes-ingress-controller \
--namespace app \
--set credentials.apiKey=$NGROK_API_KEY \
--set credentials.authtoken=$NGROK_AUTHTOKEN
Error: INSTALLATION FAILED: Unable to continue with install: CustomResourceDefinition "domains.ingress.k8s.ngrok.com" in namespace "" exists and cannot be imported into the current release: invalid ownership metadata; annotation validation error: key "meta.helm.sh/release-namespace" must equal "app": current value is "app"
이때는 CRD
• Custom Resource Definition
• kubernetes 기... 중 domains.ingress.k8s.ngrok.com
에서 release-namespace
의 값을 edit 으로 수정해주면 됩니다.
결론
로컬랩탑에서 VMs 를 구성하고 그안에 테스트용 k8s 를 구축할 경우, k8s 내 서비스를 인터넷으로 오픈하여 hook 테스트 등이 필요할때 ngrok ingress controller 가 아주 유용하였습니다.
AWS 를 이용하면 편하겠지만..돈도 들기도 하고.. 로컬랩탑에 구성한 테스트 k8s 환경을 위해서라면 ngrok 이 베스트 인듯합니다.
별도의 Host 와 VM 간 네트워크 설정도 필요없고, 별도의 도메인설정도 필요없으니까요.
Refs
- https://ngrok.com/
- https://github.com/ngrok/kubernetes-ingress-controller
- https://ngrok.com/docs/using-ngrok-with/k8s/
- https://ngrok.com/blog-post/ngrok-k8s