쿠버네티스 환경이 대중화되면서 다양한 플랫폼을 기반으로 쿠버네티스를 구동할 수 있게 되었습니다.
하지만 쿠버네티스를 프로덕션 환경에 올리기 전에 기술에 익숙해지거나 버전 테스트를 해야 할 수도 있는데요.
이러한 경우에 비용이 청구되는 관리형(Managed) 쿠버네티스나 IaaS VM 기반 쿠버네티스 클러스터에서 이러한 테스트를 하기에는 부담스러운 경우가 많습니다.
그래서 로컬 환경에서 쿠버네티스 클러스터를 쉽게 구성할 수 있는 Minikube나, k3s같은 로컬 쿠버네티스 도구들이 등장했습니다.
본 포스팅에서는 그 중 Minikube를 사용해 쿠버네티스 클러스터를 구성해보는 방법을 알아보겠습니다.
1. 도커 설치
쿠버네티스는 컨테이너 가상화 기술을 기반으로 동작하기 때문에 컨테이너 엔진, 혹은 버추얼 머신 매니저(Virtual Machine Manager)와 같은 도구를 필요로 합니다.
시중에 많은 컨테이너 엔진이 존재하지만, 본 포스팅에서는 도커(Docker)를 설치해서 진행합니다.
도커는 컨테이너 기술의 표준이라고 불릴 만큼 대중적인 오픈소스 컨테이너 플랫폼입니다.
다른 도구들과 달리 도커는 설치가 간편하고 다양한 운영체제를 지원하며 커뮤니티 지원이 활발한 도구이기 때문에 쿠버네티스 실습에도 적합합니다.
도커를 설치하기 위한 운영체제 별 요구 사항은 아래와 같습니다.
Windows
- 21H2 이상 버전의 Windows 11 64-bit Home, Pro, Enterprise, Education
- 2004(19041 빌드) 이상의 Windows 10 Home, Pro 혹은 1909(18363 빌드) 이상의 Windows 10 Enterprise, Education
- WSL2 혹은 Hyper-V 기능 활성화
- 4GB 이상의 메모리
macOS
- 10.15 이상 버전의 Mac OS(Catalina, Big Sur, 혹은 Monterey)
- 4GB 이상의 메모리
TIP. Linux, Apple silicon을 사용하는 MAC 등 다른 환경의 설치 요구 사항은 https://docs.docker.com/desktop/에서 확인할 수 있습니다.
위 사양은 말 그대로 도커를 설치하기 위한 최소 사양이며, 실습 중에는 각종 예제 서비스와 관측 가능성 도구도 설치해야 하기 때문에 원활한 진행을 위해서는 최소 사양보다 더 성능 좋은 CPU, 메모리, 디스크 용량을 필요로 합니다.
다음은 운영체제별 도커 설치 단계입니다.
Windows
- Windows용 도커 데스크톱 설치 파일을 내려받기 위해 웹 브라우저에서 https://www.docker.com/get-started로 접속합니다.
- 도커 공식 홈페이지의 Get Started에서 <Docker Desktop for Windows> 를 클릭해 설치 파일을 내려받습니다
- 내려받은 Docker Desktop Installer 파일을 실행해 도커 설치를 시작합니다.
- Configuration 단계에서 <OK>를 클릭해 도커 설치를 진행합니다.“Install required Windows components for WSL 2”를 체크해 WSL 2 구성 요소 설치도 진행합니다.
- 설치를 완료했다면 명령 프롬프트를 열어 docker -v 명령어를 입력해 설치를 확인합니다. 아래와 같은 출력 결과가 표시됩니다.
macOS
- macOS용 도커 데스크톱 설치 파일을 내려받기 위해 웹 브라우저에서 https://www.docker.com/get-started로 접속합니다.
- 도커 공식 홈페이지의 Get Started에서 <Docker Desktop for Mac>을 클릭해 설치 파일을 내려받습니다. 참고로 macOS용 도커 데스크톱은 인텔 CPU용과 Apple silicon용을 구분하므로 현재 사용하는 MAC 제품군에 맞춰서 설치하기 바랍니다.
- 내려받은 docker.dmg 파일을 실행한 뒤, 드래그 & 드롭(drag and drop)을 통해 도커 실행 파일을 [응용 프로그램] 폴더로 복사합니다.
- 드래그 & 드롭 이후 설치를 진행합니다.
- 설치를 완료했다면 터미널을 열고 docker -v 명령어를 입력해 설치를 확인합니다. 아래와 같은 출력 결과가 표시됩니다.
% docker -v
Docker version 20.10.13, build a224086
여기까지 운영체제별 도커 설치 방법을 알아봤습니다. 이제 도커의 컨테이너 기술을 활용해 쿠버네티스 클러스터를 구성할 수 있게 되었습니다.
클러스터에 각종 서비스와 도구를 설치해 사용하기 위해서는 기본값보다 더 많은 리소스가 필요할 수도 있습니다. macOS 환경의 경우 도커 데스크탑의 [Preference] → [Resources]에서 도커에 할당할 수 있는 CPU와 메모리 용량을 지정할 수 있습니다. 쿠버네티스 클러스터의 리소스 최대값은 여기서 설정 리소스만큼이 됩니다.
Windows 환경의 경우 .wslconfig 파일을 생성하는 것으로 도커에 할당할 수 있는 리소스를 지정할 수 있습니다. 탐색기의 주소 창에 %UserProfile%을 입력해 사용자 디렉토리로 진입합니다.
진입한 사용자 디렉토리에서 .wslconfig 파일을 생성합니다.
.wslconfig 파일을 수정하는 것으로 도커에 할당할 수 있는 리소스를 지정할 수 있습니다. 아래 그림과 같이 processors와 memory 값을 넣는 것으로 도커에 할당할 CPU와 메모리 용량을 지정할 수 있습니다.
설정을 끝마쳤다면 파일을 저장한 뒤, 명령 프롬프트 창을 열어 wsl –shutdown 명령어를 입력해 WSL2를 종료합니다.
이후 다시 wsl을 실행하면 해당 리소스 값이 적용된 도커를 사용할 수 있습니다.
여기까지 도커 설치를 성공적으로 진행했습니다.
참고로 앞으로 쿠버네티스 클러스터를 실행할때 도커는 항상 활성화된 상태여야 합니다.
2. 쿠버네티스 클러스터 구축
도커를 설치해서 컨테이너 기반의 플랫폼인 쿠버네티스를 구성할 준비가 되었습니다.
이제 쿠버네티스 클러스터를 설치해야 하지만, 앞서 말씀드렸듯이 쿠버네티스는 분산 시스템에서 프로덕션 수준의 워크로드를 실행하기 위한 플랫폼이기 때문에 독자 여러분의 노트북, 혹은 데스크탑에서 상용 수준의 쿠버네티스 환경을 구성하기에는 무리가 있습니다.
그래서 Minikube를 사용합니다. Minikube는 쿠버네티스 학습에 필요한 환경을 구축할 수 있는 로컬 머신용 쿠버네티스 도구이기 때문에 Minikube를 통해 실제 서비스에서 운용하는 쿠버네티스와 유사한 환경에서 리소스 제약 없이 쿠버네티스를 학습할 수 있습니다.
또한 Minikube를 설치하면 쿠버네티스 클러스터에 명령을 내리기 위해 필요한 쿠버네티스 커맨드 라인 도구인 kubectl 또한 설치됩니다. 쿠버네티스 클러스터는 kubectl 커맨드 라인 도구로 조작해야 하기 때문에 따로 이 같은 도구를 설치하지 않아도 된다는 편리함이 있습니다.
Minikube를 설치하기 위한 요구 사항은 도커를 설치해 사용할 수 있는 수준이라면 무리없이 충족할 수 있습니다. 다음은 운영체제별 Minikube 설치 단계입니다.
Windows
- Windows OS의 Minikube 설치는 exe 실행 파일을 이용해서 진행할 수 있습니다. 실행 파일을 내려받기 위해 https://minikube.sigs.k8s.io/docs/start/로 접속한 후 Operating system에서 Windows를 선택한 채로 latest release를 클릭합니다.
- 내려받은 minikube-installer.exe 파일을 실행해 설치 과정을 진행합니다. 언어 선택을 묻는 창에서 <OK> 버튼을 클릭해 진행합니다.
- 다음과 동의 버튼을 클릭한 뒤 나타나는 창에서 설치 폴더를 지정한 후 <설치> 버튼을 클릭합니다.
- 설치가 완료되었다면 <다음> 과 <마침> 버튼을 클릭해 설치 과정을 종료합니다.
- 설치가 완료되면 명령 프롬프트를 열어 minikube version 명령어로 설치를 확인할 수 있습니다.
> minikube version
minikube version: v1.25.2
commit: 362d5fdc0a3dbee389b3d3f1034e8023e72bd3a7
macOS
- macOS의 Minikube 설치는 macOS의 패키지 매니저인 Homebrew를 이용해서 진행할 수 있습니다. 터미널을 열고 brew install minikube 명령어를 실행해 minikube 설치를 진행합니다.
% brew install minikube
…
==> Caveats
==> minikube
zsh completions have been installed to:
/usr/local/share/zsh/site-functions
2. 설치가 완료되면 minikube version 명령어로 설치를 확인할 수 있습니다.
% minikube version
minikube version: v1.25.2
commit: 362d5fdc0a3dbee389b3d3f1034e8023e72bd3a7
지금까지 운영체제별 Minikube 설치 단계를 알아봤습니다. 이제 Minikube를 사용해서 로컬 쿠버네티스 클러스터를 구성할 수 있습니다. 다음은 쿠버네티스 클러스터 생성 및 kubectl을 사용한 상호작용 단계입니다. 아래 단계에서 사용되는 명령어는 운영체제에 관계 없이 동일합니다.
3. Minikube를 이용해서 로컬 쿠버네티스 클러스터를 생성하겠습니다. minikube start –cpus=4 –memory 5943 –disk-size 32g 명령어를 실행해 클러스터를 생성합니다. 아래와 같은 출력 결과가 표시됩니다.
% minikube start --cpus 4 --memory 5943
😄 minikube v1.25.2 on Darwin 11.4
🆕 Kubernetes 1.23.3 is now available. If you would like to upgrade, specify: --kubernetes-version=v1.23.3
✨ Using the docker driver based on existing profile
❗ You cannot change the memory size for an existing minikube cluster. Please first delete the cluster.
👍 Starting control plane node minikube in cluster minikube
🚜 Pulling base image ...
🔄 Restarting existing docker container for "minikube" ...
🐳 Preparing Kubernetes v1.22.3 on Docker 20.10.8 ...
🔎 Verifying Kubernetes components...
💡 After the addon is enabled, please run "minikube tunnel" and your ingress resources would be available at "127.0.0.1"
▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
▪ Using image kubernetesui/metrics-scraper:v1.0.7
▪ Using image k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1
▪ Using image kubernetesui/dashboard:v2.3.1
▪ Using image k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1
▪ Using image k8s.gcr.io/ingress-nginx/controller:v1.0.4
🔎 Verifying ingress addon...
🌟 Enabled addons: storage-provisioner, default-storageclass, ingress, dashboard
🏄 Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
TIP. minikube start 명령어의 –cpus, –memory 및 –disk-size 플래그는 각각 클러스터에 할당할 CPU 수, 메모리 용량, 디스크 용량을 뜻합니다. 실습 환경의 하드웨어 스펙에 따라 클러스터에 할당할 리소스를 조절하기 바랍니다.
4. 이제 kubectl을 사용해서 클러스터와 상호작용 할 수 있습니다. kubectl get pod -n kube-system 명령어를 실행해 kube-system 네임스페이스의 파드(pod)를 확인합니다. 아래와 같은 출력 결과가 표시됩니다.
% kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-78fcd69978-n7n7r 1/1 Running 2 (5m9s ago) 62m
etcd-minikube 1/1 Running 2 (40m ago) 62m
kube-apiserver-minikube 1/1 Running 2 (5m9s ago) 62m
kube-controller-manager-minikube 1/1 Running 2 (5m9s ago) 62m
kube-proxy-pr2rw 1/1 Running 2 (5m9s ago) 62m
kube-scheduler-minikube 1/1 Running 2 (40m ago) 62m
storage-provisioner 1/1 Running 5 (4m49s ago) 62m
지금까지 Minikube를 이용해 쿠버네티스 클러스터를 생성하고 kubectl을 이용해 클러스터와 성공적으로 상호작용해 보았습니다.
3. 예제 서비스를 Minikube 클러스터에 배포하기
Minikube 클러스터를 배포했으니 테스트용 서비스를 배포해보겠습니다. 서비스는 쿠버네티스 클러스터에 배포하는 만큼 MSA(Microservice Architecture) 구조를 가지고 있다면 적절할 것입니다.
마침 구글에서는 데모용으로 사용할 수 있는 웹 기반의 전자 상거래(e-commerce) 애플리케이션 ‘Online Boutique’를 제공하고 있습니다. Online Boutique는 쿠버네티스 기반의 마이크로서비스를 시연하기 위해 만들어진 오픈소스 애플리케이션이기 때문에 쿠버네티스 실습에 적합합니다.
다음 설명하는 과정에 따라 앞에서 생성한 쿠버네티스 클러스터에 Online Boutique 애플리케이션을 배포하겠습니다.
- 웹 브라우저에서 https://github.com/GoogleCloudPlatform/microservices-demo로 접속합니다.
2. <Code>를 클릭한 뒤 나타나는 HTTPS 주소를 복사합니다.
3. 터미널에서 git clone 명령어와 복사한 주소를 입력해 git 리포지터리를 로컬 디렉토리로 가져옵니다.
> git clone https://github.com/GoogleCloudPlatform/microservices-demo.git
Cloning into 'microservices-demo'...
remote: Enumerating objects: 4909, done.
remote: Counting objects: 100% (209/209), done.
remote: Compressing objects: 100% (113/113), done.
remote: Total 4909 (delta 113), reused 167 (delta 89), pack-reused 4700
Receiving objects: 100% (4909/4909), 29.03 MiB | 6.22 MiB/s, done.
Resolving deltas: 100% (3263/3263), done.
4. kubectl apply -f ./release/kubernetes-manifests.yaml 명령어로 애플리케이션을 클러스터에 배포합니다.
> kubectl apply -f ./release/kubernetes-manifests.yaml
deployment.apps/emailservice created
service/emailservice created
deployment.apps/checkoutservice created
service/checkoutservice created
deployment.apps/recommendationservice created
service/recommendationservice created
deployment.apps/frontend created
service/frontend created
service/frontend-external created
deployment.apps/paymentservice created
service/paymentservice created
deployment.apps/productcatalogservice created
service/productcatalogservice created
deployment.apps/cartservice created
service/cartservice created
deployment.apps/loadgenerator created
deployment.apps/currencyservice created
service/currencyservice created
deployment.apps/shippingservice created
service/shippingservice created
deployment.apps/redis-cart created
service/redis-cart created
deployment.apps/adservice created
service/adservice created
5. kubectl get pods 명령어로 파드가 정상적으로 배포되었는지 확인합니다. 모든 파드가 배포될 때까지 몇 분의 시간이 소요될 수 있습니다.
> kubectl get pods
NAME READY STATUS RESTARTS AGE
adservice-78c76f67d7-zpcwr 1/1 Running 0 12m
cartservice-7fb7c7bbcf-2ptp2 1/1 Running 0 12m
checkoutservice-7dc67d866f-rsmj2 1/1 Running 0 12m
currencyservice-86cbc887cf-lfjxc 1/1 Running 0 12m
emailservice-5d4d698877-4k7pf 1/1 Running 0 12m
frontend-78756cdbb9-r4tz9 1/1 Running 0 12m
loadgenerator-7ddcddf799-d9snr 1/1 Running 0 12m
paymentservice-66697f866c-qjz4d 1/1 Running 0 12m
productcatalogservice-78b45fdb9f-g4lnt 1/1 Running 0 12m
recommendationservice-58956f7f99-t4jgx 1/1 Running 0 12m
redis-cart-5b569cd47-7xfsd 1/1 Running 0 12m
shippingservice-5cbc5b7c4c-xwxww 1/1 Running 0 12m
TIP. 이 장의 예제 서비스, 혹은 앞으로 실습에 필요한 도구를 설치할 때 리소스 부족으로 파드가 배포되지 않을 수 있습니다. 리소스가 부족하면 minikube start 명령어의 –cpus, –memory 및 –disk-size 플래그를 조절해 리소스를 더 할당해야 합니다(ex: minikube start –cpus=6 –memory=8192 –disk-size=32g).
할당할 수 있는 최대 리소스값은 도커 데스크탑의 [Preference] → [Resource] 탭에서 지정한 값을 따라갑니다.
6. kubectl port-forward deployment/frontend 8080 명령어를 실행해 웹 브라우저에서 웹 애플리케이션에 접속할 수 있도록 포트포워딩을 실행합니다.
> kubectl port-forward deployment/frontend 8080
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080
7. 웹 브라우저에서 localhost:8080을 입력해 접속하면 배포한 웹 애플리케이션 페이지를 볼 수 있습니다.
지금까지 쿠버네티스 클러스터에 예제 서비스인 Online Boutique를 성공적으로 배포했습니다.
앞서 설명한 것처럼 Online Boutique는 마이크로서비스 구조의 웹 애플리케이션이기 때문에 실제 쿠버네티스에 배포되는 서비스와 거의 유사합니다.
이렇게 Minikube를 사용해 테스트용으로 사용할 수 있는 로컬 쿠버네티스 클러스터를 구성했습니다.
'Network' 카테고리의 다른 글
Public Cloud 환경에서 Istio 서비스 메쉬 사용하기 (0) | 2021.09.23 |
---|---|
Rclone을 이용해 편리하게 Storage간 데이터 전송하기 (6) | 2020.10.01 |
X11 Forwarding을 통해 AWS EC2에서 GUI 사용해보기 (0) | 2020.03.13 |
용어를 확실히- Sharding 이란? (0) | 2019.12.24 |
용어를 확실히- RTO,RPO (0) | 2019.12.24 |