쿠버네티스 교과서를 보고 실습한 내용
MAC OS
파워셸 설치
brew install --cask powershell
rancherdesktop 설치
https://rancherdesktop.io/에서 다운로드, 마운트, 애플리케이션에 추가
Docker Desktop 설치
https://www.docker.com/products/docker-desktop/
kubernetes cli 설치
brew install kubernetes-cli
minikube 설치
brew install minikube
docker를 드라이버로 사용하는 minikube 시작
minikube start --driver=docker
kubectl로 클러스터에 명령 실행
# 컨테이너 하나를 담은 파드 실행
kubectl run hello-kiamol --image=kiamol/ch02-hello-kiamol
# 파드가 준비상태가 될 때까지 대기
kubectl wait --for=condition=Ready pod hello-kiamol
# 클러스터에 있는 모든 파드의 목록 출력
kubectl get pods
# 파드 상세 정보 확인
kubectl describe pod hello-kiamol




책 실습 예제를 따라가는데 Kubernetes가 실행이 되지 않았다.
찾아본 방법이 Minikube를 설치하는 것인데, Minikube가 뭔지 몰라서 찾아보았다.
| 구분 | Kubernetes | Minikube |
|---|---|---|
| 무엇인가? | 컨테이너 오케스트레이션 시스템 (컨테이너를 자동으로 배포, 관리, 복구 등) | 로컬에서 Kubernetes 클러스터를 실행할 수 있게 해주는 도구 |
| 역할 | 실제 운영 환경에서 애플리케이션을 관리 | 개발/학습 환경에서 Kubernetes를 테스트하기 위한 경량 클러스터 제공 |
| 설치 위치 | 서버, 클라우드 (AWS EKS, GCP GKE 등) | 개인 노트북이나 PC |
| 사용 대상 | 실무 운영, 서비스 배포 | 학습, 실험, 테스트 |
Kubernetes는 원래 여러 대의 서버를 연결해서 구성하는 클러스터이다. 그래서 Minikube를 써서, 내 노트북 1대에 Kubernetes 클러스터를 가상으로 띄우는 것이다.
로컬 개발 환경에서 실습을 빠르게 해 보려면 대부분 Minikube나, Docker Desktop이 필요하다.
정리
Minikube는 쿠버네티스 실습을 위한 로컬 전용 클러스터 실행기 이다.
kubectl: Kubernetes에 명령 보내는 도구
minikube: 내 노트북에 가짜 클러스터 만들어주는 도구
전체 개요
쿠버네티스는 컨테이너를 또 다른 가상 환경인 파드로 감싼다.
파드는 쿠버네티스로 관리되는 자신만의 가상 IP 주소를 가지고, 이 주소로 다른 파드, 다른 노드의 파드와도 통신을 주고받을 수 있다.
보통 하나의 파드는 하나의 컨테이너를 포함한다. 설정에 따라 여러 개의 컨테이너를 포함할 수도 있음. 파드 내의 컨테이너는 같은 가상 환경에 포함됨
->네트워크를 공유하며, localhost로 서로 통신 가능
파드는 파드를 생성할 때 한 노드에 배정됨
이 파드를 관리하고 파드에 포함된 컨테이너를 실행하는 책임도 해당 노드가 맡음
-> CRI(Container Runtime Interface)라는 공통 API를 이용하여 컨테이너 런타임과 연동되는 형태로 진행됨
# 파드에 대한 기본적인 정보 확인
kubectl get pod hello-kiamol
# 네트워크 상세 정보 중 특정 항목 지정 출력
kubectl get pod hello-kiamol --output custom-colums=NAME:metadata.name,NODE_IP:status.hostIP,POD_IP:status.podIP
# JSONPath로 복잡한 출력 구성
# 파드의 첫 번째 컨테이너의 컨테이너 식별자만 출력
kubectl get pod hello-kiamol -o jsonpath='{.status.containerStatuses[0].containerID}'

# 파드에 포함된 컨테이너 찾기
docker container ls -q --filter label=io.kubernetes.container.name=hello-kiamol
# 나는 minikube 내에서 실행했기 때문의 위의 명령어로는 볼 수 없다
kubectl get pod hello-kiamol -o wide
# 해당 컨테아너 삭제하기
docker container rm -f $(docker conatiner ls -q --filter label=io.kubernetes.conatiner.name=hello-kiamol
// kubectl delete pod hello-kiamol
# 파드 상태 확인
kubectl get pod hello-kiamol
# 이전 컨테이너 다시 찾아보기
docker container ls -q --filter label=io.kubernetes.container.name=hello-kiamol
// docker container ls --filter label=io.kubernetes.container.name=hello-kiamol

minikube로 해서 그런지 바로 생기진 않았다. Docker 환경으로 실행해서 따라가야 할 것 같다.



이 상태로 예습하면 그대로 진행된다.

삭제 후 바로 다시 뜬 걸 확인할 수 있음
# 로컬 컴퓨터의 8080번 포트를 주시하다 이 포트로 들어오는 트래픽을 파드의 80번 포트로 전달
kubectl port-forward pod/hello-kiamol 8080:80

localhost:8080에 접속하면 다음과 같은 화면을 확인할 수 있다.

Controller는 Kubernetes에서 '사용자가 정의한 상태(원하는 상태)'와 '실제 상태'를 비교하고, 자동으로 실제 상태를 맞춰주는 로직을 가진 컴포넌트
실제 상태를 지속적으로 감시하고, 자동으로 원하는 상태로 맞춰주는 로직을 가진 컴포넌트
컨트롤러 객체의 예시
| 컨트롤러 객체 | 설명 |
|---|---|
| Deployment | 원하는 수의 Pod가 항상 실행되도록 관리 |
| ReplicaSet | Pod 복제본 개수 유지 |
| StatefulSet | 상태를 가진 서비스(Pod 이름/스토리지 유지) 관리 |
| DaemonSet | 각 노드에 1개씩 Pod 배포 |
| Job / CronJob | 1회성 작업 또는 주기적인 작업 관리 |
| HorizontalPodAutoscaler | 부하에 따라 Pod 수를 자동 조절 |
위 객체들은 모두 컨트롤러에 의해 감시/관리되며, 사용자가 YAML로 원하는 상태를 명시하면, 컨트롤러가 그대로 실행해주는 구조이다.
동작 방식 플로우
YAML 선언 → API Server → etcd 저장
↓
[컨트롤러 감시 시작]
↓
실제 상태와 원하는 상태 비교
↓
필요한 리소스를 생성/삭제/수정
ex) 사용자가 Deploymentdp replica : 3 지정->컨트롤러는 3개의 Pod가 항상 살아있도록 계속 감시하고 보정함
Kubenetes에서 Pod를 안정적으로 실행하고 유지시키는 고수준의 리소스
핵심 기능
Deployment의 구성 구조
내부적으로 ReplicaSet->Pod로 이어지는 계층 구조이다
Deployment
└── ReplicaSet
└── Pod(s)
주요 기능 정리
| 기능 | 설명 |
|---|---|
| Pod 복제 | 여러 개의 Pod를 유지 (replicas) |
| 자동 복구 | Pod가 죽으면 자동 재생성 |
| 롤링 업데이트 | 중단 없이 새 버전 배포 |
| 롤백 | 이전 버전으로 즉시 되돌리기 |
| 버전 관리 | ReplicaSet을 통해 이전 상태 기억함 |
실무 사용처