미니큐브로 쿠버네티스 컨테이너 오케스트레이션 실습

AWS EKS cluster를 생성하면 컨트롤 플레인을 관리형으로 구성해줍니다.
데이터 플레인은 Managed Node Group, EC2, Fargate 등을 이용해 별도로 구성합니다.
EKS는 비용이 많이 발생하니 연습용 쿠버네티스 클러스터 미니큐브로 학습하는 것이 좋습니다.

쿠버네티스에서 제공하는 미니 큐브는 무료로 사용할 수 있는 로컬 쿠버네티스 환경입니다.
기본값으로 하나의 노드가 컨트롤 플레인 노드와 워커 노드 역할을 모두 수행합니다.

미니큐브 사용법

미니큐브 및 k9s 설치

winget install Kubernetes.minikube
minikube start --driver=docker
winget install -e --id Kubernetes.kubectl
winget install k9s

minikube는 로컬 Kubernetes 클러스터를 띄워주는 도구입니다.
kubectl은 쿠버네티스를 명령어로 조회하고 조작하기 위한 CLI 도구입니다.
k9s는 터미널 화면에서 쿠버네티스 클러스터 리소스를 조회하고 관리할 수 있는 TUI 도구입니다.

미니큐브 대시보드 실행

minikube dashboard

미니큐브 대시보드 실행 후 출력되는 로그에서 대시보드 URL을 복사해 웹으로 접속하면 됩니다.
상단 네임스페이스 선택 박스에서 모든 네임스페이스를 선택하면,
Pods 메뉴에서 쿠버네티스 클러스터 안에서 실행되는 모든 Pod들을 볼 수 있습니다.

k9s 실행

k9s

:를 입력하고 명령 모드에 들어가면, 명령어로 원하는 쿠버네티스 리소스로 빠르게 이동하고 관리 가능합니다.

파드 관리 Deployment 생성

kubectl create deployment Deployment명 --image=registry.k8s.io/e2e-test-images/agnhost:2.39 -- /agnhost netexec --http-port=8080

현재 네임스페이스에서 Deployment와 함께 생성된 Pod가 Running 상태인 것을 확인할 수 있습니다.

k8s에서 Deployment 재시작 방법
Deployment를 선택한 상태에서 R을 누르면,
Deployment가 관리하는 Pod들이 순차적으로 신규 Pod들로 교체됩니다.
기본 RollingUpdate 전략은 점진적으로 신규 Pod를 생성하면서 기존 Pod를 제거합니다.

외부 접근용 LoadBalancer 타입 Service 생성

kubectl expose deployment Deployment명 --type=LoadBalancer --port=8080

Pod는 TCP/IP 기반 통신을 하므로, Pod마다 IP주소가 할당됩니다.
Pod 내부의 컨테이너들은 같은 네트워크 네임스페이스를 사용하므로 같은 IP 주소를 공유합니다.
쿠버네티스 클러스터 네트워크 외부에서 Pod에 접근하려면, Service를 통해 Pod를 노출할 수 있습니다.
Service IP로 Pod를 구분하는 것이 권장됩니다.

미니큐브 환경에서 서비스 접속 URL 확인

minikube service 서비스명

서비스 URL을 통해 Service가 연결된 Pod의 애플리케이션에 웹으로 접근할 수 있습니다.
로컬 PC의 임시 포트로 들어온 요청을 Service의 NodePort로 패킷을 전달합니다.

로컬 임시 포트, 접속 URL은 미니큐브 재시작 후 달라질 수 있습니다.

metrics-server 애드온 활성화

minikube addons enable metrics-server

Minikube 클러스터에 metrics-server 애드온을 활성화하는 명령어입니다.

metrics-server 기동 상태 확인

kubectl get pods -n kube-system

metrics-server가 1/1 Running이고 정상 동작하면,
각 파드가 사용하고 있는 CPU, 메모리 사용량을 확인할 수 있게 됩니다.

파드 리소스 확인 방법

kubectl top pods

metrics-server가 수집한 정보로 현재 Pod들이 CPU와 메모리를 얼마나 쓰고 있는지 확인합니다.

미니큐브 종료 후 재시작 방법

minikube stop
minikube start

쿠버네티스 명령어 정리

https://0songha0.github.io/op/2026-09-17-1


쿠버네티스로 애플리케이션 배포 방법

쿠버네티스 deployment 매니페스트 파일 생성

apiVersion: apps/v1
kind: Deployment
metadata:
  name: 애플리케이션명 # Deployment 이름 (생성되는 pod 이름 프리픽스)
  labels:
    app: 애플리케이션명 # Deployment 자체 라벨

spec:
  replicas: 3 # 유지할 pod 개수 (파드가 삭제되면 Deployment가 자동 생성하여 지정한 개수를 유지)
  selector:
    matchLabels:
      app: 애플리케이션명 # Deployment가 관리할 Pod 라벨

  template:
    metadata:
      labels:
        app: 애플리케이션명 # 생성되는 Pod에 붙이는 라벨 (Deployment/Service selector와 매칭 필요)

    spec:
      containers:
        - name: 애플리케이션명
          image: 이미지명
          ports:
            - containerPort: 3000

          resources:
            requests:
              cpu: "100m"
              memory: "128Mi"

            limits:
              cpu: "200m"
              memory: "256Mi"

프로젝트폴더경로에 k8s 폴더를 만들고, deployment.yaml 파일을 생성합니다.

Scalability 기능 k9s에서 Deployment를 선택하고 S를 누르면,
Deployment가 유지할 Pod 개수 (replicas) 를 직접 변경할 수 있습니다.

쿠버네티스에 애플리케이션 배포

kubectl apply -f /프로젝트폴더경로/k8s/deployment.yaml

deployment.yaml에 정의한 Deployment 설정을 Kubernetes 클러스터에 적용합니다.

Deployment가 지정한 수의 Pod를 생성하고 지속적으로 관리하며,
Deployment에 지정한 이미지를 기반으로 Pod 내부에서 컨테이너가 실행됩니다.

쿠버네티스 service 매니페스트 파일 생성

apiVersion: v1
kind: Service

metadata:
  name: 애플리케이션명-service
  labels:
    app: 애플리케이션명

spec:
  type: LoadBalancer # service 타입
  ports:
    - port: 80 # service가 요청을 받는 포트
      targetPort: 3000 # 요청을 전달할 Pod 포트
      protocol: TCP

  selector:
    app: 애플리케이션명 # Pod 라벨과 매칭

프로젝트폴더경로/k8s 폴더에 service.yaml 파일을 생성합니다.

LoadBalancer 타입 Service를 생성하면 일반적으로 30000~32767 범위 NodePort가 자동 할당됩니다.
외부 TCP 요청은 LoadBalancer의 80 포트로 들어오고, NodePort 30660을 거쳐 Pod 3000 포트로 전달됩니다.

쿠버네티스에 Service 적용

kubectl apply -f /프로젝트폴더경로/k8s/service.yaml

service.yaml에 정의한 service 설정을 Kubernetes 클러스터에 적용합니다.

Minikube Service 접속

minikube service 애플리케이션명-service

위 명령어 실행 시 제공되는 Service 접속 URL을 통해 웹에서 Minikube 내부 Service에 접속합니다.

단일 Pod 매니페스트 파일 생성

apiVersion: v1
kind: Pod

metadata:
  name: 애플리케이션명-pod
  labels:
    app: 애플리케이션명-pod

spec:
  containers:
    - name: 애플리케이션명-pod
      image: rookie0031/sample-server:v1
      
      # 필요한 경우 작성
      # command: 컨테이너 실행 시 실행할 명령어 입력

      ports:
        - containerPort: 3000
  restartPolicy: OnFailure # 컨테이너 프로세스가 오류로 종료된 경우, kubelet이 컨테이너를 다시 실행
  # 생략 시 기본값은 Always (종료 원인과 관계없이 다시 실행)

프로젝트폴더경로/k8s 폴더에 테스트용 단일 pod.yaml 파일을 생성합니다.

쿠버네티스에 단일 Pod 수동 생성

kubectl apply -f pod.yaml

deployment로 관리되지 않는 단일 Pod는 삭제되어도 자동으로 다시 생성되지 않습니다.
쿠버네티스에서는 deployment로 Pod를 생성하고 관리하는 것을 권장합니다.