☸️ Kubernetes

Notes / 오케스트레이션 / 형님IT 쿠버네티스 책 (김정우) 완료

🗺️ 학습 로드맵

이 책은 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 기초 및 클러스터 관리

목표: Kubernetes가 "컨테이너를 운영(배포·확장·복구)"하는 방식과 핵심 오브젝트(Pod/Deployment/Service)를 설명할 수 있다.

1) Kubernetes 한 줄 정의

  • Kubernetes(K8s) = 컨테이너를 대규모로 배포·운영·확장하는 오케스트레이션(Orchestration) 시스템
  • Docker로 만든 컨테이너를 "많은 서버"에 자동으로 배치하고, 죽으면 살리고, 트래픽에 따라 늘리고 관리한다.

2) 왜 필요한가?

flowchart LR D[Deployment
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: Pod가 죽어도 Controller가 자동으로 원하는 상태를 복구

컨테이너가 많아지면 수동 운영이 불가능해진다.

  • 컨테이너 장애 시 자동 복구 (Self-healing)
  • 트래픽 증가 시 자동 확장 (Scaling)
  • 여러 노드에 분산 배치 (Scheduling)
  • 무중단 배포 (Rolling update)
  • 서비스 디스커버리 / 로드밸런싱

3) 클러스터 기본 구조

flowchart TB subgraph CP["Control Plane (Master)"] API[kube-apiserver] ETCD[(etcd)] SCH[kube-scheduler] CM[controller-manager] CCM[cloud-controller-manager] API <--> ETCD API <--> SCH API <--> CM API <--> CCM end subgraph N1[Worker Node 1] KL1[kubelet] KP1[kube-proxy] CR1[container runtime
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
Control Plane이 명령하고 Worker Node가 Pod를 실행한다
구성요소설명
Cluster(클러스터)Kubernetes가 관리하는 전체 환경
Node(노드)컨테이너가 실제로 실행되는 서버
Control Plane 노드클러스터 전체를 관리·조율하는 마스터 역할
Worker 노드실제 애플리케이션 컨테이너가 동작하는 서버

4) 핵심 오브젝트 (암기 포인트)

flowchart LR USER([사용자]) -->|HTTPS| LB[External LoadBalancer] LB --> ING["Ingress Controller
(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)]
외부 요청 → Ingress → Service(로드밸런싱) → Pod 분산 (실시간 흐름)
오브젝트역할핵심 포인트
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) 실습 로드맵 (최소)

  1. Pod 개념 잡기
  2. Deployment로 replicas 늘려보기
  3. Service로 외부(또는 클러스터 내부)에서 접근하기
  4. (다음 단계) Ingress, Helm, 모니터링(Prometheus/Grafana)

💻 1장 — Kubernetes 실습 환경 구성

대상 페이지: 9~34

네트워크 구성

호스트IP역할
master192.168.2.60/24Control Plane
node1192.168.2.61/24Worker Node
node2192.168.2.62/24Worker Node
node3192.168.2.63/24Worker Node
loadbalancer192.168.2.80/24Load 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를 통한 외부 노출
ExternalNameDNS 이름으로 외부 서비스 매핑

🌐 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 를 탭으로 전환하며 연습하세요.

→ kubectl 실습 열기