1. Minikube란?
Minikube는 쿠버네티스를 로컬에서 쉽게 실행할 수 있게 해 주는 도구이다. Minikube를 사용하면 로컬 컴퓨터의 VM 또는 컨테이너 런타임 위에서 단일 노드 쿠버네티스 클러스터를 실행할 수 있다.
다음은 Minikube에서 사용할 수 있는 주요 기능이다.
- DNS
- NodePort
- ConfigMap과 Secret
- Dashboard
- 컨테이너 런타임: Docker, CRI-O, containerd
- CNI(Container Network Interface) 활성화
- Ingress
2. 설치
macOS에서는 Homebrew로 Minikube를 설치할 수 있다. 아래 로그는 당시 brew cask install로 설치한 기록이다. 최근 Homebrew에서는 brew install --cask minikube 형식을 사용한다.
$ brew cask install minikube Updating Homebrew... ==> Tapping homebrew/cask ... ==> Satisfying dependencies ==> Installing Formula dependencies: kubernetes-cli ==> Installing kubernetes-cli ... Error: The `brew link` step did not complete successfully The formula built, but is not symlinked into /usr/local Could not symlink bin/kubectl Target /usr/local/bin/kubectl already exists. You may want to remove it: rm '/usr/local/bin/kubectl' To force the link and overwrite all conflicting files: brew link --overwrite kubernetes-cli To list all files that would be deleted: brew link --overwrite --dry-run kubernetes-cli Possible conflicting files are: /usr/local/bin/kubectl -> /Applications/Docker.app/Contents/Resources/bin/kubectl ==> Summary 🍺 /usr/local/Cellar/kubernetes-cli/1.15.3: 234 files, 47.9MB ==> Downloading https://storage.googleapis.com/minikube/releases/v1.3.1/minikube-darwin-amd64 ######################################################################## 100.0% ==> Verifying SHA-256 checksum for Cask 'minikube'. ==> Installing Cask minikube ==> Linking Binary 'minikube-darwin-amd64' to '/usr/local/bin/minikube'. 🍺 minikube was successfully installed!
위 로그의 kubectl 링크 오류는 이미 Docker Desktop 쪽의 kubectl이 /usr/local/bin/kubectl에 있어서 발생한 것이다. Minikube 설치 자체는 마지막 줄처럼 정상 완료되었다.
3. kubectl 설정
minikube start를 실행하면 로컬 클러스터가 생성되고, kubectl이 Minikube 클러스터를 바라보도록 kubeconfig가 설정된다.
$ minikube start 😄 minikube v1.3.1 on Darwin 10.14.6 💿 Downloading VM boot image ... minikube-v1.3.0.iso.sha256: 65 B / 65 B [--------------------] 100.00% ? p/s 0s minikube-v1.3.0.iso: 131.07 MiB / 131.07 MiB [-------] 100.00% 8.83 MiB p/s 15s 🔥 Creating virtualbox VM (CPUs=2, Memory=2000MB, Disk=20000MB) ... 🐳 Preparing Kubernetes v1.15.2 on Docker 18.09.8 ... 💾 Downloading kubeadm v1.15.2 💾 Downloading kubelet v1.15.2 🚜 Pulling images ... 🚀 Launching Kubernetes ... ⌛ Waiting for: apiserver proxy etcd scheduler controller dns 🏄 Done! kubectl is now configured to use "minikube"
4. 확인
4.1. 프로세스 기동 확인
$ ps -ef | grep minikube 501 47998 47971 0 12:28AM ?? 2:22.17 /Applications/VirtualBox.app/Contents/MacOS/VBoxHeadless --comment minikube --startvm 22fef172-48ae-4323-8f5e-e9b2b5d4ee86 --vrde config
4.2. config 파일 확인
$ cat ~/.kube/config
apiVersion: v1
clusters:
- cluster:
certificate-authority: /Users/stdioh/.minikube/ca.crt
server: https://192.168.99.100:8443
name: minikube
contexts:
- context:
cluster: minikube
user: minikube
name: minikube
current-context: minikube
kind: Config
preferences: {}
users:
- name: minikube
user:
client-certificate: /Users/stdioh/.minikube/client.crt
client-key: /Users/stdioh/.minikube/client.key
4.3. 클러스터 구성 상태 확인
$ kubectl cluster-info Kubernetes master is running at https://192.168.99.100:8443 KubeDNS is running at https://192.168.99.100:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
4.4. 노드 확인
$ kubectl get nodes NAME STATUS ROLES AGE VERSION minikube Ready master 61m v1.15.2
5. 배포 구성
아래에서 사용한 myapp은 이전 Mac용 Docker 설치하고 이미지 생성/실행에서 만든 이미지이다.
$ kubectl run myapp --image=myapp --port 8180 --image-pull-policy=Never kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead. deployment.apps/myapp created
Deployment 상태를 확인한다.
$ kubectl get deployments NAME READY UP-TO-DATE AVAILABLE AGE myapp 0/1 1 0 9m
Pod 상태를 확인한다.
$ kubectl get pods NAME READY STATUS RESTARTS AGE myapp-68dd644587-54xxj 0/1 ErrImageNeverPull 0 9m4s
ErrImageNeverPull은 --image-pull-policy=Never로 지정했는데 Minikube 노드 안에서 myapp 이미지를 찾지 못할 때 발생한다. Docker Desktop에서 만든 이미지는 로컬 macOS의 Docker 데몬에만 있고, VirtualBox 기반 Minikube 내부 Docker 데몬에는 없기 때문이다.
이 경우 Minikube의 Docker 환경을 바라보도록 설정한 뒤 이미지를 다시 빌드하면 된다.
$ eval $(minikube docker-env) $ docker build -t myapp . $ kubectl delete deployment myapp $ kubectl run myapp --image=myapp --port 8180 --image-pull-policy=Never
이미지를 다시 준비한 뒤에는 Pod가 Running 상태가 되는지 확인한다.
$ kubectl get pods
6. 서비스 생성
Kubernetes 외부에서 접근 가능하도록 Deployment를 Service로 노출하는 과정이다.
$ kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 92m
서비스 상태를 보니 아직 기본 서비스만 있다. myapp을 위한 서비스를 생성한다.
$ kubectl expose deployment myapp --type=LoadBalancer service/myapp exposed
생성 후에 다시 확인한다.
$ kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 93m myapp LoadBalancer 10.110.210.149 <pending> 8180:32221/TCP 2s
Minikube 환경에서는 클라우드 LoadBalancer가 자동으로 붙지 않으므로 EXTERNAL-IP가 <pending>으로 보일 수 있다. 이때는 Minikube가 제공하는 명령으로 서비스 URL을 확인해서 접근한다.
$ minikube service myapp --url
7. Dashboard
Minikube 대시보드를 실행할 수 있다.
$ minikube dashboard 🔌 Enabling dashboard ... 🤔 Verifying dashboard health ... 🚀 Launching proxy ... 🤔 Verifying proxy health ... 🎉 Opening http://127.0.0.1:55317/api/v1/namespaces/kube-system/services/http:kubernetes-dashboard:/proxy/ in your default browser...

8. Minikube 삭제
참고: https://gist.github.com/robinkraft/a0987b50de8b45e4bdc907d841db8f23
아래 명령은 Minikube뿐 아니라 로컬 Docker 컨테이너, 이미지, 볼륨과 kubeconfig 디렉터리까지 삭제하므로 실행 전에 필요한 리소스가 없는지 확인해야 한다.
minikube stop; minikube delete && docker stop $(docker ps -aq) && rm -rf ~/.kube ~/.minikube && sudo rm -rf /usr/local/bin/localkube /usr/local/bin/minikube && launchctl stop '*kubelet*.mount' && launchctl stop localkube.service && launchctl disable localkube.service && sudo rm -rf /etc/kubernetes/ && docker system prune -af --volumes