PromleeBlog
sitemap
aboutMe

posting thumbnail
쿠버네티스 기초 개념 잡기 왜 필요할까 - DevOps 컨테이너에서 클러스터까지 4편
Kubernetes Basics Why It's Needed - DevOps from Containers to Clusters Part 4

📅

🚀

들어가기 전에 🔗

지난 시간에는 Docker Compose를 이용해 Nginx와 API 서버를 하나의 파일로 묶어 관리하는 방법을 배웠습니다.
이제 우리는 여러 컨테이너로 구성된 애플리케이션도 쉽게 실행할 수 있게 되었습니다.

하지만 Docker Compose는 아주 중요한 한계를 가지고 있습니다.
바로
단 하나의 컴퓨터(호스트)
에서만 동작한다는 점입니다.

만약 우리 서비스가 갑자기 인기를 얻어 트래픽이 몰려들면, 컴퓨터 한 대만으로는 감당할 수 없게 됩니다.
컴퓨터가 고장 나면 서비스 전체가 멈추는 문제도 있습니다.

이러한 문제를 해결하고, 수십, 수백 대의 컴퓨터(서버)에 걸쳐 컨테이너를 안정적으로 운영하기 위해 등장한 기술이 바로
쿠버네티스(Kubernetes)
입니다.
이번 시간에는 왜 쿠버네티스가 필요한지, 그리고 쿠버네티스를 지탱하는 가장 기본적인 개념인 Pod, Deployment, Service에 대해 알아보겠습니다.

🚀

왜 쿠버네티스가 필요한가? (도커의 한계점) 🔗

Docker와 Docker Compose는 컨테이너를 만들고 실행하는 훌륭한 도구입니다.
하지만 여러 대의 서버로 시스템이 확장되는 순간, 새로운 문제들이 발생하기 시작합니다.


이처럼 여러 서버에 걸쳐 컨테이너들을 지휘하고 조율하는 작업을
컨테이너 오케스트레이션(Container Orchestration)
이라고 부릅니다.
마치 오케스트라의 지휘자가 수많은 악기 연주자들을 조화롭게 지휘하는 것과 같습니다.

쿠버네티스는 바로 이 컨테이너 오케스트레이션을 위한 사실상의 표준 도구입니다.
쿠버네티스는 알아서 컨테이너를 비어있는 서버에 배치하고, 컨테이너나 서버에 문제가 생기면 자동으로 복구하며, 복잡한 관리를 대신해 줍니다.

🚀

쿠버네티스 핵심 개념: Pod, Deployment, Service 🔗

쿠버네티스는 그 자체로 하나의 거대한 생태계이며, 고유한 개념들을 가지고 있습니다.
그중에서 가장 기본이 되는 세 가지 개념을 먼저 이해해야 합니다.

Pod (파드): 컨테이너를 감싸는 콩꼬투리 🔗

쿠버네티스는 컨테이너를 직접 실행하지 않고,
Pod
라는 단위 안에 컨테이너를 넣어 실행합니다.
Pod는 쿠버네티스에서 생성하고 관리할 수 있는 가장 작은 배포 단위입니다.

대부분의 경우 하나의 Pod 안에는 하나의 컨테이너만 들어갑니다.

이 Pod라는 집 덕분에 컨테이너는 독립된 네트워크 공간(IP 주소)을 갖게 됩니다.
쿠버네티스는 이 Pod 단위로 컨테이너를 관리하고 모니터링합니다.

Deployment (디플로이먼트): Pod를 관리하는 매니저 🔗

만약 Pod 하나가 어떤 이유로 죽거나 사라지면 어떻게 될까요?
그대로 두면 서비스에 장애가 생길 것입니다.

Deployment
는 우리가 원하는 수의 Pod가 항상 건강하게 실행되도록 관리해주는 역할을 합니다.
마치 아파트 단지의
건설 및 관리 소장님
과 같습니다.

우리가 Deployment에게 "똑같은 모양의 Pod(집) 3개를 항상 유지해주세요" 라고 요청하면, Deployment는 Pod 3개를 만듭니다.
만약 그중 하나가 무너지면(오류로 종료되면), Deployment는 즉시 새로운 Pod를 다시 지어서 3개라는 개수를 맞춰줍니다.
이러한 기능을
Self-healing(자가 치유)
이라고 하며, 덕분에 서비스의 안정성이 크게 높아집니다.

Service (서비스): Pod에게 외부 주소를 열어주는 문패 🔗

Pod는 언제든 죽고 새로 생성될 수 있는 임시 존재입니다.
Pod가 새로 생성될 때마다 매번 새로운 IP 주소를 할당받습니다.

이렇게 IP가 계속 바뀌는 Pod에 사용자가 어떻게 안정적으로 접속할 수 있을까요?
이때 사용하는 것이 바로
Service
입니다.

Service는 여러 개의 동일한 Pod들을 대표하는
하나의 고정된 주소(문패)
역할을 합니다.
사용자는 Service의 고정된 주소로만 접속하면 되고, Service가 알아서 현재 실행 중인 건강한 Pod들 중 하나에게 요청을 전달해줍니다.
덕분에 Pod가 몇 개가 되든, IP 주소가 어떻게 바뀌든 상관없이 서비스를 안정적으로 외부에 노출할 수 있습니다.
Pod - Deployment - Service
Pod - Deployment - Service

🚀

내 컴퓨터에 쿠버네티스 설치하기: Minikube 🔗

이제 개념을 배웠으니 직접 체험해볼 차례입니다.

Mac OS 환경에서 쿠버네티스를 가장 쉽게 학습하는 방법은
Minikube
를 사용하는 것입니다.
Minikube는 내 컴퓨터에 가상으로 작은 1개짜리 노드 클러스터를 만들어주는 도구입니다.

설치는 Homebrew를 이용하면 아주 간단합니다.
터미널을 열고 아래 명령어를 순서대로 입력해주세요.
 # 1. 쿠버네티스 클러스터 제어 도구(kubectl) 설치
brew install kubectl
 
 # 2. Minikube 설치
brew install minikube
설치가 완료되었다면, 다음 명령어로 Minikube 클러스터를 시작합니다.
minikube start
이 과정은 컴퓨터 사양에 따라 몇 분 정도 소요될 수 있습니다.
정상적으로 실행되었는지 확인하려면 아래 명령어를 사용합니다.
minikube status
host, kubelet, apiserver 등이 모두 Running 상태로 보이면 성공입니다.
minikube 실행 완료
minikube 실행 완료

🚀

첫 실습: kubectl로 Nginx Pod 실행하기 🔗

이제 kubectl 이라는 명령어를 사용해 방금 만든 클러스터와 대화해보겠습니다.

1. Deployment 생성하기 🔗

Nginx 컨테이너를 포함하는 Pod를 생성하기 위해, Deployment를 만들어 보겠습니다.
kubectl create deployment nginx-deployment --image=nginx
이 명령어는 nginx 이미지를 사용하는 nginx-deployment라는 이름의 Deployment를 만들라는 의미입니다.
Deployment는 이 명령을 받아 알아서 Pod 1개를 생성합니다.

2. 상태 확인하기 🔗

정말로 Pod가 만들어졌는지 확인해봅시다.
 # 실행 중인 Pod 목록 보기
kubectl get pods
 
 # 생성된 Deployment 목록 보기
kubectl get deployments
NAMEnginx-deployment-로 시작하는 Pod가 보이고, STATUSRunning이라면 성공적으로 실행된 것입니다.

Pod에 대해 더 자세한 정보를 보고 싶다면 describe 명령어를 사용합니다.
 # `[pod-name]` 부분은 `kubectl get pods`로 확인한 실제 Pod 이름으로 바꿔주세요.
kubectl describe pod [pod-name]

3. Pod에 접속하기 🔗

Pod가 잘 실행되었다면, 이제 Nginx 서버에 접속해볼 수 있습니다.
 # Nginx Pod의 IP 주소 확인
kubectl get pod [pod-name] -o wide
  # Pod에 접속하여 Nginx 서버 확인
kubectl exec -it [pod-name] -- /bin/bash
  # Nginx 서버 상태 확인
curl http://localhost
이 명령어를 통해 Nginx 서버의 기본 페이지가 출력되면 성공입니다.
포트 포워딩을 통해 로컬 머신에서 Nginx 서버에 접속할 수도 있습니다.
kubectl port-forward deployment/nginx-deployment 8080:80
이제 웹 브라우저에서 http://localhost:8080 으로 접속하면 Nginx 서버의 기본 페이지를 확인할 수 있습니다.

4. 리소스 삭제하기 🔗

실습을 마쳤으면 생성했던 Deployment를 삭제하여 자원을 정리합니다.
Deployment를 삭제하면, 그에 의해 관리되던 Pod도 함께 삭제됩니다.
kubectl delete deployment nginx-deployment

🚀

결론 🔗

오늘은 Docker와 Docker Compose만으로는 해결하기 어려운 확장성과 안정성 문제를 해결하기 위해
쿠버네티스
가 왜 필요한지 알아보았습니다.
컨테이너 오케스트레이션의 개념을 이해하고, 쿠버네티스의 가장 핵심적인 부품인
Pod(집)
,
Deployment(관리자)
,
Service(주소)
의 역할을 배웠습니다.
또한 Mac에 Minikube를 설치하여 작은 쿠버네티스 클러스터를 만들고, kubectl 명령어를 사용해 첫 Nginx Pod를 직접 실행해보는 경험까지 마쳤습니다.

하지만 오늘 실습에서는 Pod를 실행하기만 했을 뿐, 2편에서처럼 웹 브라우저로 접속하지는 못했습니다.
그 이유는 외부로 통하는 문, 즉 Service를 만들지 않았기 때문입니다.
다음 시간에는 오늘 배운 개념들을 바탕으로, YAML 파일을 이용해 Deployment와 Service를 정식으로 작성하고, Nginx 웹 서버를 클러스터 외부로 노출시켜 접속하는 실습을 진행하겠습니다.

참고 🔗