1.  Minikube란?

Minikube는 쿠버네티스를 로컬에서 쉽게 돌리게 하는 도구이다. Minikube를 사용하면 싱글 노드 쿠버네티스 클러스터가 로컬 컴퓨터의 VM에서 실행된다.

다음은 Minikube 기능이다.

  • DNS
  • NodePorts
  • ConfigMaps and Secrets
  • Dashboards
  • Container Runtime: Docker, CRI-O, and containerd
  • Enabling CNI (Container Network Interface)
  • Ingress

2. 설치

$ brew cask install minikube
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
==> New Formulae
codespell                     이 이메일 주소가 스팸봇으로부터 보호됩니다. 확인하려면 자바스크립트 활성화가 필요합니다.                       libsigc++@2                   wiiuse
==> Updated Formulae
jenkins ✔                     gdl                           libstrophe                    rtags
python ✔                      geckodriver                   libtorrent-rasterbar          rtmpdump
afflib                        gedit                         libvmaf                       rust
allure                        getdns                        libvoikko                     rustup-init
amtk                          ghc                           libwebsockets                 s3ql
anjuta                        git                           libxml++                      salt
ansible                       git-quick-stats               libxml++3                     이 이메일 주소가 스팸봇으로부터 보호됩니다. 확인하려면 자바스크립트 활성화가 필요합니다.
ansible-lint                  git-series                    libxmlsec1                    sccache
ant                           gjs                           libzdb                        scw
apache-arrow                  gkrellm                       lighttpd                      shairport-sync
apr-util                      glib                          links                         shellinabox
armadillo                     glib-networking               magic-wormhole                shibboleth-sp
atk                           glib-openssl                  mame                          signal-cli
atkmm                         glibmm                        maxwell                       simh
aws-sdk-cpp                   glooctl                       media-info                    simple-scan
azure-cli                     gobby                         megatools                     singular
babel                         gobject-introspection         mercurial                     sip
baobab                        golang-migrate                midnight-commander            skopeo
bash-snippets                 goreleaser                    mill                          slowhttptest
bazel                         graph-tool                    minio-mc                      snort
bbftp-client                  graphene                      mitmproxy                     sourcekitten
berkeley-db                   groonga                       mongo-c-driver                spdylay
bind                          grpc                          monkeysphere                  spice-gtk
biogeme                       gsettings-desktop-schemas     mosquitto                     squid
bitchx                        gsmartcontrol                 mutt                          sslsplit
bitcoin                       gspell                        mycli                         sstp-client
buildifier                    gst-plugins-bad               mydumper                      starship
cairomm                       gstreamermm                   mysql-client                  step
certbot                       gtkmm                         mysql-connector-c++           stone-soup
cglm                          gtkmm3                        mytop                         stress-ng
chakra                        gtksourceview4                neomutt                       subversion
circleci                      gtksourceviewmm               netdata                       subversion@1.8
closure-compiler              gtksourceviewmm3              nghttp2                       svtplay-dl
cnats                         gtranslator                   noti                          swagger-codegen
cointop                       gwenhywfar                    nsd                           swagger-codegen@2
conan                         hadolint                      nss                           swi-prolog
conjure-up                    hashpump                      ntl                           synfig
consul-template               helmfile                      oath-toolkit                  sysbench
cppcheck                      hfstospell                    ocrmypdf                      sysdig
credstash                     hledger                       openapi-generator             talloc
crystal-icr                   httpd                         opencv                        tdlib
curl                          httperf                       opencv@2                      telegraf
curl-openssl                  hugo                          opencv@3                      telegram-cli
dcos-cli                      hydra                         openimageio                   teleport
dialog                        icarus-verilog                openldap                      template-glib
dita-ot                       imap-uw                       opensaml                      termius
dive                          innotop                       opusfile                      terragrunt
dmg2img                       ios-webkit-debug-proxy        ori                           testdisk
dnscrypt-proxy                ipmitool                      osquery                       tflint
dnsperf                       ipv6calc                      osslsigncode                  thrift
docker-compose                irssi                         p11-kit                       tinc
docker-machine-completion     isync                         paket                         tintin
doitlive                      janet                         pangomm                       topgrade
dtc                           jsonrpc-glib                  pcb2gcode                     tor
dub                           lasso                         pdftk-java                    typescript
duplicity                     lastpass-cli                  percona-server                unbound
efl                           lazydocker                    percona-toolkit               upscaledb
elinks                        ldapvi                        percona-xtrabackup            urh
emscripten                    libcouchbase                  pgcli                         v8
enchant                       libdap                        php                           vim
eralchemy                     libdazzle                     php-cs-fixer                  vim@7.4
ettercap                      libevent                      php@7.1                       virgil
exim                          libevhtp                      php@7.2                       vte3
exploitdb                     libewf                        pioneer                       vulkan-headers
fabric                        libgda                        postgresql@10                 watchman
fb-client                     libglademm                    postgresql@9.4                webtorrent-cli
fdroidserver                  libgnomecanvasmm              postgresql@9.5                weechat
ffmpeg                        libimobiledevice              postgresql@9.6                wireguard-go
ffmpeg@2.8                    liboauth                      prefixsuffix                  wtf
file-roller                   libogg                        profanity                     wxmaxima
flac                          libopendkim                   proxytunnel                   xml-security-c
flintrock                     libp11                        pspg                          xml-tooling-c
flyway                        libpeas                       pulseaudio                    xmount
fn                            libpq                         pygobject3                    xmrig
folly                         librdkafka                    qt                            xrootd
freetds                       librealsense                  quickjs                       xsimd
frugal                        librsvg                       rclone                        yelp-tools
gdal                          libsigc++                     robot-framework               ykman
gdcm                          libssh                        root                          you-get
gdk-pixbuf                    libssh2                       rpm                           zint
==> Deleted Formulae
engine_pkcs11           irods                   kontena                 nordugrid-arc           skipfish
httest                  konoha                  mysql-cluster           postgres-xc             taisei

==> Tapping homebrew/cask
Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask'...
remote: Enumerating objects: 3643, done.
remote: Counting objects: 100% (3643/3643), done.
remote: Compressing objects: 100% (3633/3633), done.
remote: Total 3643 (delta 24), reused 615 (delta 8), pack-reused 0
Receiving objects: 100% (3643/3643), 1.21 MiB | 1.52 MiB/s, done.
Resolving deltas: 100% (24/24), done.
Tapped 1 command and 3533 casks (3,648 files, 3.9MB).
==> Satisfying dependencies
==> Installing Formula dependencies: kubernetes-cli
==> Installing kubernetes-cli
==> Downloading https://homebrew.bintray.com/bottles/kubernetes-cli-1.15.3.mojave.bottle.tar.gz
==> Downloading from https://akamai.bintray.com/a0/a0ff6595090741872621c7a009020921050815fbab8ad3749486eae25e0cf1fa?__gd
######################################################################## 100.0%
==> Pouring kubernetes-cli-1.15.3.mojave.bottle.tar.gz
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
==> Caveats
Bash completion has been installed to:
  /usr/local/etc/bash_completion.d

zsh completions have been installed to:
  /usr/local/share/zsh/site-functions
==> 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!

3. kubectl 설정

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

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

6. 서비스 생성

Kubernetes 외부에서 접근 가능하도록 서비스로 노출하는 과정이다.

$ kubectl get services
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1            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                443/TCP          93m
myapp        LoadBalancer   10.110.210.149        8180:32221/TCP   2s

7. Dashboard

대시보드를 실행할 수 있다.

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