[K8s] Kubernetes 간단한 로컬 실습 with Docker Desktop + kubectl + kind (Windows11)

imkhkim·2025년 1월 7일
post-thumbnail

K8s를 간단히 실습해볼 수 있도록, Windows11 64bit 환경에 kubectl과 kind(kubernetes in docker)를 설치한 뒤 웹서버 nginx를 K8s 환경으로 띄워보겠습니다.


쿠버네티스(Kubernetes, K8s)란?

출처 https://kubernetes.io/ko/docs/concepts/overview

애플리케이션 배포 방식은 크게 세 시대를 거쳐 발전해왔습니다. 전통적인 물리 서버 시대에는 리소스 할당과 비용 문제가 있었고, VM을 사용한 가상화 시대에는 이를 일부 해결했지만 여전히 무거운 운영체제가 필요했습니다. 현재 컨테이너 시대에는 호스트 OS를 공유하며 애플리케이션 실행에 필요한 것들만 담아 가볍고 이식성 높은 배포가 가능해졌습니다. 컨테이너는 개발과 운영 환경의 일관성을 제공하고, 마이크로서비스 아키텍처 구현을 효율적으로 지원하며, 리소스를 효율적으로 활용할 수 있는 장점이 있습니다.

출처 https://en.wikipedia.org/wiki/Kubernetes

Kubernetes(K8s)는 컨테이너화된 애플리케이션의 자동화된 배포, 스케일링, 운영을 위한 오픈소스 컨테이너 오케스트레이션 플랫폼입니다. 복잡해 보이는 쿠버네티스를 로컬 환경에서 쉽게 시작하기 위해 두 가지 도구를 사용하겠습니다.

  • kubectl(Kubernetes Control): 쿠버네티스 클러스터를 제어하기 위한 커맨드라인 도구로, 클러스터와 상호작용하는 공식 CLI입니다.

  • kind(Kubernetes IN Docker): Docker 컨테이너를 사용해 로컬 개발 환경에서 쿠버네티스 클러스터를 실행할 수 있게 해주는 도구입니다. Minikubekubeadm과 달리 Docker 컨테이너만으로 다중 노드 클러스터를 구성할 수 있어 가볍고 빠르게 시작할 수 있습니다.

    Minikube: Minikube는 로컬 환경에서 쿠버네티스를 실행하고 테스트할 수 있게 해주는 도구입니다. Docker나 가상머신 등 다양한 드라이버를 지원하며, 개발자가 자신의 환경에 맞는 방식을 선택할 수 있습니다. 단일 노드 클러스터를 구성하여 프로덕션 환경과 유사한 테스트 환경을 제공합니다.

    kubeadm: kubeadm은 프로덕션 수준의 쿠버네티스 클러스터를 설정하는 데 사용되는 도구입니다. 이를 통해 쿠버네티스 클러스터의 마스터 노드와 워커 노드를 포함한 다중 노드 환경을 구축할 수 있습니다. kubeadm은 초기화 작업과 인증서 설정 등을 자동화하여 프로덕션 환경에서 안정적이고 효율적으로 쿠버네티스를 설치하고 구성할 수 있도록 도와줍니다.


설치

1. Docker Desktop 설치

도커 데스크탑 설치 페이지

  • kind를 사용하려면 도커를 설치하고 구성해야하기 때문에, Docker Desktop을 먼저 설치합니다.
  • 설치 과정 중 완전한 Linux 커널을 사용하는 WSL2 기반 설치에 동의하고, WSL2를 기본 버전으로 설정하시면 됩니다.
  • 회원 가입도 합니다.

※ 설명을 자세히 해주신 다른 분들의 글을 보는게 좋을 것 같습니다. 설치가 잘 안될 때 꿀팁이라면, 재부팅 할 때 효과가 좋았습니다.

2. kubectl 설치

kubectl 설치 페이지
※ 아래의 curl을 사용하면 페이지 방문 없이 다운 가능합니다.

  • 공식 홈페이지에서 kubectl을 찾아 설치합니다.
  • 실행 파일을 받아도 되지만 curl로 진행해보겠습니다.

    curl.exe -LO "https://dl.k8s.io/release/v1.32.0/bin/windows/amd64/kubectl.exe"

  • cmd를 열고, 다운받길 원하는 경로에서 curl 명령어를 실행합니다. 저 주소의 서버에서 exe 파일을 다운받게 됩니다. 저는 D드라이브에서 진행했습니다.
  • kubectl 명령어로 확인하면 다운받은 kubectl.exe를 실행할 필요 없이 바로 설치되어있습니다.
    kubectl 명령어를 입력했을 때 오류가 난다면 환경 변수 설정을 직접 해야할 수도 있습니다. 아래 환경 변수 설정하는 것을 참고해보세요. curl이 아닌 choco를 사용했을 때도 별다른 설정을 안해도 될 수 있지만, 만약 안된다면 환경 변수 설정을 해보세요.

3. kind 설치

kind 설치 페이지
※ 아래의 curl을 사용하면 페이지 방문 없이 다운 가능합니다.

  • 공식 홈페이지에서 kind를 찾아 설치합니다.
  • curl로 진행해보겠습니다.

    curl.exe -Lo kind-windows-amd64.exe https://kind.sigs.k8s.io/dl/v0.26.0/kind-windows-amd64

    Move-Item .\kind-windows-amd64.exe c:\some-dir-in-your-PATH\kind.exe

  • 폴더 하나를 새로 만들어줍니다. 이 폴더를 환경 변수에 등록할 예정입니다. 폴더 경로와 이름은 아무거나 상관 없습니다. 저는 D드라이브에서 진행했습니다.
  • cmd를 열고, 원하는 경로에서 우선 curl 명령어만 실행합니다(방금 새로 만든 폴더여도 상관 없습니다). 저 주소의 서버에서 exe 파일을 다운받게 됩니다.
  • 방금 새로 만든 환경 변수 폴더에 다운받은 kind-windows-amd64.exe 파일을 옮깁니다. 이 때, c:\some-dir-in-your-PATH 이 부분이 방금 새로 만든 환경 변수 폴더가 위치한 경로여야합니다.
  • 시스템 환경 변수의 Path에 kind.exe가 들어있는 폴더를 등록해야 합니다.
    환경 변수 창을 띄우기 위해 실행 창(Window + R)에 sysdm.cpl을 입력하고 확인을 누릅니다.
  • 고급 탭에 환경 변수가 있습니다.
  • 시스템 변수에서 Path를 찾아 편집을 누릅니다.
  • 새로 만들기를 눌러 kind.exe가 들어있는 폴더를 추가한 뒤 확인 버튼을 누릅니다.
  • cmd 창을 열어 kind --version 명령어로 제대로 설치되었는지 확인해봅니다. 환경 변수로 등록했기 때문에 다른 경로에서 확인해봐도 버전이 제대로 나올겁니다.
  • 기본 클러스터를 생성해줍니다.

    kind create cluster



쿠버네티스의 Pod, Node, Namespace란?

  • Pod는 쿠버네티스에서 가장 작은 배포 단위입니다. 하나 이상의 컨테이너를 포함할 수 있는데, 보통 하나의 메인 컨테이너와 부가적인 컨테이너들로 구성됩니다. 예를 들어 웹서버 컨테이너와 로그 수집 컨테이너를 하나의 Pod에 넣을 수 있습니다.

💥중요💥 Pod는 일시적(ephemeral)인 특성을 가집니다. 즉, 언제든지 종료되고 다시 시작될 수 있습니다. 이런 특성 때문에:

  • Pod 안에 저장된 데이터는 Pod가 재시작되면 모두 사라집니다.
  • 데이터베이스처럼 지속적인 데이터 저장이 필요한 경우, 반드시 영구 저장소(Persistent Volume)를 사용해야 합니다.
  • Pod의 재시작에도 데이터가 유지되어야 한다면, 별도의 저장소 설정이 필요합니다.
  • Node는 쿠버네티스 클러스터를 구성하는 물리 서버나 가상 머신입니다. Pod들이 실제로 실행되는 작업자(Worker) 컴퓨터라고 생각하시면 됩니다. 마치 회사의 직원들(Pod)이 일하는 사무실(Node)과 비슷합니다.
  • Namespace는 쿠버네티스 클러스터 안에서 리소스들을 논리적으로 구분하는 방법입니다. 예를 들어 개발팀, 테스트팀, 운영팀이 같은 클러스터를 사용할 때, 각자의 Namespace에서 독립적으로 작업할 수 있습니다. 마치 회사 건물 안에서 부서별로 공간을 나누는 것과 비슷합니다.


로컬 실습

  • frontend-nginx.yaml 파일을 kubectl 명령을 실행할 폴더에 만듭니다.

    ######## frontend-nginx.yaml ########
    apiVersion: v1 # Kubernetes API 버전
    kind: Pod # 만들 리소스 종류: Pod
    metadata: # 리소스의 이름, 레이블 등 메타 데이터
      name: frontend # 리소스의 이름
      labels: # Pod에 부여할 레이블
        app: nginx # 앱 레이블: nginx
    spec: # 리소스의 스펙 정의 시작
      containers: # 리소스 내의 컨테이너 목록
      - image: nginx # 사용할 Docker 이미지: nginx
        name: nginx # 컨테이너의 이름
        ports: # 컨테이너가 사용할 포트
        - containerPort: 80 # 컨테이너가 80번 포트 노출
  • frontend-nginx.yaml이 있는 경로에서 create 명령어를 실행해 yaml 파일을 기준으로 컨테이너를 만듭니다.

    kubectl create -f frontend-nginx.yaml
    ※ 생성된 리소스의 설정을 변경하거나 업데이트해야 할 경우 kubectl apply를 사용합니다.

  • pod들의 정보를 확인할 수 있습니다.

    kubectl get pods

  • 로그를 확인해보면 제대로 실행됐는지 확인할 수 있습니다.

    kubectl logs frontend

  • 호스트의 8888 포트를 컨테이너의 80번 포트에 포워딩하면 8888 포트로 접속이 가능합니다.

    kubectl port-forward frontend 8888:80

  • 접속이 되는지 확인해본다.

    localhost:8888 → 접속 O
    127.0.0.1:8888 → 접속 O
    ※ localhost:80 → 접속 X
    ※ 127.0.0.1:80 → 접속 X

    성공 🎉


클라우드


대표적인 클라우드 관리형 쿠버네티스 서비스

  • Amazon EKS (Elastic Kubernetes Service): AWS의 관리형 쿠버네티스 서비스
  • Azure AKS (Azure Kubernetes Service): Microsoft Azure의 관리형 서비스
  • Google GKE (Google Kubernetes Engine): Google Cloud의 관리형 서비스

관리형 서비스의 장점

  • 마스터 노드 관리를 클라우드 업체가 대신 해줍니다.
  • 자동 업그레이드와 보안 패치를 제공합니다.
  • 확장성이 좋고 안정적입니다.
  • 다양한 클라우드 서비스와 통합이 쉽습니다.

🤔 직접 구축도 가능할까요?
물론 가능합니다! 다만 고려사항이 있습니다:

  • 클라우드의 VM이나 물리 서버에 직접 쿠버네티스를 설치할 수 있습니다.
  • kubeadm 같은 도구로 클러스터를 구성할 수 있습니다.
  • 하지만 마스터 노드 관리, 업그레이드, 보안 등 모든 것을 직접 해야 합니다.
  • 일반적으로 큰 규모가 아니라면 관리형 서비스 사용을 추천합니다.

로컬과의 차이점

  • 로컬(Minikube, kind)은 학습과 테스트용
  • 클라우드는 실제 서비스 운영을 위한 프로덕션 환경
  • 로컬은 주로 단일/소수 노드, 클라우드는 많은 노드 운영 가능
  • 클라우드는 고가용성(HA)과 자동 확장 기능 제공

참고 자료

기술노트with 알렉 - 더 쉬운 쿠버네티스 + 바로 실습 | 웹서버 초간단 띄우기
쿠버네티스 공식 문서 - 쿠버네티스란 무엇인가?

profile
!dlroW ,olleH

0개의 댓글