Infrastructure

Kubernetes 초보자 가이드: 컨테이너 관리의 모든 것

Written by 개발자서동우 · 58 sec read >
쿠버네티스 쉽게 이해하기

안녕하세요 !! Devloo 입니다 :). 여러분,오늘은 IT 업계에서 컨테이너 오케스트레이션의 표준으로 자리 잡은 Kubernetes에 대해 이야기해보려고 합니다.

Kubernetes, 줄여서 K8s라고도 불리는데요, 이 도구는 컨테이너화된 애플리케이션의 배포, 확장, 관리를 단순화하여 현대 소프트웨어 개발에 필수적인 도구로 자리매김하고 있습니다.

이 글에서는 Kubernetes의 기본 개념과 첫 클러스터를 설정하는 방법까지 하나씩 알아보도록 하겠습니다. 이 글을 통해 여러분이 Kubernetes의 세계에 발을 들이는 데 도움이 되길 바랍니다. 그럼 시작해볼까요? 🙂

Kubernetes 이해하기

Kubernetes는 Google에서 개발한 오픈 소스 컨테이너 오케스트레이션 플랫폼입니다. 이 플랫폼은 컨테이너화된 애플리케이션의 배포, 확장 및 관리를 자동화하여 개발자가 기본 인프라에 대한 걱정 없이 애플리케이션을 구축하고 실행할 수 있도록 도와줍니다.

Kubernetes 클러스터는 두 가지 유형의 리소스로 구성됩니다:

  • 컨트롤 플레인(마스터 노드): 클러스터를 조정합니다.
  • 노드: 애플리케이션을 실행하는 작업자 역할을 합니다. 이들은 컨테이너를 포함한 파드를 호스트합니다.

핵심 개념

Kubernetes에 본격적으로 뛰어들기 전에 몇 가지 핵심 개념을 이해하는 것이 중요합니다:

  • 파드(Pods): Kubernetes에서 배포 가능한 가장 작은 단위로, 하나 이상의 컨테이너로 구성됩니다.
  • 노드(Nodes): Kubernetes 클러스터에서 작업 머신 역할을 하는 물리적 또는 가상 머신입니다. 각 노드에는 노드를 관리하고 Kubernetes 컨트롤 플레인과 통신하는 에이전트인 kubelet이 있습니다. 프로덕션 트래픽을 처리하는 Kubernetes 클러스터는 최소한 세 개의 노드를 갖추어야 합니다. 하나의 노드가 다운되면 etcd 멤버와 컨트롤 플레인 인스턴스가 손실되어 중복성이 손상되기 때문입니다. 이를 방지하기 위해 더 많은 컨트롤 플레인 노드를 추가할 수 있습니다.
  • 배포(Deployment): 파드의 라이프사이클을 관리하여 항상 원하는 수의 복제본이 실행되도록 하는 Kubernetes 리소스입니다.
  • 서비스(Service): 파드 세트와 이에 대한 접근 정책을 정의하는 추상화입니다.
  • 네임스페이스(Namespace): Kubernetes 클러스터 내에서 가상 클러스터를 생성하여 여러 사용자나 팀 간에 클러스터 자원을 분할할 수 있도록 합니다.

컨트롤 플레인은 클러스터를 관리하는 역할을 합니다. 컨트롤 플레인은 클러스터 내 모든 활동을 조정하며 애플리케이션 스케줄링, 원하는 상태 유지, 애플리케이션 확장 및 새로운 업데이트 롤아웃 등을 수행합니다. 애플리케이션을 Kubernetes에 배포할 때 컨트롤 플레인에 애플리케이션 컨테이너를 시작하도록 지시합니다.

컨트롤 플레인은 클러스터의 노드에 컨테이너를 스케줄링합니다. kubelet과 같은 노드 수준의 구성 요소는 Kubernetes API를 사용하여 컨트롤 플레인과 통신합니다. 최종 사용자는 Kubernetes API를 직접 사용하여 클러스터와 상호작용할 수도 있습니다.

컨트롤 플레인은 클러스터와 애플리케이션이 실행되는 노드를 관리합니다.

쿠버네티스의 구조
쿠버네티스의 구조

마스터 노드 (컨트롤 플레인)

Kubernetes의 컨트롤 플레인은 클러스터의 상태를 관리하고 다양한 작업을 조정하는 여러 주요 구성 요소로 이루어져 있습니다. 이 구성 요소들은 클러스터의 원하는 상태를 유지하고 애플리케이션이 원활하게 실행되도록 함께 작동합니다. Kubernetes 컨트롤 플레인의 주요 구성 요소는 다음과 같습니다:

  • kube-apiserver:
    • Kubernetes API 서버는 Kubernetes 컨트롤 플레인의 프론트 엔드 역할을 합니다.
    • Kubernetes API를 노출하여 사용자, 관리자 및 기타 구성 요소가 클러스터와 상호작용할 수 있게 합니다.
    • 모든 관리 작업과 클러스터 상태 변경은 API 서버를 통해 수행됩니다.
  • kube-controller-manager:
    • kube-controller-manager는 클러스터 상태를 조절하는 다양한 컨트롤러 프로세스를 실행합니다.
    • 컨트롤러는 API 서버를 통해 클러스터 상태를 지속적으로 모니터링하고 원하는 상태를 유지하기 위해 수정 작업을 수행합니다.
    • 노드 컨트롤러, 복제 컨트롤러, 엔드포인트 컨트롤러, 서비스 계정 및 토큰 컨트롤러 등의 예가 있습니다.
  • kube-scheduler:
    • kube-scheduler는 클러스터 내에 새로운 파드를 어디에 배치할지 결정합니다.
    • 자원 요구 사항, 노드 상태, 어피니티/안티어피니티 규칙 등을 평가하여 최적의 스케줄링 결정을 내립니다.
    • 스케줄러는 이러한 요소를 기반으로 파드를 노드에 할당하고 작업이 클러스터 전반에 균등하게 분배되도록 합니다.
  • etcd:
    • etcd는 클러스터의 구성 데이터를 위한 분산 키-값 저장소입니다.
    • 모든 클러스터 상태 정보, 구성 설정, API 객체 및 메타데이터를 저장합니다.
    • etcd는 높은 가용성과 분산 스토리지 솔루션을 제공하여 일관성과 신뢰성을 보장합니다.

이 구성 요소들은 Kubernetes 클러스터의 원하는 상태를 유지하고 자원 할당 및 스케줄링을 처리하며 컨테이너화된 애플리케이션을 배포하고 관리할 수 있는 신뢰할 수 있고 확장 가능한 플랫폼을 제공합니다. 각 구성 요소는 Kubernetes 컨트롤 플레인의 전반적인 건강과 기능성을 보장하는 데 중요한 역할을 합니다.

쿠버네티스의 구성
쿠버네티스의 구성

워커 노드

Kubernetes에서 노드, 워커 노드 또는 미니언이라고도 불리는 이 노드는 컨테이너화된 애플리케이션을 실행하는 물리적 또는 가상 머신입니다. 클러스터의 각 노드는 하나 이상의 파드를 호스트하며, 파드는 Kubernetes에서 배포 가능한 가장 작은 단위입니다. 노드는 컨트롤 플레인에 의해 관리되며, 컨테이너를 실행하고 관리하는 실제 작업을 수행합니다. Kubernetes 노드의 주요 구성 요소는 다음과 같습니다:

  • kubelet:
    • kubelet은 각 노드에서 실행되는 에이전트로, 파드의 라이프사이클을 관리합니다.
    • 컨테이너가 Kubernetes API에 정의된 파드 사양에 따라 실행되고 건강한 상태를 유지하도록 시작, 중지 및 모니터링합니다.
    • kubelet은 Kubernetes API 서버와 통신하여 파드 사양을 받고, 노드 상태를 보고하며, 기타 노드 관련 작업을 수행합니다.
  • kube-proxy:
    • kube-proxy는 각 노드에서 실행되는 네트워크 프록시로, Kubernetes 서비스 추상화를 구현하는 역할을 합니다.
    • 네트워크 규칙을 유지 관리하고 클러스터 내에서 실행 중인 서비스에 접근하기 위한 패킷 전달을 수행합니다.
    • kube-proxy는 iptables 또는 기타 네트워킹 메커니즘을 사용하여 서비스 정의에 따라 트래픽을 적절한 파드로 라우팅합니다.
  • Container Runtime:
    • 컨테이너 런타임은 노드에서 컨테이너를 실행하는 소프트웨어입니다.
    • Kubernetes는 Docker, containerd, CRI-O 등의 다양한 컨테이너 런타임을 지원합니다.
    • 컨테이너 런타임은 컨테이너 이미지를 가져오고, 컨테이너 인스턴스를 생성하며, 컨테이너의 시작, 중지 및 재시작 등의 라이프사이클 작업을 관리합니다.
  • kubelet Container Log:
    • kubelet은 컨테이너 로그를 수집하고 클러스터의 로깅 인프라로 전달하는 역할도 합니다.
    • 노드에서 실행되는 컨테이너가 생성한 로그는 로컬에 저장되며, kubectl과 같은 도구를 통해 액세스하거나 중앙 집중식 로깅 솔루션으로 가져와 모니터링 및 문제 해결에 사용할 수 있습니다.

이 구성 요소들은 각 노드에서 협력하여 Kubernetes 클러스터 내에서 컨테이너의 올바른 실행과 관리를 보장합니다. 여러 노드에 워크로드를 분산하고 이들의 활동을 조정함으로써 Kubernetes는 컨테이너화된 애플리케이션을 배포하고 실행할 수 있는 확장 가능하고 탄력적인 플랫폼을 제공합니다.

Kubernetes 클러스터 설정

Kubernetes 클러스터를 설정하는 방법에는 여러 가지가 있습니다. Google Kubernetes Engine (GKE), Amazon Elastic Kubernetes Service (EKS), Microsoft Azure Kubernetes Service (AKS)와 같은 클라우드 제공업체가 제공하는 관리형 Kubernetes 서비스를 이용할 수 있습니다. 또는 MinikubeKind (Kubernetes in Docker)와 같은 도구를 사용하여 로컬 클러스터를 설정할 수도 있습니다.

이번 튜토리얼에서는 Minikube를 사용하여 로컬 Kubernetes 클러스터를 설정해보겠습니다:

  1. 공식 문서의 지침에 따라 Minikube를 설치합니다.
  2. minikube start 명령어를 사용하여 Minikube를 시작합니다.
  3. kubectl cluster-info 명령어를 실행하여 클러스터가 정상적으로 실행 중인지 확인합니다.
첫 번째 애플리케이션 배포

이제 Kubernetes 클러스터가 실행 중이므로 간단한 애플리케이션을 배포해보겠습니다:

  1. 다음 내용을 포함한 Kubernetes 배포 매니페스트 파일(deployment.yaml)을 생성합니다:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-world
spec:
  replicas: 3
  selector:
    matchLabels:
      app: hello-world
  template:
    metadata:
      labels:
        app: hello-world
    spec:
      containers:
      - name: hello-world
        image: nginx:latest
        ports:
        - containerPort: 80
  1. kubectl apply -f deployment.yaml 명령어를 사용하여 배포 매니페스트를 적용합니다.
  2. kubectl get pods 명령어를 실행하여 배포가 정상적으로 실행되고 있는지 확인합니다.
애플리케이션 접근

배포한 애플리케이션에 접근하려면 Kubernetes 서비스를 통해 애플리케이션을 노출해야 합니다:

  1. 다음 내용을 포함한 Kubernetes 서비스 매니페스트 파일(service.yaml)을 생성합니다:
apiVersion: v1
kind: Service
metadata:
  name: hello-world
spec:
  selector:
    app: hello-world
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: NodePort
  1. kubectl apply -f service.yaml 명령어를 사용하여 서비스 매니페스트를 적용합니다.
  2. minikube service hello-world --url 명령어를 실행하여 애플리케이션에 접근할 수 있는 URL을 확인합니다.

유용한 명령어

  • k9s 명령어를 찾을 수 없는 경우:
alias k9s='/home/your-user-name/.local/bin/k9s'
  • 사용 중인 클러스터를 확인하려면:
kubectl config get-contexts
  • 클러스터를 변경하려면 (kubectl이 이 클러스터와 상호작용하도록 설정):
kubectl config use-context <cluster-name>
  • 클러스터 정보를 보려면:
kubectl config view --minify --flatten --context=<cluster-name>
kubectl get secrets -n liberty-apps
kubectl get secret <secret-name> -n <namespace> -o json | jq '{name: .metadata.name,data: .data|map_values(@base64d)}'
kubectl create secret generic <secret-name> --from-literal=secret=<value> -n <namespace>
  • 실패한 오류를 찾으려면:
kubectl describe pod <podname> -n <namespace>

결론

자 이제 저희는 Kubernetes에 첫 애플리케이션을 성공적으로 배포해보았습니다. 이 글에서는 Kubernetes의 기본 개념, 클러스터 설정, 애플리케이션 배포 및 접근 방법을 다루었습니다. Kubernetes에 대한 공부를 계속하시면서 확장, 네트워킹, 상태 저장 애플리케이션 관리와 같은 고급 주제도 다루어 보시면 좋을 것 같습니다.

끝까지 읽어주셔서 정말 감사합니다 !! (_ _) 궁금하신 사항은 댓글로 남겨주세요 🙂 !!

Written by 개발자서동우
안녕하세요! 저는 기술 분야에서 활동 중인 개발자 서동우입니다. 명품 플랫폼 (주)트렌비의 창업 멤버이자 CTO로 활동했으며, AI 기술회사 (주)헤드리스의 공동 창업자이자 CTO로서 역할을 수행했습니다. 다양한 스타트업에서 일하며 회사의 성장과 더불어 비즈니스 상황에 맞는 기술 선택, 개발팀 구성 및 문화 정착에 깊은 경험을 쌓았습니다. 개발 관련 고민은 언제든지 편하게 연락주세요 :) https://linktr.ee/dannyseo Profile

Leave a Reply

Your email address will not be published. Required fields are marked *