Kubernetes 실습을 위한 Minikube 환경 구성

Kubernetes 실습을 위한 Minikube 환경 구축

이전에 설명드렸던 Kubernetes 클러스터의 구성도를 보면 하나 이상의 Control Plane(Master Node)과 여러대의 Worker Node로 구성되는것을 확인할 수 있습니다.

쿠버네티스는 실제로 위와 같은 형태로 동작하지만, 실제로 애플리케이션을 배포하는 경우가 아닌 단순한 테스트를 진행할 경우 위와 같이 클러스터를 구축하는 것은 리소스 비용이 많이 발생합니다.


Minikube

Minikube 공식 문서
Minikube란 이름 그대로 작은 쿠버네티스 클러스터라고 보면 될 것 같습니다.
공식문서에서는 Minikube를 로컬 쿠버네티스 클러스터를 빠르게 구축하기 위한 도구라고 설명하고 있습니다.

일반적인 쿠버네티스 클러스터처럼 마스터노드와 워커노드로 구성하는 형태가 아닌,
한대의 로컬 호스트에 마스터노드에 들어갈 컴포넌트와 워커노드에 들어갈 컴포넌트를 모두 구성하는 형태입니다.


Minikube 설치

그럼 앞으로 공부하는 내용들을 실습해보기 위해 Minikube를 설치해보겠습니다.
쿠버네티스 설치 가이드
먼저 설치에 대한 자세한 내용은 위의 공식 문서를 참고하였습니다.

  • 2vCore CPU
  • 2GB Memory
  • 20GB Free Disk
  • 컨테이너를 실행하기 위한 런타임 환경(Docker 등)

Minikube를 통해 쿠버네티스 클러스터를 구성하기 위해서는 위의 조건을 만족해야합니다.

저는 AWS의 t3.large 인스턴스를 생성하여 설치를 진행하였습니다.

1. Minikube 및 Kubectl 설치

먼저 쿠버네티스 클러스터를 구축하기 위한 Minikube와 쿠버네티스에 명령을 전달하기 위한 cli 툴인 kubectl을 설치하겠습니다.

# 클러스터 구축을 위한 minikube 설치
$ curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
$ sudo install minikube-linux-amd64 /usr/local/bin/minikube

# 구축한 클러스터를 제어하기 위한 kubectl 설치
$ curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
$ sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

# 설치정보 확인
$ minikube version
minikube version: v1.25.2
commit: 362d5fdc0a3dbee389b3d3f1034e8023e72bd3a7

$  kubectl version
Client Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.5", GitCommit:"c285e781331a3785a7f436042c65c5641ce8a9e9", GitTreeState:"clean", BuildDate:"2022-03-16T15:58:47Z", GoVersion:"go1.17.8", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.3", GitCommit:"816c97ab8cff8a1c72eccca1026f7820e93e0d25", GitTreeState:"clean", BuildDate:"2022-01-25T21:19:12Z", GoVersion:"go1.17.6", Compiler:"gc", Platform:"linux/amd64"}

2. Minikube 실행

이제 설치된 Minikube를 활용하여 클러스터를 구축해보겠습니다.

# minikube 클러스터 시작
$ minikube start

* minikube v1.25.2 on Ubuntu 20.04
* Unable to pick a default driver. Here is what was considered, in preference order:
* Alternatively you could install one of these drivers:
  - docker: Not installed: exec: "docker": executable file not found in $PATH
  - kvm2: Not installed: exec: "virsh": executable file not found in $PATH
  - podman: Not installed: exec: "podman": executable file not found in $PATH
  - vmware: Not installed: exec: "docker-machine-driver-vmware": executable file not found in $PATH
  - virtualbox: Not installed: unable to find VBoxManage in $PATH

X Exiting due to DRV_NOT_DETECTED: No possible driver was detected. Try specifying --driver, or see https://minikube.sigs.k8s.io/docs/start/

minikube start 명령어를 수행하면 정상적으로 수행이 되지 않습니다.
내용을 살펴보면 docker, kvm2, podman, virtualbox와 같은 컨타이너 런타임 환경이 구성되어 있지 않다는 내용입니다.

저는 Docker 런타임 환경을 구축하여 다시 minkube를 실행해 보겠습니다.

# Docker 런타임 설치
$ apt-get update
$ apt-get install docker.io

# minikube 실행
$ minikube start

* minikube v1.25.2 on Ubuntu 20.04
* Automatically selected the docker driver. Other choices: none, ssh
* The "docker" driver should not be used with root privileges.
* If you are running minikube within a VM, consider using --driver=none:
*   https://minikube.sigs.k8s.io/docs/reference/drivers/none/

X Exiting due to DRV_AS_ROOT: The "docker" driver should not be used with root privileges.

Docker를 설치한 뒤 minikube를 실행해도 정상적으로 실행되지 않았습니다.
이번에는 docker 드라이버를 root 권한으로 실행하지 말라는 경고 메시지를 확인할 수 있습니다.
이는 root 권한으로 docker를 실행하면 보안상 취약점이 생길 수 있기 때문입니다.

해결방안으로는 root가 아닌 다른 계정을 생성해 실행하거나, --driver-none 옵션을 추가하여 minikube를 실행하면 됩니다.

다른 계정을 생성하면 권한에 대한 설정이 필요한데, 로컬 환경에서의 테스트를 위한 클러스터 구축이기 때문에 --driver=none 옵션을 추가하여 minikube를 실행하겠습니다.

# root 권한 경고 메시지 무시 옵션 부여
$ minikube start --driver=none

* minikube v1.25.2 on Ubuntu 20.04
* Using the none driver based on user configuration

X Exiting due to GUEST_MISSING_CONNTRACK: Sorry, Kubernetes 1.23.3 requires conntrack to be installed in root's path

옵션을 추가하여 실행해도 오류가 발생합니다.
이번에는 Kubernetes 1.23.3 버전은 conntrack을 설치해야 실행할 수 있다고 합니다.
conntrack을 설치하고 다시 실행해보겠습니다.

# conntrack 설치 
$ apt-get install conntrack 

# minikube 실행 
$ minikube start --driver=none 

* minikube v1.25.2 on Ubuntu 20.04 
* Using the none driver based on user configuration 

X The requested memory allocation of 1940MiB does not leave room for system overhead (total system memory: 1940MiB). You may face stability issues. 
* Suggestion: Start minikube with less memory allocated: 'minikube start --memory=1940mb' 

* Starting control plane node minikube in cluster minikube 
* Running on localhost (CPUs=2, Memory=1940MB, Disk=19788MB) ... 
* OS release is Ubuntu 20.04.3 LTS
* Preparing Kubernetes v1.23.3 on Docker 20.10.7 ... 
  - kubelet.resolv-conf=/run/systemd/resolve/resolv.conf 
  - kubelet.housekeeping-interval=5m 
    > kubectl.sha256: 64 B / 64 B [--------------------------] 100.00% ? p/s 0s 
    > kubelet.sha256: 64 B / 64 B [--------------------------] 100.00% ? p/s 0s 
    > kubeadm.sha256: 64 B / 64 B [--------------------------] 100.00% ? p/s 0s 
    > kubectl: 44.43 MiB / 44.43 MiB [-------------] 100.00% 41.37 MiB p/s 1.3s 
    > kubeadm: 43.12 MiB / 43.12 MiB [-------------] 100.00% 42.72 MiB p/s 1.2s 
    > kubelet: 118.75 MiB / 118.75 MiB [-----------] 100.00% 45.38 MiB p/s 2.8s 
  - Generating certificates and keys ... 
  - Booting up control plane ... 
  - Configuring RBAC rules ... 

* Configuring local host environment ... 
* 

! The 'none' driver is designed for experts who need to integrate with an existing VM 
* Most users should use the newer 'docker' driver instead, which does not require root! 
* For more information, see: https://minikube.sigs.k8s.io/docs/reference/drivers/none/ 
* 
! kubectl and minikube configuration will be stored in /root 
! To use kubectl or minikube commands as your own user, you may need to relocate them. For example, to overwrite your own settings, run: 
*
  - sudo mv /root/.kube /root/.minikube $HOME
  - sudo chown -R $USER $HOME/.kube $HOME/.minikube 

* 
* This can also be done automatically by setting the env var CHANGE_MINIKUBE_NONE_USER=true 
* Verifying Kubernetes components... 
  - Using image gcr.io/k8s-minikube/storage-provisioner:v5 
* Enabled addons: default-storageclass, storage-provisioner 
* Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

실행에 성공했습니다!

3. 설치 확인

이제 클러스터가 정상적으로 구성되었는지 확인해보겠습니다.

$ kubectl get pod --all-namespaces

NAMESPACE     NAME                                    READY   STATUS    RESTARTS   AGE
kube-system   coredns-64897985d-748ll                 1/1     Running   0          81s
kube-system   etcd-ip-10-0-2-146                      1/1     Running   0          96s
kube-system   kube-apiserver-ip-10-0-2-146            1/1     Running   0          92s
kube-system   kube-controller-manager-ip-10-0-2-146   1/1     Running   0          92s
kube-system   kube-proxy-m7rjw                        1/1     Running   0          81s
kube-system   kube-scheduler-ip-10-0-2-146            1/1     Running   0          95s
kube-system   storage-provisioner                     1/1     Running   0          91s

kubectl get pod --all-namespace를 통해 올라와있는 모든 pod들을 확인하였습니다.
쿠버네티스의 마스너 노드(Control plane) 컴포넌트인 etcd, api-server, controller, scheduler가 정상적으로 구성되어 있는 것을 확인할 수 있습니다.

좋은 웹페이지 즐겨찾기