WEB BE Repository/kubernetes, k8s

[쿠버네티스 튜토리얼] 1. k3s로 배워보자.

조금씩 차근차근 2025. 12. 17. 23:38

서비스를 배포할 때, 롤링/카나리/블루 그린같은 무중단 배포 전략을 고려하다 보면, 자연스레 컨테이너를 다루는 방식으로 손이 가게 된다.

 

현재 진행하고 있는 프로젝트 Pinit의 경우, MSA로 구성되어 있어서, 무중단 배포를 위한 전략을 쉽게 선택할 수 있는 도구가 필요했다.

 

이때, 도커 컴포즈와 쿠버네티스를 보통 이야기하는데, 이번 기회에 쿠버네티스를 한번 쭉 써보면서 MSA의 인프라 구성에 대해 이해하고자 다음과 같이 튜토리얼을 시작했다.

 


 

 

k3s는 Rancher사가 배포한 경량 Kubernetes로, 리소스가 적은 환경이나 로컬 실습에 적합하다.
k3s는 설치가 매우 간단하며, 단일 바이너리에 Kubernetes의 핵심 기능을 모두 포함하고 있다.
이 섹션에서는 Ubuntu 20.04+ 환경에 k3s 클러스터를 구축하는 방법을 다룬다.

(1) k3s 단일 노드 직접 설치

사전 준비: Ubuntu 시스템에서 curl 명령이 설치되어 있어야 한다. (없다면 sudo apt-get install -y curl로 설치)

 

k3s는 편의를 위해 공식 설치 스크립트를 제공한다. 다음 명령어를 실행하면 k3s가 자동으로 다운로드 및 설치된다.

$ curl -sfL https://get.k3s.io | sh -
  • 위 명령은 get.k3s.io에서 설치 스크립트를 가져와 쉘에서 실행한다. sudo/root 권한으로 실행되어야 하며, 실행 후 k3s 서버가 시스템 서비스로 등록되어 자동 실행된다.
  • 설치 완료 후, Kubernetes 명령줄 도구 kubectl이 함께 설치되고 k3s에 연결되도록 설정된다. (/usr/local/bin/kubectl 심볼릭 링크가 생성됨).
  • 기본 설정으로 k3s는 단일 노드 Kubernetes 클러스터(서버 모드)로 동작하며, 데이터스토어(기본 SQLite), 컨트롤 플레인 및 노드 역할을 모두 이 노드가 수행한다.

설치가 끝나면 k3s 서비스가 백그라운드에서 실행 중이며, Kubernetes 클러스터가 구동된 상태이다.
올바르게 설치되었는지 확인하기 위해 Kubernetes 노드 목록을 조회해보자.

위와 같이 노드가 Ready 상태로 표시되면 설치가 성공적으로 완료된 것이다.


간단한 Pod 배포 및 kubectl 기초

이제 Kubernetes 클러스터가 준비되었으니, kubectl 사용법과 Pod 배포를 실습해보자.
Pod는 Kubernetes에서 배포 가능한 가장 작은 단위의 객체로, 한 개 이상의 컨테이너와 저장소/네트워크 정의를 담고 있다.
Docker 컨테이너를 직접 실행하는 것과 달리, Kubernetes에서는 컨테이너를 Pod이라는 관리 단위를 통해 운영한다.

참고
Pod는 Kubernetes에서 생성하고 관리할 수 있는 가장 작은 배포 단위이다.
하나 이상의 컨테이너와 스토리지, 네트워크 설정을 공유하며, 동일한 환경에서 실행된다.
즉, 컨테이너를 Kubernetes에 올릴 때는 반드시 Pod 안에 넣어 실행하게 된다.

kubectl 소개 및 기본 사용법

kubectl은 Kubernetes 클러스터를 조작하기 위한 커맨드 라인 도구이다.
kubectl을 통해 클러스터에 명령을 전달하면, Kubernetes API 서버가 이를 처리한다.
k3s 설치 시 kubectl이 이미 준비되어 있으므로 바로 사용할 수 있다.

컨텍스트 확인

  • 우선 현재 kubectl이 가리키는 클러스터 및 사용자 정보를 확인해보자.

  • 위 출력으로 kubectl이 k3s 클러스터에 연결되어 있음을 확인했다.

노드 목록 조회

  • 클러스터 내 모든 노드(서버+에이전트)가 나열된다. (get은 조회, nodes는 자원 유형)

리소스 조회 일반 형태

kubectl get <리소스유형> [리소스이름] -n <네임스페이스>

위 형식으로 사용한다.

  $ kubectl get pods            \# 현재 네임스페이스(default)의 모든 Pod 목록  
  $ kubectl get pods -A         \# 모든 네임스페이스의 Pod 목록  
  $ kubectl get svc my-service  \# 특정 Service 객체 정보 조회

-A는 --all-namespaces의 축약형이다.

리소스 상세 조회 및 디버깅

 $ kubectl describe node k3s-master        # 노드 상세 정보 (상태, 조건, 리소스 용량 등)  
  $ kubectl describe pod <pod-name>         # Pod의 상세 이벤트, 상태 등  
  $ kubectl logs <pod-name> [-c 컨테이너명]   # Pod 내 컨테이너의 로그 출력  
  $ kubectl exec -it <pod-name> -- bash     # Pod 내 컨테이너 쉘 접속 (컨테이너에 bash가 있을 경우)
  • describe는 객체의 상세 정보와 최근 이벤트를 보여주므로 트러블슈팅에 유용하다.
  • logs와 exec는 각각 컨테이너 로그 확인과 실행 중인 컨테이너에 들어가볼 때 사용한다.
    • 이때, 파드 내 "특정 컨테이너"로 들어가려면 [-c 컨테이너명]을 입력하면 된다.

YAML vs 명령어 (선언적 vs 명령적)

Kubernetes 리소스(Pod, Service 등)를 생성하는 방법은 선언적(declarative) 방식과 명령적(imperative) 방식이 있다.

  • 선언적 방식은 YAML 매니페스트 파일을 작성하고 kubectl apply -f <파일>로 적용
  • 명령적 방식은 kubectl run이나 kubectl create 등의 커맨드를 직접 실행해 리소스를 만드는 것

이번 실습에서는 이해를 돕기 위해 YAML 매니페스트를 작성하여 apply 하는 방식을 사용해보자.

현업에서는 주로 YAML로 관리한다.

  • 명령적 방법 예시: kubectl run nginx-pod --image=nginx:alpine --restart=Never
    • 이게 Pod 하나를 생성하는 명령이다. 하지만 이보다는 YAML 작성에 익숙해지는 것이 좋다.

예제: Nginx 단일 Pod 배포하기

이제 Nginx 컨테이너를 실행하는 Pod를 만들어보자.
YAML 파일을 작성하고 kubectl로 적용하는 과정을 따라해보길 바란다.

  1. Pod 매니페스트 작성: 다음 내용을 hello-pod.yaml 파일로 저장하자.

  1. apiVersion: v1 및 kind: Pod는 Pod 객체를 생성함을 나타낸다.
  2. metadata.name은 Pod의 이름을 지정한다 (동일 네임스페이스 내 고유해야 함).
  3. spec.containers 목록에는 이 Pod에서 실행할 컨테이너를 정의할 수 있다.
    • 여기서는 nginx:alpine 이미지를 사용하는 컨테이너 한 개를 추가했다.
  4. ports.containerPort: 80은 이 컨테이너가 80포트를 사용한다는 의미이다. (Pod에 붙는 일종의 메타정보로, Service 만들 때 참조할 수 있다.)
  5. Pod 생성 (적용): 작성한 YAML을 클러스터에 적용한다.

  • kubectl apply는 YAML 파일의 원하는 상태를 클러스터에 반영하라는 명령이다. 성공 시 Pod이 생성된다.
  1. 생성 확인

  • STATUS가 Running이면 컨테이너가 정상 실행 중임을 의미한다.
  • READY 1/1은 총 1개의 컨테이너 중 1개가 가동 중이라는 뜻이다.
  1. 동작 확인: Pod 안의 nginx가 잘 동작하는지 간단히 확인해보자.

포트포워딩을 사용하여 로컬에서 Pod에 접속

  • 이 상태에서 브라우저 또는 curl로 http://localhost:8080에 접속하면 nginx 기본 환영 페이지를 볼 수 있다.
  1. 로그 확인
 $ kubectl logs hello-pod
  • nginx의 컨테이너 로그 (access/error 로그 등)를 확인할 수 있다.
  • Pod 내 여러 컨테이너가 있다면 -c <컨테이너이름>으로 지정 가능하다.
  1. Pod 정리: 실습이 끝난 Pod는 삭제해주자.

  • delete로 리소스를 삭제하면 관련 컨테이너도 종료된다.

요약

k3s 설치 스크립트를 사용하여 로컬 단일 노드 Kubernetes 클러스터를 구성했다.
이로써 kubectl을 사용해 클러스터를 제어할 준비가 되었다.

이어서 Pod의 개념과 수동 배포를 경험했다.
Pod는 Kubernetes의 기본 실행 단위로, 컨테이너를 감싸고 있다.
또한 kubectl의 기본적인 사용법 (apply, get, describe, logs, exec, delete)을 익혔다.

배운 개념

  • Kubernetes 컨트롤 플레인 및 노드 구성 요소
  • kubeconfig 설정
  • k3s의 경량 특성
  • Pod(파드)의 정의
  • Kubernetes의 선언적 관리(YAML 매니페스트)
  • kubectl 명령 사용법