쿠버네티스의 구조와 Minikube 환경 구성하기

BeomHwan Roh
11 min readJun 6, 2023

--

Kubernetes란?

쿠버네티스는 컨테이너화된 워크로드와 서비스를 관리하기 위한 오픈소스 플랫폼입니다. 줄여서 K8s(K 와 s 사이에 8글자)로도 표기합니다.

애플리케이션을 컨테이너화해서 실행하기 이전에는 하나의 물리서버에서 여러개의 애플리케이션이 실행될 때 서로의 리소스를 침범해 개별 앱의 성능이 저하되는 것을 막기 위해 애플리케이션 격리 도구가상 머신(Virtual Machine, VM)을 활용했었습니다. 각 VM은 하나하나가 가상화된 하드웨어 위에서 운영체제(OS)를 포함한 모든 구성요소를 갖추고 있습니다.

컨테이너 기술은 VM 보다 격리 정도를 완화해 컨테이너간 OS를 공유하였고, VM 대비 경량화에 성공했습니다. 개별 컨테이너는 자체 파일 시스템과 CPU 점유율, 메모리 공간, 프로세스 공간이 있으므로 VM과 마찬가지로 애플리케이션간 인프라 격리를 할 수 있습니다.

가상화 배포와 컨테이너 배포 비교. kubernetes 문서 이미지를 참고해 PowerPoint에서 제작.

쿠버네티스는 더 나아가 컨테이너를 활용한 분산 시스템을 탄력적으로 실행하기 위한 프레임 워크를 제공합니다. 컨테이너를 복제하고 각각의 컨테이너에 할당된 DNS 이름이나 IP 주소를 이용해 트래픽을 로드 밸런싱할 수있고, 배포된 애플리케이션을 업데이트할 때 컨테이너 단위로 롤아웃/롤백을 지원하고, 컨테이너가 다운되었을 때 자동으로 복구할 수 있습니다.

Kubernetes 의 구성 요소

쿠버네티스를 배포하면 쿠버네티스 클러스터(K8s Cluster)를 얻습니다. 클러스터는 컨테이너화된 애플리케이션을 실행하는 워커 머신인 노드(Node)들의 집합이며, 모든 클러스터는 최소 1개 이상의 워커 노드(Worker Node)를 가지고 있습니다. 워커 노드는 애플리케이션의 구성 요소인 파드(Pod)를 호스트합니다.

컨트롤 플레인(Control Plane)은 클러스터 내부의 워커 노드와 워커 노드가 호스트하는 파드를 관리합니다.

K8s 클러스터 구성 요소. 이미지 출처: kubernetes 문서.

Control Plane 구성 요소

  • API server: 쿠버네티스의 프론트 엔드, 모든 [사용자, 관리 장치, 명령어]들은 API server를 통해 쿠버네티스 클러스터와 상호작용합니다. kube-apiserver로 구현됩니다.
  • ETCD: 일관성, 고가용성의 키-값 저장소, 클러스터 내부의 모든 노드들에 대한 정보를 저장합니다.
  • Scheduler: 노드를 배정 받지 못한 새로 생성된 파드를 감지하고 실행할 노드를 선택해 줍니다. kube-scheduler로 구현됩니다.
  • Controller: 오케스트레이션 뒷단에서 두뇌를 담당합니다. [노드, 잡, 엔드 포인트]가 다운되었을 때 반응해 알리고, 이에 대한 대응을 책임집니다. kube-controller-manager로 구현됩니다.

Node 구성 요소

  • Container runtime: 컨테이너 실행을 담당하는 소프트웨어입니다. 대표적으로 도커(Docker)가 있습니다.
  • Kublet: 클러스터의 각 노드에서 실행되는 에이전트입니다. 컨트롤 플레인과 통신하여 파드에서 컨테이너가 잘 실행될 수 있도록 도와줍니다.
  • Kube-proxy: 클러스터의 각 노드에서 실행되는 네트위크 프록시, 노드의 네트워크 내부 규칙을 유지하고 관리합니다.

Minikube 환경 구성하기

Minikube는 쿠버네티스를 로컬 환경에서 사용할 수 있게 만든 쿠버네티스의 가벼운 구현체입니다. 로컬 머신 위에 VM을 만들고 하나의 노드로 구성된 간단한 클러스터를 생성합니다. Minikube는 프로덕션 환경에서 사용하는 것보다 쿠버네티스 환경을 공부하고 실습하는데 최적화되어 있습니다.

프로덕션 환경에서는 클러스터 내 다수의 노드를 구성할 수 있는 kubeadm을 사용합니다.

서버에 Minikube를 설치하고 클러스터를 생성하는 방법에 대해 알아보려고 합니다.

실습 환경

  • Google Compute Engine: e2-medium(2 vCPU, 4GB memory), 20GB storage
  • Ubuntu 22.04, x86/64
  • Windows PowerShell에서 SSH로 원격 접속
  • Zsh

도커 설치

Minikube는 혼자 가동할 수 없고 외부 컨테이너 또는 가상 머신 관리 소프트웨어가 필요합니다. 사용할 수 있는 소프트웨어에는 Docker, Hyper-V, KVM, VirtualBox 등이 있습니다. 이번 실습에서는 minikube에 연결할 외부 컨테이너 관리자로 docker를 사용하려고 합니다.

데비안 계열 리눅스의 설치 패키지 관리 도구인 apt를 이용해서 docker를 설치합니다.

# apt 업데이트
sudo apt update

# Docker 의존성 패키지 설치
sudo apt install \
ca-certificates \
curl \
gnupg \
lsb-release


# GPG 키 발급
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# Docker 리포지토리 연결
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null


# Docker 설치
sudo apt update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

설치가 완료되었는지 확인하기 위해 설치된 도커의 버전을 확인하는 명령어를 호출합니다.

# Docker 버전 확인
docker version

도커 설치 후 docker version 명령어 실행 시 permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock 오류가 발생했었습니다. 해당 오류의 해결 방법이 담긴 github issue의 링크를 아래에 첨부합니다. 단순히 docker.sock 파일의 권한을 666으로 두어도 되지만 댓글에 실제 서비스시 보안에 취약해진다는 지적이 있습니다. 본문과 댓글의 여러 방법을 보고 적용해 해결하면 되겠습니다.

Minikube 설치하기

데비안 계열의 패키지 파일인 .deb 파일을 이용해 minikube를 다운로드 합니다.

# Minikube 데비안 패키지 설치하고 실행하기
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_latest_amd64.deb
sudo dpkg -i minikube_latest_amd64.deb

# 설치 후 설치 파일 제거
rm minikube_latest_amd64.deb

설치가 완료되었는지를 확인하기 위해 minikube의 버전을 확인하는 명령어를 호출합니다.

설치가 확인되었으면 minikube start 명령으로 minikube 클러스터를 시작합니다. minikube는 자동으로 사전에 설치된 docker engine을 드라이버로 감지합니다.

minikube version
minikube start
minikube start 명령어 실행 결과.

minikube는 사용 후에 minikube stop 명령어로 중지할 수 있습니다.

minikube stop 명령어 실행 결과.

kubectl 설치하기

kubectl은 쿠버네티스의 명령줄 도구며, kubectl 명령어를 이용해 클러스터의 컨트롤 플레인과 소통할 수 있습니다. 마찬가지로 apt 설치 도구를 이용해 kubectl을 설치합니다.

# kubectl 의존성 파일 설치하기
sudo apt update
sudo apt install ca-certificates curl apt-transport-https

# GPG 공개키 발급 받기
curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg

# kubernetes apt 리포지토리 연결하기
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

# kubectl 설치하기
sudo apt update
sudo apt install kubectl

설치가 완료되었는지를 확인하기 위해 kubectl의 버전을 확인하는 명령어를 호출합니다.

kubectl version -o=yaml

Minikube 클러스터에 실행 중인 전체 pod, service, replica set, deployment, service를 조회할 수 있는 kubectl get all 명령어를 호출해봅니다.

클러스터 내부에 어떠한 pod, replica set, deployment 없이 쿠버네티스 기본 service만 작동되고 있는 모습을 확인할 수 있습니다. 쿠버네티스 실습을 위한 모든 준비를 마쳤습니다!

참고자료

--

--