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