Cloud Computing & MSA

Mac용 Minikube 설치

sstdio.h·2019년 9월 12일·조회 3,657

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...

20191030 minikube dashboard


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

댓글 0

로그인 후 댓글을 남길 수 있습니다.

아직 댓글이 없습니다.