Kubernetes
클러스터의 구성도를 보면 하나 이상의 Control Plane
(Master Node
)과 여러대의 Worker Node
로 구성되는것을 확인할 수 있습니다.
Kubernetes
는 실제로 위와 같은 형태로 동작하지만, 실제로 애플리케이션을 배포하는 경우가 아닌 단순한 테스트를 진행할 경우 위와 같이 클러스터를 구축하는 것은 리소스 비용이 많이 발생합니다.
Minikube 공식 문서
Minikube
란 이름 그대로 작은 Kubernetes
클러스터라고 보면 될 것 같습니다.
공식문서에서는 Minikube
를 로컬 Kubernetes
클러스터를 빠르게 구축하기 위한 도구라고 설명하고 있습니다.
일반적인 Kubernetes
클러스터처럼 Master Node
와 Worker Node
로 구성하는 형태가 아닌,
한대의 로컬 호스트에 Master Node
에 들어갈 컴포넌트와 Worker Node
에 들어갈 컴포넌트를 모두 구성하는 형태입니다.
그럼 앞으로 공부하는 내용들을 실습해보기 위해 Minikube
를 설치해보겠습니다.
Kubernetes 설치 가이드
먼저 설치에 대한 자세한 내용은 위의 공식 문서를 참고하였습니다.
- 2vCore CPU
- 2GB Memory
- 20GB Free Disk
- 컨테이너를 실행하기 위한 런타임 환경(Docker 등)
Minikube
를 통해 Kubernetes
클러스터를 구성하기 위해서는 위의 조건을 만족해야합니다.
저는 AWS의
t3.large 인스턴스를 생성하여 설치를 진행하였습니다.
먼저 Kubernetes
클러스터를 구축하기 위한 Minikube
와 Kubernetes
에 명령을 전달하기 위한 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"}
이제 설치된 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
, podman
, virtualbox
와 같은 Container runtime
환경이 구성되어 있지 않다는 내용입니다.
저는 Docker
런타임 환경을 구축하여 다시 Minikube
를 실행해 보겠습니다.
# 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
실행에 성공했습니다!
이제 클러스터가 정상적으로 구성되었는지 확인해보겠습니다.
$ 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
들을 확인하였습니다.
Kubernetes
의 Master Node
(Control plane
) 컴포넌트인 etcd
, api-server
, controller
, scheduler
와 Worker Node
컴포넌트인 kube-proxy
가 정상적으로 구성되어 있는 것을 확인할 수 있습니다.
추가적으로 kubelet
의 경우 systemctl status kubelet
을 통해 동작하고 있는것을 확인할 수 있습니다.