kubernetes3

MONA·2025년 6월 14일

나혼공

목록 보기
75/92

쿠버네티스 교과서를 보고 실습한 내용

Kubernetes 설치

MAC OS

  1. 파워셸 설치
    brew install --cask powershell

  2. rancherdesktop 설치
    https://rancherdesktop.io/에서 다운로드, 마운트, 애플리케이션에 추가

  3. Docker Desktop 설치
    https://www.docker.com/products/docker-desktop/

  4. kubernetes cli 설치
    brew install kubernetes-cli

  5. minikube 설치
    brew install minikube

  6. docker를 드라이버로 사용하는 minikube 시작
    minikube start --driver=docker

  7. 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

Minikube

책 실습 예제를 따라가는데 Kubernetes가 실행이 되지 않았다.
찾아본 방법이 Minikube를 설치하는 것인데, Minikube가 뭔지 몰라서 찾아보았다.

  • Kubernetes는 개념이고, Minikube는 그 개념을 로컬에서 실행하게 해주는 도구이다
  • Minikube : Docker/HyperKit 위에서 Kubernetes 실행
구분KubernetesMinikube
무엇인가?컨테이너 오케스트레이션 시스템 (컨테이너를 자동으로 배포, 관리, 복구 등)로컬에서 Kubernetes 클러스터를 실행할 수 있게 해주는 도구
역할실제 운영 환경에서 애플리케이션을 관리개발/학습 환경에서 Kubernetes를 테스트하기 위한 경량 클러스터 제공
설치 위치서버, 클라우드 (AWS EKS, GCP GKE 등)개인 노트북이나 PC
사용 대상실무 운영, 서비스 배포학습, 실험, 테스트

Kubernetes는 원래 여러 대의 서버를 연결해서 구성하는 클러스터이다. 그래서 Minikube를 써서, 내 노트북 1대에 Kubernetes 클러스터를 가상으로 띄우는 것이다.
로컬 개발 환경에서 실습을 빠르게 해 보려면 대부분 Minikube나, Docker Desktop이 필요하다.

정리

Minikube는 쿠버네티스 실습을 위한 로컬 전용 클러스터 실행기 이다.
kubectl: Kubernetes에 명령 보내는 도구
minikube: 내 노트북에 가짜 클러스터 만들어주는 도구


쿠버네티스의 컨테이너 실행, 관리

전체 개요

  1. 사용자가 YAML manifest로 리소스를 정의하고 제출
  2. API Server가 요청을 받고 리소스를 저장
  3. Scheduler가 실행 위치(노드)를 결정
  4. kubelet이 실제로 컨테이너 실행을 지시
  5. Pod가 생성되고, 필요시 자동 복구·확장됨
  6. 네트워크와 서비스가 연결되어 접근 가능해짐
  • 컨테이너 : 애플리케이션 구성 요소 하나를 실행하는 가상화된 환경
  • 파드: 컴퓨팅의 단위. 클러스터를 이루는 노드 중 하나에서 실행됨

쿠버네티스는 컨테이너를 또 다른 가상 환경인 파드로 감싼다.
파드는 쿠버네티스로 관리되는 자신만의 가상 IP 주소를 가지고, 이 주소로 다른 파드, 다른 노드의 파드와도 통신을 주고받을 수 있다.

보통 하나의 파드는 하나의 컨테이너를 포함한다. 설정에 따라 여러 개의 컨테이너를 포함할 수도 있음. 파드 내의 컨테이너는 같은 가상 환경에 포함됨
->네트워크를 공유하며, localhost로 서로 통신 가능

  • 파드는 쿠버네티스가 컨테이너를 실행하는 수단
    -> 쿠버네티스가 직접 컨테이너를 실행하지X, 컨테이너를 생성할 책임을 해당 노드에 설치된 컨테이너 런타임에 맡김(도커 등)

파드는 파드를 생성할 때 한 노드에 배정됨
이 파드를 관리하고 파드에 포함된 컨테이너를 실행하는 책임도 해당 노드가 맡음
-> CRI(Container Runtime Interface)라는 공통 API를 이용하여 컨테이너 런타임과 연동되는 형태로 진행됨

  • 위의 실습예제에서는 minikube와 docker를 런타임으로 실행한 것이다.

실습

# 파드에 대한 기본적인 정보 확인
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}'

  • NODE_IP: 가상 머신의 IP 주소
  • POD_IP: 클러스터 속 파드의 가상 IP 주소
# 파드에 포함된 컨테이너 찾기
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 환경으로 실행해서 따라가야 할 것 같다.

Docker desktop으로 Kubernetes 실행하기

  1. Docker Desktop -> Settings -> Kubernetes -> Enable Kubernetes 체크
  1. minikube 삭제

  1. Apply&restart 하면 클러스터가 곧 생성된다.

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

삭제 후 바로 다시 뜬 걸 확인할 수 있음

  • kubectl에는 네트워크 트래픽을 노드에서 파드로 전달할 수 있는 기능이 있다.
    -> 클러스터 외부에서 파드와 통신 가능.
  • 로컬 컴퓨터(클러스터의 노드)의 특정 포트를 주시하도록 하고 이 포트로 들어오는 트래픽을 파드로 전달한다
# 로컬 컴퓨터의 8080번 포트를 주시하다 이 포트로 들어오는 트래픽을 파드의 80번 포트로 전달
kubectl port-forward pod/hello-kiamol 8080:80

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


컨트롤러 객체

Controller는 Kubernetes에서 '사용자가 정의한 상태(원하는 상태)'와 '실제 상태'를 비교하고, 자동으로 실제 상태를 맞춰주는 로직을 가진 컴포넌트
실제 상태를 지속적으로 감시하고, 자동으로 원하는 상태로 맞춰주는 로직을 가진 컴포넌트

컨트롤러 객체의 예시

컨트롤러 객체설명
Deployment원하는 수의 Pod가 항상 실행되도록 관리
ReplicaSetPod 복제본 개수 유지
StatefulSet상태를 가진 서비스(Pod 이름/스토리지 유지) 관리
DaemonSet각 노드에 1개씩 Pod 배포
Job / CronJob1회성 작업 또는 주기적인 작업 관리
HorizontalPodAutoscaler부하에 따라 Pod 수를 자동 조절

위 객체들은 모두 컨트롤러에 의해 감시/관리되며, 사용자가 YAML로 원하는 상태를 명시하면, 컨트롤러가 그대로 실행해주는 구조이다.

동작 방식 플로우

YAML 선언 → API Server → etcd 저장
                    ↓
            [컨트롤러 감시 시작]
                    ↓
       실제 상태와 원하는 상태 비교
                    ↓
      필요한 리소스를 생성/삭제/수정

ex) 사용자가 Deploymentdp replica : 3 지정->컨트롤러는 3개의 Pod가 항상 살아있도록 계속 감시하고 보정함

Deployment

Kubenetes에서 Pod를 안정적으로 실행하고 유지시키는 고수준의 리소스

핵심 기능

  • 원하는 수의 Pod(복제본)를 유지
  • 애플리케이션의 롤링 업데이트 지원
  • 실패한 Pod 자동 복구
  • 수동 업데이트, 롤백 등 버전 관리

Deployment의 구성 구조
내부적으로 ReplicaSet->Pod로 이어지는 계층 구조이다

Deployment
 └── ReplicaSet
      └── Pod(s)
  • Deployment는 원하는 상태(desired state)를 정의
  • ReplicaSet은 지정한 수의 Pod를 유지하도록 보장
  • Pod는 실제로 컨테이너가 실행되는 단위
  • deployment는 pod를 관리하고, pod는 컨테이너를 관리한다

주요 기능 정리

기능설명
Pod 복제여러 개의 Pod를 유지 (replicas)
자동 복구Pod가 죽으면 자동 재생성
롤링 업데이트중단 없이 새 버전 배포
롤백이전 버전으로 즉시 되돌리기
버전 관리ReplicaSet을 통해 이전 상태 기억함

실무 사용처

  • 지속적 서비스 운영: Pod가 죽어도 자동 복구됨
  • 버전 관리: 이미지 버전 교체 시 롤백 가능
  • 무중단 배포: 롤링 업데이트로 점진적 전환 가능
  • 스케일링: 수평 확장(HPA)와도 잘 맞음
profile
고민고민고민

0개의 댓글