티스토리 뷰

DEV/CONSOLE

쿠버네티스 k8s

SBP 2025. 4. 24. 08:11
Kubernetes 설치, 구성 요소 및 사용 방법

Kubernetes (K8s) 설치, 구성 요소 및 사용 방법

쿠버네티스는 수많은 컨테이너를 관리하고 자동화하는 복잡한 시스템입니다. 효율적인 클라우드 네이티브 애플리케이션 운영에 필수적이지만, 그만큼 학습 곡선이 높습니다. 여기서는 쿠버네티스의 핵심 구성 요소, 학습 환경을 위한 설치 방법, 그리고 기본적인 사용 방법을 알아보겠습니다.

1. Kubernetes 핵심 구성 요소

쿠버네티스 클러스터는 크게 컨트롤 플레인(Control Plane, 마스터 노드)워커 노드(Worker Node)로 구성됩니다.

1.1. 컨트롤 플레인 (Control Plane)

클러스터 전체를 관리하고 제어하는 역할을 합니다. 클러스터의 상태를 유지하고, 작업 요청을 워커 노드에 할당합니다.

  • API 서버 (kube-apiserver)

    쿠버네티스 API를 노출하는 컴포넌트입니다. 모든 REST 요청을 처리하며, 클러스터의 모든 통신(내부 컴포넌트 간, 외부 사용자/도구)의 중심 역할을 합니다.

  • etcd

    클러스터의 구성 데이터, 상태 데이터 등 모든 클러스터 데이터를 저장하는 분산 데이터 스토어입니다. 매우 중요하며 안정적이어야 합니다.

  • 스케줄러 (kube-scheduler)

    새로 생성된 파드(Pod)를 감지하고, 해당 파드를 실행할 워커 노드를 선택합니다. 노드의 자원 요구사항, 정책, 제약 조건 등을 고려하여 최적의 노드를 찾습니다.

  • 컨트롤러 매니저 (kube-controller-manager)

    다양한 컨트롤러들을 실행합니다. 컨트롤러들은 클러스터의 실제 상태를 원하는 상태(Desire State)와 일치시키기 위해 지속적으로 모니터링하고 조치를 취합니다. (예: 복제 컨트롤러는 항상 지정된 개수의 파드가 실행되도록 유지)

  • 클라우드 컨트롤러 매니저 (cloud-controller-manager) (클라우드 환경에서 선택적)

    AWS, Google Cloud, Azure 등 클라우드 제공 업체의 API와 상호 작용합니다. 클라우드 관련 리소스(로드 밸런서, 영구 볼륨 등)를 관리합니다.

1.2. 워커 노드 (Worker Node)

컨트롤 플레인의 제어를 받아 실제로 애플리케이션 컨테이너가 실행되는 서버들입니다.

  • Kubelet (쿠블렛)

    각 워커 노드에서 실행되는 에이전트입니다. 컨트롤 플레인(API 서버)과 통신하며, 노드에 할당된 파드를 관리(파드 내 컨테이너 실행, 상태 보고 등)하고 컨테이너 런타임과 상호 작용합니다.

  • 컨테이너 런타임 (Container Runtime)

    컨테이너 이미지를 가져오고 컨테이너를 실행하는 소프트웨어입니다. Docker, containerd, CRI-O 등이 있습니다. Kubelet이 컨테이너 런타임 인터페이스(CRI)를 통해 상호 작용합니다.

  • Kube-Proxy (쿠브 프록시)

    각 워커 노드에서 실행되는 네트워크 프록시입니다. 파드 간의 네트워크 통신 규칙을 관리하고, Service 개념을 구현하여 외부 또는 다른 파드에서 파드에 접근할 수 있도록 네트워크 트래픽을 라우팅하고 로드 밸런싱합니다.

1.3. 주요 Kubernetes 오브젝트 (리소스)

쿠버네티스 클러스터에 배포하고 관리하는 애플리케이션 단위입니다.

  • 파드 (Pod)

    쿠버네티스에서 생성하고 관리할 수 있는 배포의 가장 작은 단위입니다. 하나 이상의 컨테이너 그룹으로 구성되며, 같은 네트워크 네임스페이스, IP 주소, 스토리지 볼륨을 공유합니다. 파드 안의 컨테이너들은 항상 함께 스케줄링되고 함께 실행됩니다.

  • 디플로이먼트 (Deployment)

    무상태(Stateless) 애플리케이션 배포에 사용되는 가장 일반적인 오브젝트입니다. 파드 및 레플리카셋(ReplicaSet)에 대한 선언적 업데이트를 제공합니다. 원하는 파드 복제본 개수, 업데이트 전략 등을 정의할 수 있습니다. 롤링 업데이트, 롤백 등을 자동화합니다.

  • 서비스 (Service)

    파드 집합에 안정적인 네트워크 접근(고정 IP, DNS 이름)을 제공하는 추상화된 개념입니다. 파드는 생성/삭제될 때마다 IP가 바뀔 수 있지만, Service를 통해 파드에 접근하면 파드가 바뀌어도 끊김 없이 접근할 수 있습니다. (ClusterIP, NodePort, LoadBalancer 등 다양한 타입이 있습니다)

  • 볼륨 (Volume)

    파드 내 컨테이너들이 접근할 수 있는 스토리지 디렉토리입니다. 파드의 라이프사이클과 분리되어 파드가 재시작되거나 삭제되어도 데이터가 유지되도록 할 수 있습니다.

  • 네임스페이스 (Namespace)

    하나의 쿠버네티스 클러스터 내에서 리소스들을 논리적으로 격리하는 메커니즘입니다. 여러 팀이나 프로젝트가 하나의 클러스터를 공유할 때 리소스 충돌을 방지하고 관리 효율을 높입니다.

2. Kubernetes 설치 (학습 환경용)

프로덕션 환경의 쿠버네티스 클러스터 설치는 복잡하고 여러 서버를 필요로 합니다. 학습이나 개발 환경에서는 로컬 컴퓨터에 단일 노드 클러스터를 구축하는 것이 일반적입니다. 여기서는 대표적인 로컬 설치 방법 두 가지를 소개합니다.

2.1. Docker Desktop에 내장된 Kubernetes 사용 (Docker Desktop 사용자에게 편리)

Docker Desktop (Windows 또는 macOS) 최신 버전에는 쿠버네티스 클러스터 기능이 내장되어 있습니다. 별도의 설치 없이 Docker Desktop 설정에서 활성화만 하면 됩니다.

  1. Docker Desktop이 설치되어 있는지 확인합니다. 설치되어 있지 않다면 Docker 공식 사이트에서 설치합니다.
  2. Docker Desktop 애플리케이션을 실행합니다.
  3. 설정(Settings 또는 Preferences) 메뉴로 이동합니다.
  4. "Kubernetes" 탭을 찾습니다.
  5. "Enable Kubernetes" 옵션을 체크하고 Apply & Restart 버튼을 클릭합니다.
  6. Docker Desktop이 쿠버네티스 클러스터를 다운로드하고 시작하는 데 시간이 걸릴 수 있습니다. 상태 표시기에서 쿠버네티스 아이콘이 초록색으로 바뀌면 준비 완료입니다.
  7. 이제 kubectl 명령어를 사용할 준비가 되었습니다.
참고: Docker Desktop 설치 시 kubectl도 함께 설치되는 경우가 많습니다. 별도로 설치해야 한다면 아래 2.3 kubectl 설치 부분을 참고하세요.

2.2. Minikube 사용 (가장 보편적인 로컬 학습 도구)

Minikube는 로컬 컴퓨터의 VM(가상 머신)이나 Docker 컨테이너 안에 단일 노드 쿠버네티스 클러스터를 쉽게 설정할 수 있게 해주는 도구입니다. VirtualBox, VMware Fusion, Hyper-V, KVM 등의 가상화 도구나 Docker, Podman 같은 컨테이너 런타임이 미리 설치되어 있어야 합니다.

  1. Minikube 실행을 위한 가상화 도구(예: VirtualBox) 또는 컨테이너 런타임(예: Docker)을 설치합니다.
  2. 사용하는 운영체제에 맞게 Minikube를 설치합니다. Minikube 시작하기 문서에서 최신 설치 방법을 확인하는 것이 가장 좋습니다. 일반적으로 다음과 같은 방법들을 사용합니다.
    • macOS (Homebrew):
      brew install minikube
    • Windows (Chocolatey):
      choco install minikube
    • Linux:
      curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
      sudo install minikube-linux-amd64 /usr/local/bin/minikube
  3. 사용하는 드라이버(가상화 도구 또는 컨테이너 런타임)를 지정하여 Minikube 클러스터를 시작합니다. (예: Docker 드라이버 사용)
    minikube start --driver=docker

    드라이버를 지정하지 않으면 Minikube가 자동으로 적절한 드라이버를 찾으려고 시도합니다.

  4. Minikube가 클러스터를 다운로드하고 설정하는 데 시간이 걸립니다. 완료되면 쿠버네티스 클러스터가 로컬에서 실행됩니다.
  5. 이제 kubectl 명령어를 사용할 준비가 되었습니다. (Minikube 설치 시 kubectl이 함께 설치되거나, 설치된 kubectl을 Minikube 클러스터에 맞게 설정해 줍니다.)

2.3. kubectl 설치

kubectl은 쿠버네티스 클러스터와 상호 작용하기 위한 공식 명령줄 도구입니다. Docker Desktop이나 Minikube 설치 시 함께 설치되는 경우가 많지만, 별도로 설치해야 하거나 최신 버전으로 업데이트하고 싶을 때 사용합니다. kubectl 설치 공식 문서를 참고하는 것이 가장 정확합니다.

예시 (curl 사용):

  • Linux:
    curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
    sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
  • macOS:
    curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/amd64/kubectl"
    sudo install -o root -g wheel -m 0755 kubectl /usr/local/bin/kubectl

설치 확인:

kubectl version --client

3. Kubernetes 기본 사용 방법 (kubectl)

kubectl 명령어를 사용하여 클러스터의 상태를 확인하고, 애플리케이션을 배포하고 관리합니다.

3.1. 클러스터 상태 확인

클러스터가 제대로 동작하는지 확인합니다.

kubectl cluster-info

클러스터의 노드 목록을 확인합니다.

kubectl get nodes

3.2. 애플리케이션 배포 (Deployment 생성)

Nginx 웹 서버를 예시로 3개의 복제본을 가지는 디플로이먼트를 생성해 보겠습니다. YAML 파일을 사용하여 선언적으로 정의하는 것이 일반적입니다.

nginx-deployment.yaml 파일 생성:

apiVersion: apps/v1 # 사용하려는 쿠버네티스 API 버전
kind: Deployment    # 생성하려는 리소스의 종류
metadata:           # 리소스에 대한 메타데이터 (이름, 라벨 등)
  name: nginx-deployment # 디플로이먼트 이름
spec:               # 원하는 상태에 대한 명세
  replicas: 3       # 파드를 3개 유지
  selector:         # 이 디플로이먼트가 관리할 파드를 선택하는 라벨 셀렉터
    matchLabels:
      app: nginx    # 'app: nginx' 라벨을 가진 파드를 선택
  template:         # 새로 생성할 파드의 템플릿
    metadata:
      labels:
        app: nginx  # 파드에 붙일 라벨
    spec:
      containers:   # 파드 내에 실행할 컨테이너 목록
      - name: nginx # 컨테이너 이름
        image: nginx:latest # 사용할 Docker 이미지
        ports:      # 컨테이너가 노출할 포트
        - containerPort: 80

작성한 YAML 파일을 클러스터에 적용하여 디플로이먼트를 생성합니다.

kubectl apply -f nginx-deployment.yaml

3.3. 배포된 리소스 확인

생성된 디플로이먼트를 확인합니다.

kubectl get deployments

디플로이먼트에 의해 생성된 파드 목록을 확인합니다.

kubectl get pods

3.4. 애플리케이션 노출 (Service 생성)

배포한 Nginx 파드에 외부에서 접근할 수 있도록 Service를 생성합니다. 로컬 환경에서는 주로 NodePort 타입을 사용합니다.

nginx-service.yaml 파일 생성:

apiVersion: v1      # 사용하려는 쿠버네티스 API 버전
kind: Service       # 생성하려는 리소스의 종류
metadata:           # 리소스에 대한 메타데이터
  name: nginx-service # 서비스 이름
spec:               # 원하는 상태에 대한 명세
  selector:         # 이 서비스가 접근할 파드를 선택하는 라벨 셀렉터
    app: nginx      # 'app: nginx' 라벨을 가진 파드를 선택
  type: NodePort    # 서비스 타입: 노드의 특정 포트를 통해 접근 가능
  ports:            # 서비스가 노출할 포트
  - protocol: TCP   # 프로토콜
    port: 80        # 서비스의 포트 (클러스터 내부에서 접근 시)
    targetPort: 80  # 파드가 리스닝하는 포트 (컨테이너 포트)
    # nodePort: 30000-32767 범위의 포트를 명시하거나 생략 시 자동 할당

작성한 YAML 파일을 클러스터에 적용하여 Service를 생성합니다.

kubectl apply -f nginx-service.yaml

생성된 Service를 확인합니다.

kubectl get services

TYPE이 NodePort인 Service의 PORT(S) 정보를 보면 `80:xxxxx/TCP` 형태로 표시됩니다. 여기서 `xxxxx`가 워커 노드에 할당된 포트(NodePort)입니다. 이 NodePort와 워커 노드의 IP 주소를 사용하여 웹 브라우저에서 Nginx에 접근할 수 있습니다.

Minikube를 사용한다면 다음 명령어로 Service의 URL을 쉽게 얻을 수 있습니다.

minikube service nginx-service

3.5. 스케일링 (파드 개수 변경)

디플로이먼트가 관리하는 파드의 개수를 변경하여 애플리케이션을 스케일 인/아웃 할 수 있습니다.

Nginx 파드 개수를 5개로 늘립니다.

kubectl scale deployment nginx-deployment --replicas=5

다시 3개로 줄입니다.

kubectl scale deployment nginx-deployment --replicas=3

3.6. 로그 확인 및 컨테이너 접속

파드에서 실행 중인 컨테이너의 로그를 확인합니다.

kubectl logs <파드_이름>

파드 안의 특정 컨테이너에 접속하여 명령어를 실행합니다.

kubectl exec -it <파드_이름> -- bash

여기서 -it는 상호 작용 가능한 터미널을 의미하며, -- bash는 해당 컨테이너 안에서 실행할 명령어입니다.

3.7. 리소스 삭제

생성한 디플로이먼트와 Service를 삭제합니다.

kubectl delete deployment nginx-deployment
kubectl delete service nginx-service

또는 YAML 파일을 사용하여 삭제할 수도 있습니다.

kubectl delete -f nginx-deployment.yaml
kubectl delete -f nginx-service.yaml

4. 더 나아가기

쿠버네티스는 매우 넓고 깊은 주제입니다. 위 내용은 가장 기본적인 시작점일 뿐입니다. 더 배우고 탐구해야 할 주요 개념들은 다음과 같습니다.

  • 네트워킹: CNI (Container Network Interface), 파드 간 통신, 서비스 네트워킹 상세.
  • 스토리지: PV (Persistent Volume), PVC (Persistent Volume Claim), StorageClass, 다양한 스토리지 타입 연동.
  • 설정 관리: ConfigMap, Secret을 이용한 애플리케이션 설정 및 민감 정보 관리.
  • 상태 저장 애플리케이션: StatefulSet을 이용한 데이터베이스 등 상태가 있는 애플리케이션 관리.
  • 자동화: CI/CD 파이프라인과 쿠버네티스 연동.
  • 모니터링 및 로깅: Prometheus, Grafana, ELK Stack 등과의 연동.
  • 패키지 관리: Helm을 사용한 쿠버네티스 애플리케이션 관리.

마무리

쿠버네티스는 처음에는 어렵게 느껴질 수 있지만, 컨테이너화된 애플리케이션을 효율적으로 관리하는 데 엄청난 이점을 제공합니다. 로컬 환경에 쿠버네티스를 설치하고 kubectl 명령어를 사용하여 직접 파드, 디플로이먼트, 서비스 등을 배포하고 관리해보는 경험이 중요합니다. 공식 문서와 다양한 온라인 튜토리얼을 적극 활용하여 학습을 계속하시기 바랍니다.

Kubernetes 공식 문서: https://kubernetes.io/ko/docs/

'DEV > CONSOLE' 카테고리의 다른 글

PCP 와 GRAFANA  (0) 2025.05.12
PCP 기반 시스템 모니터링  (0) 2025.05.12
Docker  (0) 2025.04.24
LINUX, NGINX, JBOSS, TOMCAT 역할  (1) 2025.04.14
[Bat] 프로그램 실행, 작업스케줄러  (1) 2025.01.08
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함