4 분 소요

[kubernetes]kubernetes(k8s) 기초개념

1. 쿠버네티스란 뭔가?

Kubernetes란?

  • 컨테이너 오케스트레이션 툴이라고 함. 컨테이너(주로 Docker)들을 대규모로 효율적이고 자동화되게 배포, 스케일링, 업그레이드, 복구할 수 있도록 도와줌.
  • 구글에서 내부적으로 사용하던 Borg 시스템을 바탕으로 오픈소스로 발전시킨 프로젝트임.
  • 여러 개의 컨테이너를 운영하다 보면, 수동으로는 관리하기 어려운데 이를 자동화해주는 시스템이라고 보면 됨.

2. 쿠버네티스의 주요 구성요소

쿠버네티스 클러스터는 크게 Master Node(제어 노드)Worker Node(작업 노드)로 구성됨. 각각 내부적으로 여러 컴포넌트를 포함하는데, 아래와 같음.

2.1 Master Node(제어 노드)

  1. API Server (kube-apiserver)

    • 쿠버네티스의 프론트엔드 역할을 하는 핵심 컴포넌트임.
    • kubectl이나 다른 내부 컴포넌트들이 모든 요청을 보낼 때, API Server가 이를 받아서 클러스터 상태를 갱신하거나 정보를 제공함.
    • 모든 쿠버네티스 오브젝트 생성/수정/삭제 작업이 API Server를 통해 이뤄짐.
  2. etcd

    img

    • 키-값 저장소로, 쿠버네티스의 모든 상태 정보를 저장함.
    • 클러스터 구성, 파드 정보, 컨피그 등등이 여기 저장되고, API Server가 접근함.
    • 고가용성(HA)을 위해 보통 여러 노드에 분산 구성하기도 함.
  3. Scheduler (kube-scheduler)

    • 새로운 파드를 어디(어떤 Worker Node)에 배치할지를 결정해주는 역할을 함.
    • 노드들의 리소스(메모리, CPU, taint/toleration 등)를 보고, 파드를 어느 노드에 배정할지 계산함.
  4. Controller Manager (kube-controller-manager)

    • 여러 컨트롤러(ReplicaSet, Deployment, Node 컨트롤러 등)를 관리하는 집합체.
    • 파드 개수가 지정된 만큼 유지되도록 하거나, 노드 상태를 모니터링하고 다운된 노드를 감지하는 등의 작업을 함.
  5. Cloud Controller Manager (선택사항)

    • 클라우드 환경(GCP, AWS, Azure 등)에서 특정 클라우드 리소스(Load Balancer, Disk 등)를 제어하는 역할.
    • 일반적인 온프레미스 환경이나 미니쿠베(minikube) 실습에서는 크게 신경 안 써도 됨.

정리: Master Node는 클러스터 전체를 ‘통제’하는 중추임. API Server를 통해 명령이 들어오면 Scheduler, Controller Manager, etcd 등이 상호작용하면서 파드나 노드 상태를 관리함.


2.2 Worker Node(작업 노드)

  1. Kubelet
    • 각 Worker Node에 상주하면서, Master Node(API Server)의 명령을 받아 실제 파드를 실행하거나 종료함.
    • 파드의 라이프사이클을 관리하고, 상태 정보를 주기적으로 보고함.
  2. Container Runtime
    • 실제 컨테이너를 실행하는 도구(Docker, containerd, CRI-O 등).
    • Kubelet이 “컨테이너를 실행해”라고 요청하면, 이 런타임이 실제로 컨테이너를 띄움.
  3. kube-proxy
    • 서비스(서비스 오브젝트) 트래픽을 각 파드로 라우팅해주는 네트워크 프록시 역할을 함.
    • 각 노드에 배포되어, iptables/IPVS 등을 사용해서 클러스터 내부에서 서비스 로드밸런싱이 가능하게 해줌.

정리: Worker Node는 실제 파드가 동작하는 공간임. Master Node에서 “이렇게 해”라고 지시하면 Kubelet이 명령을 받아 컨테이너를 실행하고, kube-proxy를 통해 네트워크 설정을 처리함.


3. 쿠버네티스의 철학

  • 선언적(Declarative) 구성: YAML이나 JSON으로 “내가 원하는 최종 상태”를 정의하면, 쿠버네티스가 그 상태를 보증하려고 노력함.
  • 자동 복구(Self-healing): 파드(컨테이너)가 죽으면 다시 살려주고, 노드 다운 시 다른 노드로 스케줄링해주고, 이런 식으로 자동으로 시스템 안정성을 지켜줌.
  • 확장성(Scalability): 파드를 늘렸다 줄이는 스케일링 작업을 쉽게 할 수 있음.

4. 오브젝트(Object)란?


쿠버네티스에서 관리하는 리소스(자원)들을 통칭해서 “오브젝트”라 부름. 오브젝트는 크게 다음과 같은 것들이 대표적임:

Kubernetes Deployment vs Service: What's the Difference?


4.1 Pod

  • 컨테이너를 감싸는 가장 작은 배포 단위.
  • 보통 1개의 컨테이너를 갖지만, 필요에 따라 사이드카 패턴으로 여러 컨테이너를 갖기도 함.
  • 자체 IP를 가지고, 파드끼리는 클러스터 IP를 통해 통신 가능.

1.1 파드(Pod)

  • 쿠버네티스에서 컨테이너를 실행하는 가장 작은 단위.
  • 쉽게 말하면 “하나 이상의 컨테이너 + 네트워크/스토리지 설정을 묶은 것”
  • 휘발성이라 보통 직접 쓰지 않고, Deployment 같은 상위 오브젝트로 관리함.

4.2 ReplicaSet

  • “지정된 개수(replicas)만큼 파드를 유지”해주는 컨트롤러 오브젝트.
  • 특정 라벨(label)을 가진 파드를 지정된 개수만큼 유지하고, 죽으면 다시 만들고, 많으면 줄임.

4.3 Deployment

  • ReplicaSet을 업데이트/롤백 등 편리하게 관리할 수 있게 한 상위 개념.
  • 사용자 입장에서는 Deployment만 다루고, ReplicaSet은 내부적으로 자동 관리됨.

Deployment 예시 YAML

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deploy
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-container
        image: nginx:1.21
  • 이 파일을 my-deploy.yaml로 저장 후 아래 명령으로 배포:
kubectl apply -f my-deploy.yaml
  • my-deploy라는 이름의 Deployment 생성 + ReplicaSet + Pod 3개 자동 생성

4.4 Service

  • 파드들의 IP가 유동적인 문제를 해결해주는 로드밸런싱/네트워크 오브젝트
  • 클러스터 내부 통신용(ClusterIP), 외부 노출용(NodePort, LoadBalancer) 설정 가능
  • 라벨 셀렉터로 파드를 묶고, 가상 IP로 접근 가능하게 해줌

Service 예시 YAML

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: ClusterIP
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
kubectl apply -f my-service.yaml

4.5 ConfigMap / Secret

  • ConfigMap: 일반 설정 (환경변수 등)
  • Secret: 민감한 정보 (비밀번호 등)
  • 파드에 환경변수나 볼륨으로 주입 가능

4.6 PersistentVolume(PV) / PersistentVolumeClaim(PVC)

  • 파드 재시작 시에도 데이터가 유지되도록 해주는 스토리지 오브젝트
  • 정적/동적 할당 가능

결론: 쿠버네티스는 “오브젝트를 정의하고, API Server에 등록해서 관리하는 시스템”임.


5. 오브젝트 생성 & 관리하기 - kubectl 명령어


쿠버네티스를 다룰 때 kubectl을 많이 쓰게 됨. 많이 쓰는 명령어를 표로 정리해봤음:

Kubectl Apply vs. Create

명령어 설명 예시
kubectl run 예전 방식. 현재는 기능 축소됨 kubectl run my-pod --image=nginx --restart=Never
kubectl create 리소스가 없을 때만 새로 생성 kubectl create -f my-deploy.yaml
kubectl apply 선언적 방식. 없으면 생성, 있으면 업데이트 kubectl apply -f my-deploy.yaml
kubectl get 리소스 목록 조회 kubectl get pods
kubectl describe 리소스 상세 정보 kubectl describe pod my-pod
kubectl delete 리소스 삭제 kubectl delete -f my-deploy.yaml
kubectl edit 리소스 편집 kubectl edit deployment my-deploy
kubectl logs 로그 확인 kubectl logs my-pod
kubectl exec 파드 내부에서 명령 실행 kubectl exec -it my-pod -- /bin/bash

5.1 spec을 지정해 오브젝트 생성하기

  • YAML로 정의한 후 kubectl apply로 선언적으로 배포하는 게 일반적
  • 버전 관리와 추적이 쉬움 (GitOps 등 활용)

6. 쿠버네티스 파드 자동복구 / 동작보증


자동복구 (Self-healing)

  • 파드가 죽거나 노드가 다운되면, 쿠버네티스가 자동으로 새 파드를 생성

동작보증

  • 선언된 상태(replicas: 3)를 항상 유지하려고 시도

6.1 예시로 자동복구 확인하기

kubectl delete pod <파드이름>
kubectl get pods
  • 삭제한 파드 대신 새로운 파드가 자동으로 생김

7. 노드 자원 보호와 유지보수 (drain & cordon)


  • 노드가 과부하 상태일 때 새 파드를 막거나, 노드에서 파드를 제거 가능

7.1 kubectl cordon

kubectl cordon <노드이름>
  • 해당 노드에 새 파드 배치 금지
  • 기존 파드는 그대로 유지

7.2 kubectl drain

kubectl drain <노드이름> --ignore-daemonsets --force --delete-emptydir-data
  • 노드에서 모든 파드를 제거
  • 데몬셋 무시, 임시 볼륨 삭제 포함

8. 파드 업데이트 & 복구 (롤백)


8.1 롤링 업데이트 예시

# 기존 nginx:1.21 → nginx:1.23 으로 수정
spec:
  containers:
  - name: my-container
    image: nginx:1.23
kubectl apply -f my-deploy.yaml
  • 새로운 파드가 점진적으로 생성됨

8.2 롤백

kubectl rollout undo deployment my-deploy
kubectl rollout undo deployment my-deploy --to-revision=2
  • 이전 버전으로 되돌리기

8.3 상태 확인

kubectl rollout status deployment my-deploy

9. 정리


  • 쿠버네티스는 컨테이너를 자동으로 배포/복구하는 시스템
  • Master Node: API Server, Scheduler, etcd 등으로 클러스터 제어
  • Worker Node: Kubelet, kube-proxy 등으로 파드 실행
  • YAML로 오브젝트를 정의하고 kubectl apply로 선언적으로 관리
  • 유지보수 시 cordon, drain 명령 사용
  • Deployment로 롤링 업데이트와 롤백 가능

댓글남기기