Minikube는 단일 노드에서 쉽게 쿠버네티스를 테스트할 수 있도록 제공되는 솔루션이다.
단일 노드에서 동작하도록 만들어졌기에 스케일링이 불가능하나 그만큼 경량화되고 간편하다.
필자의 경우 클라우드 쿠버네티스로 서비스를 배포하기 전에 로컬에서 테스트하기 위해 minikube를 사용하였다.
이 글에서 사용된 환경은 2vCPU, 4GB RAM, 20GB의 VM(VMWare)이다.
설치방법은 단순하다.
공식 홈페이지를 따르면 되며, docker와 minikube, kubectl만 설치하면 되기에 1분도 걸리지 않는다.
1. 설치
먼저 본인 환경에 맞게 도커를 설치하자. [공식 홈페이지]
$ sudo dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo $ sudo dnf install -y docker-ce docker-ce-cli containerd.io $ sudo systemctl enable --now docker $ sudo usermod -aG docker <USER_NAME> # <USER_NAME> 사용자가 사용할 수 있게 권한 부여 $ newgrp docker # 그룹 정보 갱신
그 후 본인 환경에 맞게 바이너리를 내려받아 설치하자.
$ curl -LO https://github.com/kubernetes/minikube/releases/latest/download/minikube-linux-amd64 $ sudo install minikube-linux-amd64 /usr/local/bin/minikube && rm minikube-linux-amd64
마지막으로 kubectl을 설치하면 된다. [공식 홈페이지]
$ curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" $ chmod +x kubectl $ sudo mv kubectl /usr/local/bin/
이제 minikube를 실행시켜보자.
도커때문에 루트 권한으로 실행시킬 수 없으니 도커 권한이 부여된 계정으로 로그인해야 한다.
아래 커맨드를 실행하면 기본 이미지가 설치되며 minikube가 실행된다.
$ minikube start --driver=docker
2. 사용
웹서버를 배포하여 간단한 환경을 구축해본다,
먼저 다음의 파일을 저장한다.
apiVersion: apps/v1 kind: Deployment metadata: name: web-server labels: app: web-server spec: replicas: 1 selector: matchLabels: app: web-server template: metadata: labels: app: web-server spec: containers: - name: nginx-container image: nginx:latest ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: nginx-service spec: type: NodePort selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80
그리고 실행하면 된다.
실행한 후 서비스가 정상적으로 등록되었는지 확인하자.
$ kubectl apply -f web-server.yaml $ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 1h nginx-service NodePort 10.107.227.132 <none> 80:31961/TCP 1h
이제 minikube 호스트 OS에서 서비스에 접근해보자.
curl을 통해 nginx에 접근했을 때 아래와 같은 출력이 나오면 성공이다.
참고로 필자의 개방된 포트는 31961이다. (미지정시 30000~32767 사이의 포트가 무작위로 할당된다)
$ curl http://$(minikube ip):31961 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
하지만 minikube의 호스트 OS는 minikube에 접근할 수 있으나 외부에서는 아직 minikube에 접근할 수 없다.
minikube 호스트 OS와 minikube 간 포워딩이 없기 때문이다.
이를 해결하기 위한 두 가지 방법을 소개한다.
3-1. 외부 접근 (프록시)
첫 번째는 kubectl proxy를 사용하는 방법이다.
kubectl proxy는 k8s API 서버와 k8s 호스트 OS 간 프록시 서버를 두는 기능이다.
kubectl proxy –port=8080 –address=0.0.0.0와 같이 포트와 IP 주소를 지정하여 사용하면 된다.
포트와 IP 주소를 지정하지 않는 경우 프록시 서버가 127.0.0.1:8001를 사용하도록 설정된다.
지금은 호스트 OS가 아니라 외부에서 접속하려는 경우이기에 address로 0.0.0.0(모든 네트워크)를 지정해야 한다.
또한 kubectl proxy는 API 요청을 필터링하므로 이를 해제하여 API 요청이 정상적으로 전달되도록 한다.
임시방편이지만 이 방법이 가장 편리하다.
당연히 프록시 서버의 포트 방화벽은 해제해줘야 한다.
참고로 필자의 minikube 호스트 IP는 192.168.108.140이다.
kubectl proxy는 세션을 점유하기에 백그라운드에서 실행하는 걸 추천한다.
$ kubectl proxy --address=0.0.0.0 --disable-filter=true $ curl http://192.168.108.140:8001/api/v1/namespaces/default/services/http:nginx-service:/proxy/
굳이 curl을 해볼 필요도 없이 웹브라우저에서도 정상적으로 동작한다.
3-2. 외부 접근 (포트포워딩)
포트포워딩을 이용하는 방법도 있다.
kubectl은 포트포워딩 기능을 제공하여 k8s 외부에서 k8s 서비스에 접근할 수 있게 한다.
마찬가지로 호스트 OS가 아니라 외부에서 접속하려는 경우이기에 address로 0.0.0.0(모든 네트워크)를 지정해야 한다.
그리고 nodeport가 아니라 서비스에 접근하는 것이기에 서비스 port인 80을 대상으로 해야 한다.
kubectl port-forward 또한 세션을 점유하기에 백그라운드에서 실행하는 걸 추천한다.
$ kubectl port-forward service/nginx-service --address 0.0.0.0 8001:80 $ curl http://192.168.108.140:8001/
굳이 curl을 해볼 필요도 없이 웹브라우저에서도 정상적으로 동작한다.