☸️ Kubernetes
🗺️ 학습 로드맵
이 책은 6단계 학습 경로로 구성되어 있습니다. 각 단계를 순서대로 학습하면 Kubernetes 입문부터 실전 운영까지 체계적으로 익힐 수 있습니다.
[1단계] 환경 구성 → 1장 ~ 3장
[2단계] 핵심 개념 → 4장 ~ 5장
[3단계] 워크로드 관리 → 6장 ~ 7장
[4단계] 네트워킹 → 8장 ~ 9장
[5단계] 설정 관리 → 10장 ~ 12장
[6단계] 스토리지 & 개발환경 → 13장 ~ 14장
| 단계 | 챕터 | 난이도 | 예상 시간 |
|---|---|---|---|
| 1단계 환경 구성 | 1~3장 | ⭐ 입문 | 3~4시간 |
| 2단계 핵심 개념 | 4~5장 | ⭐⭐ 기초 | 3~4시간 |
| 3단계 워크로드 관리 | 6~7장 | ⭐⭐⭐ 중급 | 5~6시간 |
| 4단계 네트워킹 | 8~9장 | ⭐⭐⭐ 중급 | 4~5시간 |
| 5단계 설정 관리 | 10~12장 | ⭐⭐ 기초~중급 | 4~5시간 |
| 6단계 스토리지 & 개발환경 | 13~14장 | ⭐⭐⭐ 중급 | 3~4시간 |
총 예상 학습 시간: 22~28시간
📖 Kubernetes 기초 및 클러스터 관리
1) Kubernetes 한 줄 정의
- Kubernetes(K8s) = 컨테이너를 대규모로 배포·운영·확장하는 오케스트레이션(Orchestration) 시스템
- Docker로 만든 컨테이너를 "많은 서버"에 자동으로 배치하고, 죽으면 살리고, 트래픽에 따라 늘리고 관리한다.
2) 왜 필요한가?
replicas: 3] --> RS[ReplicaSet] RS --> P1[Pod-1 🟢] RS --> P2[Pod-2 🟢] RS --> P3[Pod-3 🔴 crash] CTL{{Controller Loop
desired=3 current=2}} P3 -.감지.-> CTL CTL -.재생성.-> RS RS --> P4[Pod-4 🟢 new]
컨테이너가 많아지면 수동 운영이 불가능해진다.
- 컨테이너 장애 시 자동 복구 (Self-healing)
- 트래픽 증가 시 자동 확장 (Scaling)
- 여러 노드에 분산 배치 (Scheduling)
- 무중단 배포 (Rolling update)
- 서비스 디스커버리 / 로드밸런싱
3) 클러스터 기본 구조
containerd] POD1[Pod · Pod] KL1 --> CR1 --> POD1 KP1 -.iptables/IPVS.-> POD1 end subgraph N2[Worker Node 2] KL2[kubelet] KP2[kube-proxy] CR2[container runtime] POD2[Pod · Pod] KL2 --> CR2 --> POD2 end API <--> KL1 API <--> KL2 USER([kubectl / API Client]) --> API
| 구성요소 | 설명 |
|---|---|
| Cluster(클러스터) | Kubernetes가 관리하는 전체 환경 |
| Node(노드) | 컨테이너가 실제로 실행되는 서버 |
| Control Plane 노드 | 클러스터 전체를 관리·조율하는 마스터 역할 |
| Worker 노드 | 실제 애플리케이션 컨테이너가 동작하는 서버 |
4) 핵심 오브젝트 (암기 포인트)
(nginx · traefik)"] ING -->|host/path 규칙| SVC1[Service: web
ClusterIP :80] ING -->|path /api| SVC2[Service: api
ClusterIP :3000] SVC1 --> P1[Pod web-1] SVC1 --> P2[Pod web-2] SVC2 --> P3[Pod api-1] SVC2 --> P4[Pod api-2] P3 -->|Service: db| SVC3[Service: db] SVC3 --> P5[(Pod postgres)]
| 오브젝트 | 역할 | 핵심 포인트 |
|---|---|---|
| Pod | 실행의 최소 단위 | 보통 컨테이너 1개. 필요 시 여러 컨테이너를 묶음(사이드카 패턴) |
| Deployment | Pod 관리 선언 | "몇 개 유지할지(Replica)", "업데이트 방식" 선언 → 원하는 상태(desired state) 유지 |
| Service | 고정 접점 제공 | Pod IP는 바뀔 수 있음 → 가상 IP/이름 제공 + 여러 Pod로 트래픽 분산 |
| Ingress | 외부 진입 관문 | 외부 HTTP/HTTPS 요청을 내부 Service로 라우팅. 도메인/경로 기반 |
5) 선언형(Declarative) 운영
- YAML로 "이렇게 되길 원한다"를 선언하면, Kubernetes가 상태를 계속 맞춰준다.
- 예:
replicas: 3이면 Pod 3개를 항상 유지하려고 한다.
6) 설정과 비밀 관리
| 리소스 | 용도 |
|---|---|
| ConfigMap | 일반 설정값 |
| Secret | 비밀번호·토큰 같은 민감 정보 |
7) 도커와의 관계 정리
| 도구 | 역할 | 중심 |
|---|---|---|
| Docker | 컨테이너 이미지 만들기/실행 | 패키징 중심 |
| Kubernetes | 컨테이너 운영 | 배포·확장·복구 중심 |
8) 실습 로드맵 (최소)
- Pod 개념 잡기
- Deployment로 replicas 늘려보기
- Service로 외부(또는 클러스터 내부)에서 접근하기
- (다음 단계) Ingress, Helm, 모니터링(Prometheus/Grafana)
💻 1장 — Kubernetes 실습 환경 구성
대상 페이지: 9~34
네트워크 구성
| 호스트 | IP | 역할 |
|---|---|---|
| master | 192.168.2.60/24 | Control Plane |
| node1 | 192.168.2.61/24 | Worker Node |
| node2 | 192.168.2.62/24 | Worker Node |
| node3 | 192.168.2.63/24 | Worker Node |
| loadbalancer | 192.168.2.80/24 | Load Balancer |
가상머신 사양
- Memory: 2GB (2048M)
- Processors: 4 Core
- Hard Disk: 30GB
- OS: CentOS Stream 9 x86_64
- Network: NAT (Vmnet8)
초기 설정
# SELinux permissive 모드 설정
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config
# 방화벽 해제
systemctl disable --now firewalld
# 네트워크 통신 테스트
nmap -sP 192.168.2.0/24
ping node1 -c 3
/etc/hosts 설정
192.168.2.60 master.example.com master
192.168.2.61 node1.example.com node1
192.168.2.62 node2.example.com node2
192.168.2.63 node3.example.com node3
192.168.2.80 lb.example.com lb
.vimrc 설정
set number
set ai
set si
set cindent
set shiftwidth=4
set tabstop=4
set expandtab
set background=dark
colorscheme ron
🖥️ 2장 — minikube 설치
대상 페이지: 35~52
로컬 환경에서 Kubernetes 클러스터를 단일 노드로 실행할 수 있도록 해주는 도구. 개발 및 학습 용도에 적합합니다.
minikube 설치
curl -LO [minikube 다운로드 URL]
install minikube-linux-amd64 /usr/local/bin/minikube
minikube version
kubectl 설치
curl -LO [kubectl 다운로드 URL]
install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
kubectl version --client
minikube 시작 및 상태 확인
minikube start --driver=none
minikube status
kubectl get nodes
기본 명령어
minikube stop # 중지
minikube delete # 삭제
minikube dashboard # 웹 대시보드 실행
minikube addons list # 애드온 목록
Docker 드라이버로 시작
minikube start --driver=docker --container-runtime=docker
⚙️ 3장 — Kubernetes 설치 (Kubespray)
대상 페이지: 53~70
Kubespray(Ansible 기반)를 이용한 멀티노드 클러스터 구성. master + node1~3 환경.
1. Docker 설치 (master, node1~3 공통)
yum install epel-release -y && \
curl -fsSL [Docker 설치 URL] -o get-docker.sh && \
sh ./get-docker.sh && \
systemctl enable --now docker.service
systemctl status docker
2. Python 3.9 설치
yum -y install python39 && \
rm -f /usr/bin/python3 && \
ln -s /usr/bin/python3.9 /usr/bin/python3
python3 --version
3. 필수 패키지 설치 (master)
yum -y install python3-pip wget git vim sshpass
python3 -m pip install --upgrade pip
4. Kubespray 다운로드 및 설정
git clone [Kubespray URL]
cd kubespray
pip3 install -r requirements.txt
cp -rfp inventory/sample inventory/mycluster
5. 인벤토리 설정
declare -a IPS=(192.168.2.60 192.168.2.61 192.168.2.62 192.168.2.63)
CONFIG_FILE=inventory/mycluster/hosts.yaml \
python3 contrib/inventory_builder/inventory.py ${IPS[@]}
6. SSH 키 배포
ssh-keygen -t rsa
ssh-copy-id root@192.168.2.60
ssh-copy-id root@192.168.2.61
ssh-copy-id root@192.168.2.62
ssh-copy-id root@192.168.2.63
7. Kubernetes 설치 실행
ansible-playbook -i inventory/mycluster/hosts.yaml \
--become --become-user=root cluster.yml
8. 설치 확인
kubectl get nodes
# NAME STATUS ROLES AGE VERSION
# master Ready control-plane 10m v1.xx.x
# node1 Ready <none> 8m v1.xx.x
# node2 Ready <none> 8m v1.xx.x
# node3 Ready <none> 8m v1.xx.x
🚀 4장 — Kubernetes 컨테이너 실행하기
대상 페이지: 71~96
kubectl 주요 명령어
kubectl run <파드명> --image=<이미지>
kubectl get pods
kubectl get pods -o wide
kubectl describe pod <파드명>
kubectl delete pod <파드명>
kubectl logs <파드명>
kubectl exec -it <파드명> -- /bin/bash
명령형으로 컨테이너 실행
kubectl run nginx --image=nginx
kubectl get pods
kubectl get pods -o wide
YAML 파일로 컨테이너 실행
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
kubectl apply -f nginx-pod.yaml
kubectl get pods
포트 포워딩 및 서비스 노출
kubectl port-forward pod/nginx-pod 8080:80
kubectl expose pod nginx-pod --port=80 --type=NodePort
주요 실행 옵션
| 옵션 | 설명 |
|---|---|
--image | 컨테이너 이미지 지정 |
--port | 컨테이너 포트 |
--env | 환경 변수 설정 |
--replicas | 레플리카 수 (디플로이먼트) |
--labels | 레이블 지정 |
로그 및 디버깅
kubectl logs nginx-pod
kubectl logs -f nginx-pod # 실시간 스트리밍
kubectl exec -it nginx-pod -- /bin/bash
kubectl describe pod nginx-pod
🏗️ 5장 — Kubernetes 아키텍처
대상 페이지: 97~132
Control Plane 구성 요소
| 컴포넌트 | 역할 |
|---|---|
kube-apiserver | 클러스터 제어의 프론트엔드. 모든 REST API 요청 처리 |
etcd | 클러스터 상태와 설정을 저장하는 분산 키-값 저장소 |
kube-scheduler | 새로 생성된 파드를 적절한 노드에 할당 |
kube-controller-manager | 레플리케이션·노드·엔드포인트 등 컨트롤러 루프 실행 |
Worker Node 구성 요소
| 컴포넌트 | 역할 |
|---|---|
kubelet | 노드에서 컨테이너 실행 보장 |
kube-proxy | 네트워크 프록시 및 로드밸런싱 |
container-runtime | 컨테이너 실제 실행 (containerd, Docker) |
주요 확인 명령어
# 클러스터 컴포넌트 상태
kubectl get pod -n kube-system -o wide
kubectl get componentstatus
kubectl cluster-info
# 네임스페이스
kubectl get namespaces
kubectl get pods -n kube-system
kubectl create namespace myapp
kubectl 사용 패턴
kubectl get <리소스유형>
kubectl describe <리소스유형> <이름>
kubectl apply -f <파일.yaml>
kubectl delete -f <파일.yaml>
kubectl edit <리소스유형> <이름>
kubectl exec -it <파드명> -- /bin/bash
📦 6장 — Kubernetes 파드
대상 페이지: 133~190
파드는 컨테이너를 구현하는 Kubernetes 최소 단위입니다.
파드 생성 — YAML
apiVersion: v1
kind: Pod
metadata:
name: web1
labels:
app: web
spec:
containers:
- name: web1
image: nginx
ports:
- containerPort: 80
kubectl apply -f pod.yaml
kubectl get pods -o wide
kubectl describe pod web1
kubectl logs web1
kubectl exec -it web1 -- /bin/bash
멀티 컨테이너 파드
apiVersion: v1
kind: Pod
metadata:
name: multi-pod
spec:
containers:
- name: nginx
image: nginx
- name: busybox
image: busybox
command: ['sh', '-c', 'echo Hello && sleep 3600']
사이드카 패턴
spec:
containers:
- name: main
image: nginx
volumeMounts:
- name: shared-vol
mountPath: /usr/share/nginx/html
- name: sidecar
image: busybox
command: ['sh', '-c', 'while true; do date > /shared/index.html; sleep 5; done']
volumeMounts:
- name: shared-vol
mountPath: /shared
volumes:
- name: shared-vol
emptyDir: {}
Resource Requests/Limits
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
상태 확인 Probe
| Probe | 역할 |
|---|---|
livenessProbe | 컨테이너가 살아있는지 확인. 실패 시 재시작 |
readinessProbe | 트래픽 수신 준비 여부 확인 |
startupProbe | 앱 시작 완료 여부 확인 |
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 15
periodSeconds: 10
🎛️ 7장 — Kubernetes 컨트롤러
Deployment, ReplicaSet, DaemonSet, StatefulSet, Job, CronJob 등 파드를 관리하는 컨트롤러.
| 컨트롤러 | 용도 |
|---|---|
| Deployment | 무중단 롤링 업데이트, 롤백 |
| ReplicaSet | 파드 복제본 수 유지 |
| DaemonSet | 모든 노드에 하나씩 파드 배포 (로그 수집 등) |
| StatefulSet | 상태를 가진 앱 (DB 등) — 순서 보장 |
| Job / CronJob | 일회성 / 주기적 배치 작업 |
# Deployment 생성 및 스케일링
kubectl create deployment web --image=nginx --replicas=3
kubectl scale deployment web --replicas=5
kubectl rollout history deployment web
kubectl rollout undo deployment web
🔌 8장 — Kubernetes 서비스
파드를 외부에 노출하는 방법. ClusterIP, NodePort, LoadBalancer, ExternalName, Headless Service.
| 타입 | 설명 |
|---|---|
| ClusterIP | 클러스터 내부 통신만 (기본값) |
| NodePort | 노드 IP + 포트로 외부 노출 (30000~32767) |
| LoadBalancer | 클라우드 LB를 통한 외부 노출 |
| ExternalName | DNS 이름으로 외부 서비스 매핑 |
🌐 9장 — Kubernetes 인그레스
HTTP/HTTPS 트래픽을 클러스터 내 서비스로 라우팅. Ingress Controller (nginx) 기반.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: myapp.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80
🏷️ 10장 — 레이블과 애너테이션
리소스 분류·선택에 사용. 레이블은 셀렉터로 필터링 가능, 애너테이션은 메타데이터 저장.
kubectl get pods -l app=web
kubectl label pod web1 env=production
kubectl annotate pod web1 description="메인 웹 서버"
📋 11장 — 컨피그맵
환경변수·볼륨으로 설정 주입. 코드와 설정 분리.
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
DATABASE_URL: "mysql://db:3306/mydb"
LOG_LEVEL: "info"
🔐 12장 — 시크릿
민감 정보(비밀번호, API 키) 보호. Base64 인코딩 저장.
# 시크릿 생성
kubectl create secret generic db-secret \
--from-literal=password=mypassword
# 확인
kubectl get secret db-secret -o yaml
💾 13장 — Kubernetes 스토리지
PV(PersistentVolume), PVC(PersistentVolumeClaim), StorageClass로 데이터 영속성 확보.
| 개념 | 설명 |
|---|---|
| PV | 관리자가 프로비저닝한 스토리지 리소스 |
| PVC | 사용자가 PV를 요청하는 오브젝트 |
| StorageClass | 동적 프로비저닝 정책 정의 |
💻 14장 — Kubernetes VSCode 연동
Kubernetes VS Code 확장, 원격 클러스터 접속, 디버깅 환경 구성.
- Kubernetes Extension 설치 → 클러스터 자동 감지
- 파드 로그 실시간 스트리밍
- YAML 자동 완성 및 검증
- Port-forward 원클릭 실행
🕹️ 실습 터미널
브라우저에서 돌아가는 시뮬레이터는 별도의 실습 페이지로 분리했습니다. Docker · Linux · Cisco IOS · Kubernetes 를 탭으로 전환하며 연습하세요.