Docker & Kubernetes 완전 정복 7편: Kubernetes 설치와 클러스터 구성
Docker & Kubernetes Complete Guide Part 7: Kubernetes Installation and Cluster Configuration
서론: Kubernetes 환경 구축의 시작
Kubernetes를 학습하고 활용하기 위한 첫 번째 단계는 적절한 환경을 구축하는 것입니다. 개발 목적, 테스트 환경, 프로덕션 배포 등 사용 목적에 따라 다양한 설치 옵션이 존재합니다. 이번 7편에서는 로컬 개발 환경부터 클라우드 관리형 서비스, 그리고 직접 클러스터를 구축하는 방법까지 Kubernetes 환경 구성에 필요한 모든 것을 다룹니다.
1. 로컬 개발 환경
로컬 개발 환경은 Kubernetes를 학습하거나 애플리케이션을 개발하고 테스트하기에 가장 적합합니다. 별도의 클라우드 비용 없이 자신의 컴퓨터에서 Kubernetes 클러스터를 실행할 수 있습니다.
1.1 Minikube
Minikube는 로컬에서 단일 노드 Kubernetes 클러스터를 실행하기 위한 가장 인기 있는 도구입니다. 다양한 가상화 드라이버를 지원하며, 대부분의 Kubernetes 기능을 로컬에서 테스트할 수 있습니다.
주요 특징:
- 다양한 드라이버 지원 (Docker, VirtualBox, Hyper-V, KVM 등)
- Addons을 통한 확장 기능 (Ingress, Dashboard, Metrics Server 등)
- 멀티 노드 클러스터 시뮬레이션 지원
- 다양한 Kubernetes 버전 선택 가능
1.2 Kind (Kubernetes in Docker)
Kind는 Docker 컨테이너를 노드로 사용하여 로컬 Kubernetes 클러스터를 실행합니다. CI/CD 환경에서 특히 유용하며, 멀티 노드 클러스터를 쉽게 구성할 수 있습니다.
주요 특징:
- Docker만 있으면 실행 가능
- 빠른 클러스터 생성 및 삭제
- 멀티 노드 클러스터 구성 용이
- CI/CD 파이프라인에 적합
1.3 Docker Desktop
Docker Desktop은 Windows와 macOS에서 Docker와 Kubernetes를 함께 사용할 수 있게 해주는 올인원 솔루션입니다. 설정에서 Kubernetes를 활성화하기만 하면 바로 사용할 수 있습니다.
주요 특징:
- 간편한 설치 및 설정
- Docker와 Kubernetes 통합 환경
- GUI를 통한 쉬운 관리
- 자동 업데이트 지원
2. 클라우드 관리형 서비스
프로덕션 환경에서는 클라우드 제공업체의 관리형 Kubernetes 서비스를 사용하는 것이 일반적입니다. 이러한 서비스는 컨트롤 플레인 관리를 클라우드 제공업체가 담당하므로 운영 부담을 크게 줄일 수 있습니다.
2.1 Amazon EKS (Elastic Kubernetes Service)
AWS에서 제공하는 관리형 Kubernetes 서비스입니다. AWS의 다양한 서비스와 긴밀하게 통합되어 있습니다.
주요 특징:
- AWS IAM과 통합된 인증/인가
- ELB, EBS, VPC 등 AWS 서비스와 네이티브 통합
- Fargate를 통한 서버리스 컨테이너 실행
- AWS 글로벌 인프라 활용
2.2 Google GKE (Google Kubernetes Engine)
Kubernetes를 만든 Google에서 제공하는 관리형 서비스입니다. 가장 성숙한 관리형 Kubernetes 서비스 중 하나입니다.
주요 특징:
- Autopilot 모드로 완전 관리형 운영
- 자동 업그레이드 및 복구
- GCP 서비스와 긴밀한 통합
- Anthos를 통한 멀티 클라우드 지원
2.3 Azure AKS (Azure Kubernetes Service)
Microsoft Azure에서 제공하는 관리형 Kubernetes 서비스입니다. Azure 생태계와 완벽하게 통합됩니다.
주요 특징:
- Azure Active Directory 통합
- Azure DevOps와 연동
- Azure Monitor를 통한 모니터링
- Windows 컨테이너 지원
3. kubeadm으로 클러스터 구축
kubeadm은 Kubernetes에서 공식적으로 제공하는 클러스터 부트스트래핑 도구입니다. 베어메탈 서버나 VM에서 프로덕션급 클러스터를 구축할 때 사용합니다.
3.1 사전 요구사항
- Linux 서버 (Ubuntu, CentOS 등)
- 최소 2GB RAM, 2 CPU
- 네트워크 연결 (각 노드 간 통신 가능)
- swap 비활성화
- 컨테이너 런타임 (containerd, CRI-O 등)
3.2 설치 단계
1. 컨테이너 런타임 설치 (containerd 예시):
# 필수 패키지 설치
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
# containerd 설치
sudo apt-get install -y containerd
# containerd 설정
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo systemctl restart containerd
2. kubeadm, kubelet, kubectl 설치:
# Kubernetes apt 리포지토리 추가
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
# 패키지 설치
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
3. 클러스터 초기화 (마스터 노드에서):
# 클러스터 초기화
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
# kubectl 설정
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
4. CNI 네트워크 플러그인 설치 (Flannel 예시):
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
5. 워커 노드 조인:
# 마스터 노드에서 생성된 조인 명령어 사용
sudo kubeadm join <master-ip>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>
4. Minikube 설치와 사용법
가장 접근하기 쉬운 Minikube를 상세히 살펴보겠습니다.
4.1 설치
Windows (PowerShell):
# Chocolatey 사용
choco install minikube
# 또는 직접 다운로드
New-Item -Path 'c:\' -Name 'minikube' -ItemType Directory -Force
Invoke-WebRequest -OutFile 'c:\minikube\minikube.exe' -Uri 'https://github.com/kubernetes/minikube/releases/latest/download/minikube-windows-amd64.exe'
$oldPath = [Environment]::GetEnvironmentVariable('Path', [EnvironmentVariableTarget]::Machine)
[Environment]::SetEnvironmentVariable('Path', "$oldPath;C:\minikube", [EnvironmentVariableTarget]::Machine)
macOS:
# Homebrew 사용
brew install minikube
# 또는 직접 다운로드
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64
sudo install minikube-darwin-amd64 /usr/local/bin/minikube
Linux:
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
4.2 기본 사용법
# 클러스터 시작
minikube start
# 특정 드라이버로 시작
minikube start --driver=docker
# 특정 Kubernetes 버전으로 시작
minikube start --kubernetes-version=v1.29.0
# 리소스 지정
minikube start --cpus=4 --memory=8192
# 클러스터 상태 확인
minikube status
# 클러스터 중지
minikube stop
# 클러스터 삭제
minikube delete
# Kubernetes 대시보드 열기
minikube dashboard
# Addons 관리
minikube addons list
minikube addons enable ingress
minikube addons enable metrics-server
5. kubectl 설치와 설정
kubectl은 Kubernetes 클러스터를 관리하기 위한 명령줄 도구입니다. 거의 모든 Kubernetes 작업에 사용됩니다.
5.1 설치
Windows:
# Chocolatey 사용
choco install kubernetes-cli
# 또는 직접 다운로드
curl.exe -LO "https://dl.k8s.io/release/v1.29.0/bin/windows/amd64/kubectl.exe"
macOS:
# Homebrew 사용
brew install kubectl
# 또는 직접 다운로드
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/
Linux:
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/
5.2 자동 완성 설정
# Bash
echo 'source <(kubectl completion bash)' >> ~/.bashrc
source ~/.bashrc
# Zsh
echo 'source <(kubectl completion zsh)' >> ~/.zshrc
source ~/.zshrc
# 별칭 설정
echo 'alias k=kubectl' >> ~/.bashrc
echo 'complete -F __start_kubectl k' >> ~/.bashrc
6. kubeconfig 파일 이해
kubeconfig 파일은 kubectl이 클러스터에 연결하기 위한 설정을 담고 있습니다. 기본 위치는 ~/.kube/config입니다.
6.1 kubeconfig 구조
apiVersion: v1
kind: Config
current-context: my-cluster
# 클러스터 정보
clusters:
- name: my-cluster
cluster:
server: https://192.168.1.100:6443
certificate-authority-data: LS0tLS1...
# 사용자 인증 정보
users:
- name: admin
user:
client-certificate-data: LS0tLS1...
client-key-data: LS0tLS1...
# 컨텍스트 (클러스터 + 사용자 + 네임스페이스 조합)
contexts:
- name: my-cluster
context:
cluster: my-cluster
user: admin
namespace: default
6.2 컨텍스트 관리
# 현재 컨텍스트 확인
kubectl config current-context
# 사용 가능한 컨텍스트 목록
kubectl config get-contexts
# 컨텍스트 전환
kubectl config use-context my-other-cluster
# 새 컨텍스트 생성
kubectl config set-context my-context --cluster=my-cluster --user=admin --namespace=my-namespace
# 여러 kubeconfig 파일 병합
export KUBECONFIG=~/.kube/config:~/.kube/config-cluster2
kubectl config view --merge --flatten > ~/.kube/merged-config
7. 클러스터 상태 확인
클러스터가 정상적으로 작동하는지 확인하는 다양한 방법을 알아봅니다.
7.1 기본 상태 확인 명령어
# 클러스터 정보
kubectl cluster-info
# 노드 목록 및 상태
kubectl get nodes
kubectl get nodes -o wide
# 상세 노드 정보
kubectl describe node <node-name>
# 컴포넌트 상태 확인
kubectl get componentstatuses
# 모든 네임스페이스의 파드 확인
kubectl get pods --all-namespaces
# 시스템 파드 확인
kubectl get pods -n kube-system
7.2 리소스 사용량 확인
# 노드 리소스 사용량 (metrics-server 필요)
kubectl top nodes
# 파드 리소스 사용량
kubectl top pods
# 특정 네임스페이스의 파드 리소스 사용량
kubectl top pods -n my-namespace
8. 네임스페이스 관리
네임스페이스는 클러스터 내에서 리소스를 논리적으로 분리하는 방법입니다. 팀별, 환경별(dev, staging, prod), 프로젝트별로 리소스를 격리할 수 있습니다.
8.1 기본 네임스페이스
default: 네임스페이스를 지정하지 않으면 사용되는 기본 네임스페이스kube-system: Kubernetes 시스템 컴포넌트가 실행되는 네임스페이스kube-public: 모든 사용자가 읽을 수 있는 공개 리소스용kube-node-lease: 노드 하트비트를 위한 네임스페이스
8.2 네임스페이스 관리 명령어
# 네임스페이스 목록
kubectl get namespaces
kubectl get ns
# 네임스페이스 생성
kubectl create namespace my-namespace
# YAML로 생성
kubectl apply -f - <<EOF
apiVersion: v1
kind: Namespace
metadata:
name: my-namespace
labels:
environment: development
EOF
# 네임스페이스 삭제 (내부 리소스도 모두 삭제됨)
kubectl delete namespace my-namespace
# 특정 네임스페이스에서 작업
kubectl get pods -n my-namespace
kubectl create deployment nginx --image=nginx -n my-namespace
# 기본 네임스페이스 변경
kubectl config set-context --current --namespace=my-namespace
8.3 네임스페이스 리소스 쿼터
# resource-quota.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: my-quota
namespace: my-namespace
spec:
hard:
requests.cpu: "4"
requests.memory: 8Gi
limits.cpu: "8"
limits.memory: 16Gi
pods: "20"
services: "10"
# 리소스 쿼터 적용
kubectl apply -f resource-quota.yaml
# 리소스 쿼터 확인
kubectl describe resourcequota my-quota -n my-namespace
결론
이번 7편에서는 Kubernetes 환경 구축에 필요한 다양한 방법을 살펴보았습니다. 로컬 개발 환경에서는 Minikube나 Kind를 사용하여 빠르게 시작할 수 있고, 프로덕션 환경에서는 클라우드 관리형 서비스나 kubeadm을 통해 안정적인 클러스터를 구축할 수 있습니다.
kubectl과 kubeconfig의 사용법을 익히고, 클러스터 상태 확인 및 네임스페이스 관리 방법을 이해하면 Kubernetes 운영의 기초를 다질 수 있습니다. 다음 8편에서는 Kubernetes의 핵심 리소스인 Pod, Deployment, Service에 대해 자세히 알아보겠습니다.