[F-Lab 멘토링 학습]

쿠버네티스 (K8S)

everydeveloper 2023. 9. 15. 16:34

쿠버네티스 (k8s)

쿠버네티스 (Kubernetes)란?

쿠버네티스는 컨테이너화된 애플리케이션을 자동화하고 관리하기 위한 오픈소스 플랫폼입니다. 구글에서 개발되었으며, 지금은 클라우드 네이티브 컴퓨팅 재단(CNCF)의 산하 프로젝트로 운영되고 있습니다. 쿠버네티스는 컨테이너 관리를 위한 자동화된 배포, 스케일링 및 관리 기능을 제공합니다.

쿠버네티스의 특징

  • 가상화된 컨테이너를 자동으로 배치, 스케일링, 관리합니다.
  • 서비스 디스커버리와 로드 밸런싱을 제공합니다.
  • 스스로 상태를 모니터링하고, 필요시 자동으로 복구합니다.
  • 빠른 배포와 롤백이 가능합니다.
  • 다양한 클라우드 및 인프라 환경에서 사용이 가능합니다.

쿠버네티스의 구성요소

쿠버네티스는 여러 개의 마스터 노드와 워커 노드로 구성됩니다. 마스터 노드는 쿠버네티스 클러스터를 제어하는데 사용되며, 워커 노드는 애플리케이션 컨테이너가 배치되는 노드입니다. 노드 간의 통신은 네트워크를 통해 이루어집니다.

쿠버네티스의 장점

  • 애플리케이션 운영 비용을 줄일 수 있습니다.
  • 높은 가용성과 확장성을 제공합니다.
  • 다양한 환경에서 사용이 가능합니다.
  • 간편한 애플리케이션 배포 및 관리가 가능합니다.

쿠버네티스 오픈소스와 무료여부

쿠버네티스(Kubernetes)는 오픈 소스 컨테이너 오케스트레이션 플랫폼입니다. 이는 Cloud Native Computing Foundation(CNCF)에 의해 관리되며, GitHub에서 소스 코드를 확인하고 사용할 수 있습니다.

쿠버네티스 자체는 무료로 사용할 수 있습니다. 하지만 다음과 같은 상황에서는 비용이 발생할 수 있습니다:

  1. 클라우드 서비스: AWS의 EKS, Google Cloud의 GKE, Azure의 AKS와 같은 관리형 쿠버네티스 서비스를 사용할 때는 해당 클라우드 제공자의 비용이 발생합니다.
  2. 인프라 비용: 온프레미스 또는 클라우드에서 쿠버네티스 클러스터를 직접 운영할 경우 실행하는 VM이나 하드웨어에 대한 비용이 발생할 수 있습니다.
  3. 운영 및 지원: 클러스터를 운영하거나 쿠버네티스에 대한 전문 지원을 구매하는 경우 추가 비용이 발생할 수 있습니다.

결론적으로, 쿠버네티스 소프트웨어 자체는 오픈 소스이며 무료로 사용할 수 있지만, 운영 환경에서의 셋업, 유지 및 관리, 그리고 추가 서비스나 지원에는 비용이 들 수 있습니다.

쿠버네티스를 ec2에 설치하면?

쿠버네티스를 EC2 인스턴스에 직접 설치하여 운영할 경우, 주로 다음의 비용들이 발생합니다:

  1. EC2 요금: 쿠버네티스 클러스터를 구성하기 위해 사용되는 EC2 인스턴스의 비용입니다. 마스터 노드와 워커 노드를 위한 인스턴스가 필요하며, 클러스터의 크기와 요구 사항에 따라 인스턴스 타입과 개수가 결정됩니다.
  2. EBS 요금: 일부 쿠버네티스 워크로드는 지속적인 스토리지를 필요로 합니다. EBS 볼륨을 사용하는 경우 이에 대한 비용이 추가로 발생합니다.
  3. 데이터 전송 요금: 클러스터 외부와의 데이터 전송, 특히 인터넷을 통한 데이터 전송에 대한 비용이 발생할 수 있습니다.
  4. 추가 AWS 서비스 요금: ELB, Route 53, ECR 등의 서비스를 쿠버네티스와 함께 사용하는 경우 이러한 서비스에 대한 추가 비용이 발생합니다.
  5. 운영 및 관리: 쿠버네티스 클러스터의 운영, 모니터링, 백업, 업그레이드 등의 작업에 대한 비용. 이는 시간적, 인적 리소스로의 비용이 될 수 있습니다.

그러나 AWS의 EKS 같은 관리형 쿠버네티스 서비스를 사용할 경우 추가로 클러스터 관리 비용이 발생하므로, 직접 설치와 관리형 서비스 각각의 장단점과 비용을 비교하여 적절한 선택을 하는 것이 좋습니다.

쿠버네티스 자체는 무료

맞습니다. 쿠버네티스 자체는 오픈 소스 프로젝트로 무료입니다. 그러나 쿠버네티스 클러스터를 운영하고 유지하기 위해 필요한 하드웨어, 클라우드 리소스, 네트워크, 스토리지 등의 리소스에는 비용이 발생합니다.

특히 클라우드 환경에서 쿠버네티스를 운영할 때 다음과 같은 비용들이 고려될 수 있습니다:

  1. 컴퓨트 리소스 비용: 쿠버네티스 노드(마스터 및 워커)로 사용되는 가상 머신이나 물리적 서버의 비용.
  2. 스토리지 비용: 지속적인 스토리지(Persistent Storage)가 필요한 경우, 볼륨에 대한 비용이 발생합니다.
  3. 네트워크 비용: 데이터 전송, 로드 밸런서 사용 등에 따른 비용.
  4. 관리 및 운영 비용: 클러스터의 모니터링, 로깅, 보안 및 업데이트와 같은 운영 관련 비용.

따라서 쿠버네티스를 사용한다고 해서 모든 것이 무료인 것은 아니며, 실제 운영 환경에서의 구성과 요구 사항에 따라 발생하는 비용을 고려해야 합니다.

베이그런트 (Vagrant)

Vagrant는 HashiCorp에서 개발한 오픈 소스 소프트웨어로, 개발자들이 로컬 개발 환경을 통일하고, 관리하며, 공유하기 위해 사용하는 가상화 도구입니다. Vagrant는 다양한 가상화 솔루션(예: VirtualBox, VMware, Hyper-V 등)과 함께 작동하며, 가상 머신의 프로비저닝과 설정을 자동화할 수 있게 해줍니다.

Vagrant의 주요 기능 및 특징은 다음과 같습니다:

  1. 환경 통일: Vagrant는 Vagrantfile이라는 설정 파일을 통해 가상 머신의 구성을 정의합니다. 이 파일을 사용하면 동일한 설정으로 여러 개발자들이 동일한 개발 환경을 쉽게 구축하고 공유할 수 있습니다.
  2. 프로비저닝 자동화: Vagrantfile에는 OS 설치, 소프트웨어 설치, 환경 설정 등의 프로비저닝 과정을 자동화하는 스크립트나 도구(예: Ansible, Chef, Puppet 등)를 지정할 수 있습니다.
  3. 다양한 제공자 지원: Vagrant는 VirtualBox, VMware, AWS, Docker 등 다양한 가상화 및 클라우드 플랫폼을 지원합니다.
  4. 박스 시스템: '박스(box)'는 Vagrant에서 사용하는 기본 이미지 패키지를 의미합니다. Vagrant Cloud라는 중앙 저장소에서 다양한 박스를 찾거나, 직접 만들어 공유할 수 있습니다.
  5. 간편한 사용: 개발자는 몇 가지 명령어(예: vagrant up, vagrant halt, vagrant destroy 등)만으로 가상 환경을 시작하거나 종료할 수 있습니다.

Vagrant는 개발자들이 로컬 환경에서 겪는 "내 컴퓨터에서는 잘 작동하는데..."라는 문제를 해결하기 위해 고안된 도구입니다. Vagrant를 사용하면 다양한 개발 및 테스트 환경을 손쉽게 재현하고, 팀원 간에 쉽게 공유할 수 있습니다.

베이그런트 - 가상 OS의 환경 셋팅을 공유하는 툴

Vagrant는 가상 OS 환경 설정을 쉽게 재현하고 관리할 수 있게 해주는 툴입니다. **Vagrantfile**을 통해 해당 환경의 구성을 코드화하므로, 이 파일을 다른 개발자와 공유함으로써 동일한 환경에서 개발 및 테스트를 진행할 수 있게 됩니다. 이렇게 함으로써, "내 컴퓨터에서는 잘 돌아가는데 다른 컴퓨터에서는 안 돼"라는 문제를 최소화할 수 있습니다. Vagrant는 이러한 이유로 많은 개발 팀에서 로컬 개발 환경의 통일성을 유지하기 위해 사용됩니다.

베어그런트 파일에 셸 프로비전을 추가한다는 뜻

"Vagrant 파일에 셸 프로비전을 추가하라"는 Vagrant를 설정하는 Vagrantfile 내에서 가상 환경을 자동으로 구성하기 위해 셸 스크립트(주로 bash 스크립트)를 사용하도록 지시하는 것을 의미합니다.

프로비저닝(provisioning)은 가상 환경 또는 서버의 초기 설정 및 소프트웨어 설치, 구성 등의 자동화된 과정을 말합니다. Vagrant는 여러 가지 프로비저닝 도구를 지원하는데, 그 중에서도 가장 기본적이고 간단한 방법은 셸 스크립트를 이용한 프로비저닝입니다.

예를 들어, Vagrantfile에 아래와 같은 코드를 추가하면, 가상 환경이 시작될 때 setup.sh라는 셸 스크립트를 실행하게 됩니다.

config.vm.provision "shell", path: "setup.sh"

setup.sh는 보통 해당 가상 환경에 필요한 소프트웨어를 설치하거나, 환경 변수를 설정하거나, 서비스를 시작하는 등의 작업을 포함하게 됩니다.

따라서 "Vagrant 파일에 셸 프로비전을 추가하라"는 것은 이렇게 Vagrantfile에 셸 스크립트를 통한 초기 설정 과정을 정의하라는 것을 의미합니다.

k8s는 자체적으로 설치 가능 or 서비스나 솔루션 이용

쿠버네티스(Kubernetes, 줄여서 k8s)는 컨테이너화된 애플리케이션을 자동으로 배포, 확장 및 관리하는 오픈소스 플랫폼입니다. 쿠버네티스는 자체적으로도 설치하고 실행할 수 있지만, 그 과정이 복잡하기 때문에 여러 도구나 서비스가 이를 간소화하기 위해 제공되고 있습니다.

로컬 환경에서 쿠버네티스를 설치하고 테스트하기 위한 방법은 다양합니다:

  1. Minikube: Minikube는 개발자가 로컬 환경에서 쿠버네티스를 쉽게 실행할 수 있도록 도와주는 도구입니다. Minikube는 단일 노드 쿠버네티스 클러스터를 로컬 머신의 VM 내에서 실행합니다.
  2. Docker Desktop: 최신 버전의 Docker Desktop에는 쿠버네티스가 내장되어 있습니다. Docker Desktop의 설정에서 쿠버네티스를 활성화하면, 로컬에서 쿠버네티스 클러스터를 실행할 수 있습니다.
  3. kind (Kubernetes in Docker): kind는 Docker 컨테이너 내에서 쿠버네티스 클러스터를 실행하기 위한 도구입니다. 주로 테스트나 CI/CD 환경에서 사용됩니다.
  4. k3s: 경량화된 쿠버네티스 배포판으로, 제한된 리소스를 가진 환경(예: IoT 디바이스)에서도 동작할 수 있게 설계되었습니다.

실제 프로덕션 환경에서는 AWS의 EKS, Google Cloud의 GKE, Azure의 AKS와 같은 관리형 쿠버네티스 서비스를 사용하거나, 쿠버네티스 설치 및 관리를 도와주는 도구(예: kops, Rancher)를 이용하여 여러 물리 또는 가상 서버에 분산되어 설치하는 것이 일반적입니다.

로컬 환경에서의 설치는 주로 개발, 테스트 목적으로 사용되며, Minikube나 Docker Desktop을 사용하는 것이 가장 쉽고 편리한 방법 중 하나입니다.

쿠버네티스의 오브젝트나 리소스 생성 명령어

쿠버네티스에서 리소스나 오브젝트를 생성할 때 사용하는 기본 명령어는 kubectl create, kubectl apply, 그리고 kubectl run이 있습니다. 각 명령어의 용도와 차이점은 다음과 같습니다:

  1. kubectl create
    • 이 명령어는 리소스를 생성하기 위해 주로 사용됩니다.
    • 기존에 정의된 YAML 또는 JSON 파일을 사용하여 쿠버네티스 리소스를 생성할 수 있습니다.
    • 예: kubectl create -f pod.yaml
    • 특정 타입의 리소스를 바로 생성할 수도 있는데, 예를 들어 kubectl create namespace my-namespace와 같은 방식으로 사용됩니다.
  2. kubectl apply
    • kubectl apply는 리소스의 선언적 업데이트를 위해 사용됩니다.
    • 이 명령어는 주로 원하는 상태를 YAML 또는 JSON 파일에 선언하고, 그 상태를 쿠버네티스에 적용하기 위해 사용됩니다.
    • 처음 리소스를 생성할 때나 기존 리소스의 구성을 변경할 때 사용할 수 있습니다.
    • 예: 처음 생성할 때 kubectl apply -f deployment.yaml, 변경할 때도 동일한 명령어를 사용합니다.
    • kubectl apply는 원하는 상태와 현재 상태를 비교하여 필요한 변경사항만 적용합니다.
  3. kubectl run
    • 이 명령어는 특정한 이미지를 바탕으로 파드를 바로 생성하기 위한 단축 명령어입니다.
    • 초기에는 다양한 리소스를 생성하기 위한 명령어로 사용되었지만, 최근 버전에서는 주로 파드 생성에 초점을 맞추고 있습니다.
    • 예: kubectl run my-pod --image=myimage:v1

간단히 요약하면, kubectl create는 기본적인 리소스 생성, kubectl apply는 선언적인 리소스 관리, 그리고 kubectl run은 파드를 바로 생성하기 위한 단축 명령어로 사용됩니다.

쿠버네티스의 명령어에 --을 붙이는 이유

쿠버네티스의 kubectl 명령어에서 -- 뒤에 오는 것은 그 명령어의 인수(arguments)나 플래그(flags)로 해석되지 않는 값들입니다. 이는 kubectl뿐만 아니라 다른 많은 명령어 라인 도구에서도 동일하게 적용되는 패턴입니다.

예를 들어, kubectl run 명령어를 사용할 때 특정한 커맨드를 컨테이너에서 실행하려고 할 때 --을 사용하게 됩니다. 이는 kubectl run의 플래그와 실행할 커맨드를 구별하기 위함입니다.

kubectl run mypod --image=myimage -- /bin/sh -c "echo hello"

여기서 -- 뒤의 /bin/sh -c "echo hello"는 컨테이너에서 실행될 커맨드로 해석됩니다.

  • -의 사용은 명령어의 플래그와 그 다음에 오는 값(커맨드나 인수 등)을 명확하게 구분하려는 것으로, 혼동이나 잘못된 해석을 방지하기 위한 것입니다.

쿠버네티스의 자동복구기능

쿠버네티스는 여러 리소스에 대한 장애 복구 및 자동 복구 기능을 제공합니다. 이 기능의 작동 방식은 리소스의 유형에 따라 다르게 적용됩니다.

  1. 디플로이먼트 (Deployment):
    • 디플로이먼트는 원하는 상태(desired state)를 지정하면 쿠버네티스가 실제 상태를 그 상태에 맞추려고 합니다.
    • 예를 들어, 디플로이먼트에서 파드의 복제본(replica) 수를 3으로 지정하면, 쿠버네티스는 해당 파드의 인스턴스가 항상 3개가 유지되도록 합니다.
    • 만약 파드 하나가 실패하면, 디플로이먼트는 자동으로 새 파드를 생성하여 원하는 복제본 수를 유지합니다.
  2. 스테이트풀셋 (StatefulSet):
    • 스테이트풀 애플리케이션에 사용되며, 각 파드에 고유한 식별자를 부여합니다.
    • 파드가 실패하면, 동일한 이름과 스토리지를 가진 파드가 재생성됩니다.
  3. 다른 리소스:
    • 단독으로 실행되는 파드(예: kubectl run으로 생성된 파드)는 자동 복구 기능이 없습니다. 이런 파드가 실패하면, 자동으로 재시작되지 않습니다.
    • 그러나, 해당 파드가 RestartPolicy를 Always로 설정한 경우 (이것은 기본값입니다), 그 파드 내부의 컨테이너가 실패하면 컨테이너 자체는 재시작됩니다. 그러나 파드 자체가 삭제된 경우에는 그대로 종료 상태를 유지합니다.

결론적으로, 쿠버네티스의 자동 복구 기능은 디플로이먼트, 스테이트풀셋 등의 컨트롤러에 의해 관리되는 파드에 대해서만 적용됩니다. 단독으로 실행되는 파드는 해당 기능을 받지 않습니다.

파드와 노드

쿠버네티스에서 파드와 노드는 핵심 개념 중 일부이며, 각각 다른 목적과 특성을 가지고 있습니다.

  1. 파드 (Pod):
    • 파드는 쿠버네티스에서 배포 가능한 가장 작은 단위입니다.
    • 하나 이상의 컨테이너를 포함하며, 같은 파드 안의 컨테이너들은 네트워크와 스토리지를 공유합니다.
    • 파드는 일시적인 생명주기를 가집니다. 파드가 손상되면 새로운 파드가 생성될 수 있지만, 동일한 호스트나 IP 주소를 가진 것은 아닙니다.
    • 파드는 노드에 배포되며, 해당 노드의 리소스를 사용하여 실행됩니다.
  2. 노드 (Node):
    • 노드는 쿠버네티스 클러스터 내에서 워커 머신을 나타냅니다. 노드는 VM(가상 머신) 또는 물리적 서버일 수 있습니다.
    • 각 노드는 Kubelet, 쿠버네티스 런타임(예: Docker, containerd 등) 및 필요한 추가 서비스를 실행합니다.
    • 노드는 파드를 실행하고, 파드의 컨테이너가 사용하는 CPU, 메모리, 스토리지와 같은 리소스를 제공합니다.
    • 노드는 마스터 노드(혹은 컨트롤 플레인)에 의해 관리됩니다.

간단하게 말하자면, 파드는 실행되어야 할 컨테이너의 집합을 나타내며, 노드는 이러한 파드를 실행하는 물리적 또는 가상의 머신을 나타냅니다.

  • ex
    • EC2 인스턴스는 쿠버네티스 클러스터에서 노드로 작동할 수 있습니다. 그리고 해당 EC2 인스턴스 (또는 노드) 위에서 여러 개의 파드가 실행될 수 있습니다. 각 파드 내에는 하나 또는 그 이상의 컨테이너가 포함되어 있습니다. 따라서 여러 파드와 그 안의 컨테이너들이 하나의 EC2 인스턴스에서 동시에 실행될 수 있습니다.

파드는 한 개의 컨테이너가 일반적이지만 경우에 따라 2개의 컨테이너를 한 묶음으로 할수 잇는 가상의 단위 작은 단위

파드는 일반적으로 한 개의 컨테이너로 구성될 수 있지만, 특별한 경우에 여러 개의 컨테이너를 함께 묶어 한 파드 내에서 실행할 수 있습니다. 이런 구성을 멀티-컨테이너 파드라고 합니다. 여러 컨테이너가 같은 파드에 속할 때, 그 컨테이너들은 동일한 네트워크와 스토리지 네임스페이스를 공유합니다.

멀티-컨테이너 파드의 주요 사용 사례 중 하나는 **사이드카 패턴(sidecar pattern)**입니다. 이 패턴에서는 주 컨테이너와 함께 추가적인 보조 컨테이너가 함께 실행되어 주 컨테이너의 기능을 확장하거나 지원합니다.

하지만 대부분의 경우 파드는 단일 컨테이너로 구성되며, 여러 컨테이너를 포함한 파드는 특별한 요구 사항이 있을 때 사용됩니다.

노드포트 서비스

노드포트(NodePort) 서비스는 쿠버네티스에서 서비스를 외부에 노출시키는 방법 중 하나입니다.

노드포트 서비스를 사용하면, 클러스터 내의 특정 포드에 접근하기 위해 클러스터에 속한 모든 노드의 특정 포트가 할당됩니다. 이 할당된 포트를 통해 외부에서 클러스터 내의 서비스에 접근할 수 있게 됩니다.

노드포트 서비스의 동작 방식은 다음과 같습니다:

  1. 쿠버네티스는 30000-32767의 포트 범위 중에서 포트를 선택합니다 (사용자가 지정하지 않았다면).
  2. 해당 포트는 클러스터에 속한 모든 노드에서 동일하게 할당됩니다.
  3. 외부에서 해당 포트로 노드의 IP 주소에 접근하면, 트래픽은 쿠버네티스 서비스로 라우팅됩니다.
  4. 서비스는 해당 트래픽을 적절한 파드로 전달합니다.

예를 들어, 노드포트 서비스가 31000 포트를 할당받았다면, 클러스터의 모든 노드는 31000 포트에서 트래픽을 수신하여 해당 서비스로 전달할 것입니다.

노드포트는 개발 환경 또는 초기 테스트 환경에서 유용할 수 있지만, 대규모 프로덕션 환경에서는 보통 LoadBalancer나 Ingress와 같은 더 고급 방식의 서비스를 사용하는 것이 좋습니다.

서비스를 외부에 노출한다는 의미

"서비스를 외부에 노출시킨다"는 표현은 쿠버네티스 클러스터 안에 있는 서비스를 클러스터 바깥에서 접근할 수 있게 만드는 것을 의미합니다.

쿠버네티스 클러스터 내부에서 실행되는 파드는 기본적으로 클러스터 외부에서 직접 접근할 수 없습니다. 그렇기 때문에 클러스터 외부의 사용자나 시스템이 파드의 애플리케이션에 접근하기 위해서는 해당 파드를 대표하는 "서비스"를 만들고, 이 서비스를 통해 외부 접근이 가능하도록 설정해야 합니다.

이런 노출 방식의 예시는 다음과 같습니다:

  1. ClusterIP: 기본 서비스 유형으로, 서비스를 클러스터 내부 IP에 노출시킵니다. 클러스터 외부에서는 접근할 수 없습니다.
  2. NodePort: 클러스터에 있는 모든 노드의 지정된 포트를 통해 서비스에 접근할 수 있게 합니다. 이를 통해 외부에서 해당 포트로 노드에 접근하면 서비스로 트래픽이 라우팅됩니다.
  3. LoadBalancer: 클라우드 제공자의 로드 밸런서를 사용하여 서비스를 외부에 노출시킵니다. 이 서비스 유형은 쿠버네티스가 호스팅되는 클라우드 제공자가 로드 밸런싱 기능을 지원해야 사용할 수 있습니다.
  4. ExternalName: 이 서비스는 선택적인 CNAME 레코드와 함께 서비스를 외부 이름으로 리턴합니다. 이는 어떤 종류의 프록시를 사용하지 않습니다.

"서비스를 외부에 노출시킨다"는 주로 클러스터 바깥에서 해당 서비스를 사용하고자 할 때 필요합니다. 예를 들어, 웹 서비스나 API를 쿠버네티스 클러스터 내에서 운영하고 있다면, 이를 인터넷 사용자들에게 제공하기 위해 외부에 노출시켜야 할 것입니다.

해당 파드나 노드만 따로 외부에서 접속

서비스를 통해 특정 파드나 노드에 외부에서 접속할 수 있게 설정하는 것입니다. 이를 통해 외부 사용자나 시스템이 쿠버네티스 클러스터 내의 특정 애플리케이션에 접근할 수 있게 되는 것입니다. 서비스의 설정에 따라 특정 노드나 파드만 선택적으로 외부에 노출시킬 수 있습니다.

인그레스

인그레스

인그레스(Ingress)는 클러스터 내부의 서비스를 클러스터 외부에 노출시키기 위한 HTTP와 HTTPS 경로를 정의하는 API 오브젝트입니다. 인그레스는 로드 밸런서, SSL 인증서, 도메인 이름 기반의 가상 호스팅 등을 제공할 수 있습니다.

인그레스의 주요 기능 및 특징은 다음과 같습니다:

  1. 호스트 기반 경로: 도메인 이름과 URL 경로를 기반으로 트래픽을 라우팅합니다.
  2. SSL/TLS: 인그레스를 통한 트래픽에 SSL/TLS 인증서를 적용할 수 있습니다.
  3. 로드 밸런싱: 인그레스 컨트롤러를 사용하여 트래픽 로드 밸런싱을 수행합니다.
  4. 재다이렉션과 리라이트: 특정 URL 경로에 대한 재다이렉션 및 리라이트 규칙을 설정할 수 있습니다.
  5. 인증과 권한 부여: 특정 경로에 대한 접근을 제한하거나 인증을 요구하는 규칙을 설정할 수 있습니다.

인그레스 자체는 요청을 처리할 수 없습니다. 대신 인그레스 리소스를 활용하기 위해 인그레스 컨트롤러가 필요합니다. 인그레스 컨트롤러는 실제 트래픽 라우팅 규칙을 적용하며, 종종 외부 로드 밸런서와 통합되어 작동합니다. 인그레스 컨트롤러의 예로는 NGINX Ingress Controller, Traefik 등이 있습니다.

결론적으로, 인그레스는 쿠버네티스 클러스터 내의 서비스를 보다 세밀하게 외부에 노출시키기 위한 방법을 제공합니다.

파드나 노드를 노트포트를 사용해 외부망에 열어두면 인그레스로 웹브라우저가 볼 수 있게 프로토콜과 SSL인증등을 지원

노드포트는 특정 포트를 외부에 열어서 서비스를 접근 가능하게 만들지만, 이 방법만으로는 도메인 기반의 라우팅이나 SSL/TLS 인증 등의 고급 기능을 제공하기는 어렵습니다.

반면에 인그레스는 클러스터 내부의 서비스를 외부에 노출시킬 때 더 세밀한 제어와 다양한 기능을 제공합니다. 도메인 이름 기반의 라우팅, SSL/TLS 인증, 경로 기반의 라우팅, 리다이렉션, 로드 밸런싱 등의 기능을 활용할 수 있습니다. 웹 브라우저나 다른 클라이언트들이 안전하고 효율적으로 서비스에 접근할 수 있게 해주는 중요한 역할을 합니다.

따라서, 외부에서의 접근을 필요로 하는 웹 애플리케이션 또는 API 서비스를 운영할 때 인그레스를 활용하면 많은 이점을 얻을 수 있습니다.

인그레스는 nginx 서버에서 지원?

인그레스는 쿠버네티스에서의 API 오브젝트 중 하나입니다. 그러나 이 인그레스 자체는 실제 트래픽을 핸들링하는 기능이 없습니다. 대신 실제로 트래픽을 처리하는 부분은 "인그레스 컨트롤러"가 담당합니다.

Nginx는 가장 인기 있는 인그레스 컨트롤러 중 하나로, 쿠버네티스 클러스터 내부에서 동작하는 Nginx 서버를 기반으로 합니다. 이 인그레스 컨트롤러는 인그레스 리소스에 정의된 규칙에 따라 트래픽을 적절한 서비스로 라우팅해주는 역할을 합니다.

물론 Nginx 외에도 다양한 인그레스 컨트롤러가 있습니다. 예를 들면, Traefik, HAProxy, ALB Ingress Controller (AWS에서 사용) 등이 있습니다. 선택하는 인그레스 컨트롤러는 사용자의 요구사항, 환경, 그리고 선호도에 따라 결정될 수 있습니다.

nginx에서 인그레스로 트래픽을 보내주면 인그레스에서 서버 역활을 해주는 오브젝트?

Nginx 인그레스 컨트롤러는 실제로 Nginx 웹 서버를 기반으로 합니다. 쿠버네티스의 인그레스 리소스는 웹 트래픽의 라우팅 규칙을 정의하는 것이며, 이 규칙은 Nginx 인그레스 컨트롤러에 의해 실제 Nginx 설정으로 변환됩니다.

예를 들어, 인그레스 리소스에 example.com의 트래픽을 특정 서비스로 라우팅하도록 설정이 되어 있다면, Nginx 인그레스 컨트롤러는 이 규칙을 읽어서 실제 Nginx의 설정을 변경하여 example.com에 대한 요청을 해당 서비스로 전달하게 됩니다.

즉, 인그레스 자체는 "어떻게" 트래픽을 라우팅할지에 대한 규칙을 정의하는 것이고, Nginx 인그레스 컨트롤러는 그 규칙을 실제로 실행하는 "실행자"나 "서버"의 역할을 합니다.

라우팅 하는 설정을 해주고 그걸 nginx등에 맞게 맞춰서 전달하고 정의하는 오브젝트

인그레스는 쿠버네티스에서 외부의 트래픽을 클러스터 내부의 서비스로 라우팅하는데 사용되는 규칙을 정의하는 오브젝트입니다. 이러한 라우팅 규칙을 실제로 수행하기 위해서는 인그레스 컨트롤러가 필요하며, Nginx 인그레스 컨트롤러는 그 중 한 예입니다. Nginx 인그레스 컨트롤러는 인그레스 오브젝트에 정의된 규칙을 읽어와 실제 Nginx 설정으로 변환하여 외부의 트래픽을 적절한 서비스로 라우팅하게 됩니다.

“nginx자체에서는 잘 안되는가 궁금하고 먼가 복잡하고 쿠버네티스의 내부 플랫봄이 추상화가 되어 있고 복잡해서 인그레스가 필요한건가” 라고 의문을 가짐

Nginx 자체는 높은 유연성을 가진 웹 서버 및 리버스 프록시 서버로, 다양한 라우팅과 부하 분산 기능을 제공합니다. 하지만 쿠버네티스와 같은 컨테이너 오케스트레이션 플랫폼 내에서 동작할 때는 몇 가지 복잡성이 발생합니다.

  1. 동적 환경: 쿠버네티스 클러스터는 동적입니다. 새로운 서비스가 생성되거나 기존 서비스가 삭제되면 해당 트래픽을 올바르게 라우팅하는 Nginx의 설정을 실시간으로 업데이트 해야 합니다.
  2. 서비스 검색: 쿠버네티스에서는 서비스를 생성하면 해당 서비스에 대한 DNS 이름이 자동으로 할당됩니다. 이러한 DNS 이름을 기반으로 트래픽을 라우팅해야 합니다.
  3. 복잡한 트래픽 라우팅: 쿠버네티스 서비스의 복잡한 라우팅 요구사항 (예: 경로 기반 라우팅, 도메인 기반 라우팅 등)을 수용하기 위해 복잡한 Nginx 설정이 필요할 수 있습니다.

이러한 도전을 해결하기 위해 인그레스와 인그레스 컨트롤러가 존재합니다. 인그레스는 트래픽 라우팅 규칙을 선언적으로 정의하는 방법을 제공하며, 인그레스 컨트롤러는 이러한 규칙을 읽고 Nginx와 같은 실제 프록시/로드 밸런서의 설정을 동적으로 업데이트합니다.

결론적으로, 쿠버네티스 환경에서는 인그레스를 사용하여 트래픽 라우팅 규칙을 관리하고, 이러한 규칙을 실제로 적용하기 위해 인그레스 컨트롤러를 사용하는 것이 효과적입니다.

파드는 동적으로 생성되 변경되고 하니 설정이 수시 변함

쿠버네티스 환경에서는 파드가 동적으로 생성되거나 종료될 수 있습니다. 이러한 동적인 환경은 다음과 같은 특징을 가집니다:

  1. 자동 확장: 트래픽 또는 작업량이 증가할 경우, 자동으로 파드의 개수를 늘릴 수 있습니다. 반대로 트래픽이 감소하면 파드의 개수를 줄일 수도 있습니다.
  2. 고 가용성: 하나의 노드에서 문제가 발생하면 해당 노드에서 실행 중이던 파드들은 다른 노드에서 자동으로 재시작됩니다.
  3. 롤링 업데이트: 새로운 버전의 애플리케이션을 배포할 때, 쿠버네티스는 새로운 버전의 파드를 점진적으로 생성하고, 오래된 버전의 파드를 종료시킵니다. 이로 인해 서비스 중단 없이 업데이트가 가능합니다.

이러한 동적인 특징 때문에, 정적인 설정이나 방식으로는 클러스터의 트래픽 라우팅이나 관리가 어려울 수 있습니다. 따라서 인그레스와 같은 도구를 사용하여 동적으로 변화하는 환경에 대응하는 설정을 적용하는 것이 필요합니다.

쿠버네티스의 로드밸런서 서비스

로드 밸런서의 기능과 성능은 일반적으로 다음과 같습니다. 하지만 사용하는 로드 밸런서의 종류나 클라우드 제공자에 따라 약간의 차이가 있을 수 있습니다.

기능

  1. 트래픽 분산: 로드 밸런서의 주요 기능은 들어오는 네트워크 트래픽을 여러 서버 또는 파드에 균등하게 분산하는 것입니다. 이를 통해 단일 서버의 과부하를 방지하며, 서비스의 가용성을 높입니다.
  2. 헬스 체크: 대부분의 로드 밸런서들은 연결된 서버나 파드의 상태를 주기적으로 체크하는 기능을 제공합니다. 만약 특정 서버나 파드에 문제가 발생하면, 해당 서버로의 트래픽을 잠시 중지합니다.
  3. 세션 스틱니스: 일부 애플리케이션에서는 사용자 세션을 한 서버에서만 유지해야 하는 경우가 있습니다. 이런 경우에 로드 밸런서는 특정 사용자의 트래픽을 항상 동일한 서버로 라우팅하는 기능을 제공할 수 있습니다.
  4. SSL/TLS 종료: 로드 밸런서에서 SSL/TLS 암호화의 종료를 처리하게 하여, 백엔드 서버의 부하를 줄이는 기능을 제공합니다.
  5. 보안: 일부 고급 로드 밸런서는 DDoS 공격 방어, 웹 애플리케이션 방화벽 기능 등의 보안 기능도 제공합니다.

성능

로드 밸런서의 성능은 여러 요소에 의해 영향을 받습니다:

  1. 처리량: 로드 밸런서는 초당 처리할 수 있는 요청의 수에 대한 한계를 가질 수 있습니다.
  2. 지연 시간: 로드 밸런서를 거칠 때 추가적인 지연이 발생할 수 있지만, 현대의 로드 밸런서들은 일반적으로 매우 낮은 지연 시간을 가집니다.
  3. 확장성: 트래픽이 증가할 때 로드 밸런서가 요청을 계속 처리할 수 있는지 여부는 중요합니다. 클라우드 기반 로드 밸런서는 자동 확장 기능을 제공하여 트래픽의 급증에 대응할 수 있습니다.
  4. 높은 가용성: 대부분의 로드 밸런서는 고가용성을 위한 설정 옵션을 제공합니다. 이를 통해 하나의 로드 밸런서에 문제가 발생하더라도 다른 로드 밸런서가 트래픽을 처리하도록 할 수 있습니다.

최종적으로 로드 밸런서의 성능과 기능은 사용하는 특정 제품이나 서비스에 따라 다를 수 있으므로, 구체적인 요구 사항에 따라 적절한 로드 밸런서를 선택하는 것이 중요합니다.

MetalLB의 L2 네트워크로 로드밸런서

  • MetalLB는 쿠버네티스에서 로드 밸런서 타입의 서비스를 제공할 수 있도록 설계된 로드 밸런서 솔루션입니다. 클라우드 환경이 아닌 데이터 센터나 온프레미스 환경에서 쿠버네티스를 실행하는 경우, 일반적으로 클라우드 제공자가 제공하는 로드 밸런싱 기능을 사용할 수 없습니다. 이때 MetalLB를 사용하여 로드 밸런싱을 구성할 수 있습니다.
  • MetalLB는 주로 두 가지 모드로 동작합니다: L2 모드 (레이어 2) 및 BGP 모드 (레이어 3). 여기서는 L2 모드에 중점을 둘 것입니다.

L2 (Layer 2) 모드의 특징:

  1. ARP/NDP: L2 모드에서 MetalLB는 ARP (Address Resolution Protocol) 또는 NDP (Neighbor Discovery Protocol)를 사용하여 가상 IP 주소를 알립니다. 클러스터 내의 노드 중 하나가 해당 가상 IP 주소에 대한 트래픽을 받도록 설정됩니다.
  2. IP 주소 할당: MetalLB의 구성에서 IP 주소 풀을 지정할 수 있습니다. 서비스 타입이 LoadBalancer로 설정될 때, MetalLB는 이 IP 주소 풀에서 주소를 할당하고, 해당 주소를 서비스에 연결합니다.
  3. 장애 복구: 현재 트래픽을 처리하는 노드가 실패할 경우, MetalLB는 다른 노드에 가상 IP 주소를 할당하여 서비스의 중단 시간을 최소화합니다.
  4. 단순성: L2 모드는 BGP 모드에 비해 설정이 간단하고 네트워크 구성 요소가 적습니다. 따라서 소규모 또는 간단한 환경에서 적합합니다.

단점으로는, L2 모드에서는 트래픽 분산의 세밀한 제어나 여러 네트워크 경로를 통한 트래픽 라우팅이 어렵습니다. 이러한 고급 기능이 필요한 경우 BGP 모드를 고려해야 합니다.

요약하면, MetalLB의 L2 모드는 온프레미스 쿠버네티스 환경에서 간단하게 로드 밸런싱을 제공하기 위한 방법입니다. ARP 또는 NDP를 사용하여 가상 IP를 클러스터 노드에 할당하고, 해당 노드가 트래픽을 받도록 설정합니다.

L2 (Layer 2) 모드 단순히 말하면 내부망 안에서 ip로 분배

  • L2 (Layer 2) 모드에서는 MetalLB가 내부망 내에서 ARP 또는 NDP를 사용하여 가상 IP 주소를 알립니다. 이렇게 하면 해당 네트워크 내의 장치들이 가상 IP 주소를 인식하고, 쿠버네티스 클러스터 내의 특정 노드로 트래픽을 전달할 수 있게 됩니다. 따라서 L2 모드는 주로 내부망에서의 IP 기반의 트래픽 분배에 적합합니다.

MetalLB의 L2 네트워크로 로드밸런서는 설정가능 및 작동

네, 맞습니다. MetalLB의 L2 네트워크 모드에서는 설정만 하는 것이 아니라 실제로 로드 밸런싱 작업도 수행합니다.

MetalLB는 쿠버네티스 내부에서 로드 밸런서 타입의 서비스를 지원하기 위한 구성 요소입니다. 쿠버네티스 클러스터 내부에서 서비스를 외부로 노출시키기 위한 방법 중 하나로, 로드 밸런서 타입의 서비스를 사용할 수 있습니다. 그런데 많은 베어메탈 환경에서는 클라우드 제공자처럼 로드 밸런서를 자동으로 제공하는 기능이 없습니다. 이러한 문제를 해결하기 위해 MetalLB는 베어메탈 쿠버네티스 환경에서도 로드 밸런서 타입의 서비스를 사용할 수 있게 도와줍니다.

L2 모드에서 MetalLB는 ARP (IPv4) 또는 NDP (IPv6)를 사용하여 클러스터 내의 특정 노드에 가상 IP를 할당합니다. 그 결과 네트워크 내의 다른 장치들은 해당 가상 IP 주소로 패킷을 전송하게 되며, MetalLB는 이를 적절한 파드로 라우팅하여 로드 밸런싱을 수행합니다.

HPA

HPA

HPA는 쿠버네티스에서의 Horizontal Pod Autoscaling의 약자입니다.

HPA는 파드의 수를 자동으로 스케일링하여 트래픽이나 사용량에 따라 자동으로 리소스를 조절할 수 있게 해줍니다. 쿠버네티스에서의 HPA는 CPU 사용률, 메모리 사용량 또는 사용자 정의 메트릭을 기준으로 파드의 수를 조절합니다.

예를 들어, 어플리케이션의 CPU 사용률이 지속적으로 80%를 초과한다면, HPA는 파드의 수를 증가시켜 부하를 분산시키게 됩니다. 반대로, 부하가 감소하면 파드의 수를 줄여 리소스를 절약하게 됩니다.

HPA의 주요 기능 및 특징:

  1. 메트릭 기반 스케일링: CPU 및 메모리 사용률과 같은 표준 메트릭뿐만 아니라 사용자 정의 메트릭에 기반한 스케일링도 지원합니다.
  2. 자동화된 관리: HPA는 지정된 메트릭 임계값에 따라 자동으로 파드의 수를 조절합니다.
  3. API를 통한 구성: kubectl과 같은 쿠버네티스 툴을 사용하여 HPA를 설정하고 관리할 수 있습니다.

HPA를 사용하면 자원 사용률에 따라 애플리케이션의 파드 수를 동적으로 조절할 수 있어, 리소스 효율성과 서비스의 가용성을 동시에 제공하게 됩니다.

“HPA는 최소 최대값만 지정해 주고 온 오프만 지정해주면 되? 아니면 미리 세부적으로 설정이 필요해”라는 의문을 가

HPA 설정 시 주로 고려되는 설정값은 최소 파드 수 (minReplicas), 최대 파드 수 (maxReplicas), 그리고 목표 메트릭 값을 기반으로 하는 대상 값 (예: targetCPUUtilizationPercentage)입니다. 이 설정들을 통해 HPA는 파드의 스케일링 결정을 합니다.

기본적으로는 위의 세 가지 주요 설정값만으로 HPA를 구성할 수 있습니다. 그러나, 좀 더 세밀한 제어를 원하는 경우 다음과 같은 추가 설정도 고려할 수 있습니다:

  1. 쿨다운 기간: 스케일링 작업 사이에 대기 시간을 설정하여, 빈번한 스케일링 작업을 방지합니다.
  2. 사용자 정의 메트릭: CPU나 메모리 외에도 사용자 정의 메트릭을 기반으로 스케일링을 수행하도록 설정할 수 있습니다. 예를 들어, 특정 트래픽 또는 큐의 길이를 기반으로 스케일링을 하고 싶다면 사용자 정의 메트릭을 활용할 수 있습니다.

초기 설정에서는 주요 값들만 설정하고 시작한 후, 시스템의 동작을 관찰하면서 필요에 따라 추가적인 세부 설정을 진행하는 것이 일반적입니다. HPA의 목적은 자동화된 스케일링을 제공하는 것이기 때문에, 대부분의 경우 기본 설정만으로도 충분한 결과를 얻을 수 있습니다.

메트릭 서버(Metrics-Server)는 HPA에 필수

메트릭 서버(Metrics-Server)는 HPA (Horizontal Pod Autoscaler)에서 스케일링 결정을 내릴 때 필요한 리소스 사용량(예: CPU, 메모리 사용량)을 제공하는 주요 컴포넌트입니다.

쿠버네티스 클러스터에서 HPA를 사용하기 위해 주로 다음 단계를 따릅니다:

  1. 메트릭 서버 설치: HPA는 클러스터 내의 파드들의 리소스 사용률을 알아야 합니다. 이 정보는 메트릭 서버를 통해 제공됩니다. 따라서, HPA를 사용하기 위해서는 클러스터에 메트릭 서버를 설치해야 합니다.
  2. HPA 구성: 한 번 메트릭 서버가 작동하면, HPA 리소스를 구성하여 특정 디플로이먼트 또는 스테이트풀셋에 대한 스케일링 정책을 정의할 수 있습니다. 이 때, HPA는 메트릭 서버에서 제공하는 데이터를 기반으로 스케일링 결정을 합니다.

즉, 메트릭 서버는 HPA가 동작하기 위해 필수적인 컴포넌트입니다. HPA는 메트릭 서버로부터 실시간 리소스 사용 데이터를 받아 스케일링 여부를 판단합니다.

AWS EKS나 ECS를 이용할때도 메트릭 서버 설치 필요 여부

AWS에서 ECS나 EKS를 사용할 때 메트릭 서버의 필요성은 다음과 같습니다:

  1. ECS: Amazon ECS는 AWS에서 제공하는 컨테이너 오케스트레이션 서비스로, 자체적인 메트릭 및 모니터링 시스템을 통해 CloudWatch에 데이터를 제공합니다. 따라서 ECS를 사용할 때 별도의 메트릭 서버를 설치할 필요가 없습니다. CloudWatch에서 제공하는 메트릭을 기반으로 알람 및 자동 스케일링을 설정할 수 있습니다.
  2. EKS: Amazon EKS는 AWS에서 제공하는 쿠버네티스 관리형 서비스입니다. EKS를 사용하여 쿠버네티스 클러스터를 구성할 때, HPA를 사용하려면 메트릭 서버를 클러스터에 설치해야 합니다. EKS에 메트릭 서버를 설치하는 것은 일반 쿠버네티스 클러스터에 설치하는 것과 매우 유사합니다. 설치 후, EKS 클러스터 내의 파드 메트릭을 수집하고 HPA에 해당 정보를 제공합니다.

요약하면, ECS는 별도의 메트릭 서버 설치 없이 CloudWatch를 사용하여 스케일링 및 모니터링을 지원합니다. 반면, EKS에서는 쿠버네티스의 HPA를 활용하려면 메트릭 서버를 설치해야 합니다.

메트릭 서버는 여러 종류가 있고 대부분 오픈 소스

메트릭 서버와 관련된 많은 솔루션이 오픈 소스로 제공되고 있습니다. 오픈 소스라는 점은 이러한 도구들이 커뮤니티의 지원을 받아 계속 발전하고, 사용자들이 자유롭게 코드를 검토하거나 개선할 수 있다는 장점을 가지고 있습니다.

쿠버네티스의 환경에서 주로 사용되는 메트릭 관련 오픈 소스 솔루션 몇 가지는 다음과 같습니다:

  1. Metrics Server: 쿠버네티스의 공식 메트릭 수집 도구로, 클러스터 내의 리소스 사용량을 수집합니다. 주로 HPA(Horizontal Pod Autoscaling)에 필요한 메트릭을 제공하는 데 사용됩니다.
  2. Prometheus: 매우 인기 있는 오픈 소스 모니터링 및 알람 솔루션입니다. 쿠버네티스와 통합하여 클러스터, 노드, 파드의 메트릭을 수집하고 저장할 수 있습니다.
  3. Grafana: Prometheus와 함께 사용되는 대시보드 및 시각화 도구로, 사용자가 시각적으로 메트릭을 모니터링할 수 있게 합니다.
  4. OpenTelemetry: 트레이싱, 메트릭, 로깅을 위한 오픈 소스 프로젝트로, 애플리케이션의 성능 모니터링 및 디버깅에 유용합니다.

이 외에도 많은 오픈 소스 메트릭 및 모니터링 솔루션들이 있으며, 특정 요구 사항이나 환경에 따라 적합한 도구를 선택하여 사용할 수 있습니다.

데몬셋이 무엇이고 장점과 사용 목적

데몬셋(DaemonSet)은 쿠버네티스에서 특정한 노드에 하나의 파드 인스턴스를 실행하기 위해 사용되는 리소스 타입입니다. 데몬셋은 클러스터의 각 노드에 파드를 자동으로 배포하며, 새로운 노드가 클러스터에 추가될 때 자동으로 해당 노드에 파드를 추가합니다. 반대로 노드가 클러스터에서 제거될 경우 데몬셋의 파드도 함께 종료됩니다.

데몬셋의 주요 사용 목적:

  1. 노드 모니터링: 노드별로 모니터링 도구나 에이전트를 실행할 때 데몬셋을 사용합니다. 예로, Prometheus Node Exporter와 같은 도구가 있습니다.
  2. 로그 수집: 각 노드에서 로그를 수집하여 중앙 저장소에 전송하는 에이전트를 실행할 때 데몬셋을 사용합니다. 예로, Fluentd나 Filebeat가 있습니다.
  3. 노드의 리소스 관리: 특정 시스템 리소스를 관리하는 도구를 각 노드에 배포할 때 사용됩니다.
  4. 네트워크 설정 및 보안: 네트워크 플러그인이나 보안 관련 에이전트를 각 노드에 배포할 때 사용됩니다.

데몬셋의 주요 장점:

  1. 자동 스케일링: 새로운 노드가 클러스터에 추가될 때 자동으로 해당 노드에 파드를 배포합니다.
  2. 유지 보수: 클러스터에 있는 모든 노드에 일관된 설정 및 버전의 파드를 쉽게 배포하고 유지할 수 있습니다.
  3. 자동 복구: 데몬셋에 의해 관리되는 파드가 어떤 이유로 종료되면 자동으로 재생성됩니다.
  4. 노드별 작업 실행: 각 노드에서 특정 작업을 실행해야 할 때 유용하게 사용됩니다.

데몬셋은 각 노드에서 반드시 실행되어야 하는 백그라운드 작업을 관리하기 위해 설계되었습니다. 이는 노드 레벨의 작업을 쿠버네티스 클러스터에서 쉽게 관리하고 자동화하는 데 도움을 줍니다.

데몬셋은 개발자가 원한 프로젝트와 기능외에 부가적으로 필수적으로 노드마다 따로 설치해야 하는 파드가 잇을 때 데몬셋으로 추가적으로 노드가 깔릴때 마다 자동 설치를 원할 때 쓰는 오브젝트

데몬셋(DaemonSet)은 쿠버네티스 클러스터 내의 모든 노드에 파드를 실행하고자 할 때 사용되는 오브젝트입니다. 특정 노드에 어떤 파드가 반드시 실행되어야 할 경우, 또는 각 노드마다 특정 작업을 수행하는 파드가 필요할 경우에 데몬셋을 사용하게 됩니다.

예를 들면, 각 노드에서 로그나 모니터링 데이터를 수집하는 에이전트나, 스토리지를 관리하는 데 필요한 파드, 특정 네트워크 설정이나 보안 정책을 적용하는 파드 등이 데몬셋을 통해 관리될 수 있습니다.

데몬셋은 새 노드가 클러스터에 추가될 때 해당 노드에 파드를 자동으로 배포하고, 노드가 클러스터에서 제거될 때 해당 파드도 자동으로 삭제합니다. 이로 인해, 노드마다 특정 파드가 항상 실행되도록 보장됩니다.

컨피그맵(ConfigMap)이 무엇이고 장점과 사용 목적

컨피그맵(ConfigMap)은 쿠버네티스에서 환경 구성 정보를 파드와 같은 다른 오브젝트에 주입하는 데 사용하는 API 오브젝트입니다. 컨피그맵은 설정 데이터나 환경변수, 설정 파일의 내용 등을 저장할 수 있습니다. 이를 통해 애플리케이션의 구성을 이미지 내용과 분리하여 관리할 수 있게 합니다.

컨피그맵의 주요 사용 목적:

  1. 환경별 설정 분리: 개발, 스테이징, 프로덕션과 같은 다른 환경에서 실행되는 애플리케이션의 구성 정보를 분리할 수 있습니다.
  2. 구성 정보의 중앙화: 클러스터 내의 여러 파드나 컨테이너에서 사용되는 공통의 구성 정보를 한 곳에서 관리할 수 있습니다.
  3. 컨테이너 이미지와 구성의 분리: 애플리케이션의 이미지와 그 구성 정보를 분리하여, 이미지 재빌드 없이 구성을 변경하거나 업데이트할 수 있습니다.

컨피그맵의 주요 장점:

  1. 재사용성: 동일한 컨피그맵을 여러 파드나 서비스에서 사용할 수 있습니다.
  2. 유연성: 컨피그맵을 변경하면, 해당 변경 사항이 사용 중인 파드나 컨테이너에 동적으로 반영될 수 있습니다.
  3. 보안: 민감한 정보는 시크릿(Secret) 오브젝트에 저장하고, 그 외의 일반적인 구성 정보는 컨피그맵에 저장함으로써 데이터의 민감도에 따라 관리할 수 있습니다.
  4. 버전 관리: 클러스터 외부의 버전 관리 시스템(예: git)과 결합하면, 컨피그맵의 변경 이력을 추적하고 롤백하는 것도 가능합니다.

요약하면, 컨피그맵은 쿠버네티스 환경에서 애플리케이션의 설정 정보를 중앙화하고 효율적으로 관리하는 방법을 제공합니다. 이를 통해 개발자와 운영 팀은 애플리케이션의 구성 정보를 쉽게 업데이트하거나 변경할 수 있게 됩니다.

컨피그맵(ConfigMap)은 여러 파드와 노드에 저장된 설정파일들을 모으고 관리하고 보안까지 겸한 api오브젝트

ConfigMap은 쿠버네티스에서 설정 정보를 분리하고 관리할 수 있게 해주는 API 오브젝트입니다.

ConfigMap을 사용하면 애플리케이션 코드와 설정을 분리할 수 있으므로, 같은 코드를 다른 설정으로 여러 환경에서 실행하거나, 다양한 설정을 가진 여러 파드를 실행할 때 유용합니다.

ConfigMap은 주로 다음과 같은 경우에 사용됩니다:

  1. 설정 정보를 애플리케이션과 분리하고 싶을 때
  2. 동일한 설정 정보를 여러 파드에서 공유하고 싶을 때
  3. 다양한 환경에서 실행되는 파드의 설정을 일관되게 관리하고 싶을 때

ConfigMap은 기본적으로 텍스트 데이터를 저장할 수 있으며, 이 정보는 파드에서 환경 변수나 볼륨으로 사용될 수 있습니다. 또한, ConfigMap은 비밀 정보를 저장하는 데는 적합하지 않습니다. 비밀 정보를 관리하기 위해서는 쿠버네티스의 다른 오브젝트인 Secret을 사용해야 합니다.

PV와 PVC

PV와 PVC는 쿠버네티스에서 스토리지를 사용하고 관리하기 위한 리소스입니다. 이 두 리소스를 통해, 사용자는 어떻게 스토리지를 프로비저닝하고 사용할지를 정의하게 됩니다.

  1. PV (Persistent Volume):
    • 정의: 스토리지의 일부분이나 전체를 나타내는 클러스터 내의 리소스입니다. PV는 어떻게 스토리지가 제공되는지(프로비저닝될 때 어떤 스토리지 클래스를 사용할지, 어떤 액세스 모드를 사용할지 등)의 세부 사항을 포함합니다.
    • 특징: PV는 독립적인 리소스로, PVC에 바인딩 되기 전까지는 사용되지 않습니다.
  2. PVC (Persistent Volume Claim):
    • 정의: 사용자가 스토리지에 대한 요구 사항(예: 용량, 액세스 모드)을 표현하는 요청입니다. 일반적으로 파드와 같은 소비자의 관점에서 스토리지 요구 사항을 정의합니다.
    • 특징: PVC가 생성되고 나면, 쿠버네티스는 해당 요구 사항에 맞는 PV를 찾아 바인딩합니다. 만약 적절한 PV가 없다면, 동적 프로비저닝이 설정된 경우에 새로운 PV가 자동으로 생성됩니다.

동작 과정:

  1. 관리자나 클러스터 자체가 PV를 생성합니다.
  2. 사용자는 PVC를 생성하여 원하는 스토리지 용량과 액세스 모드를 지정합니다.
  3. 쿠버네티스는 PVC와 일치하는 PV를 찾아 바인딩합니다.
  4. 사용자는 파드를 생성하고, PVC를 참조하여 스토리지를 사용합니다.

PV와 PVC의 사용으로, 사용자는 어떤 스토리지 기술을 사용하든 동일한 방식으로 스토리지에 액세스할 수 있으며, 이는 스토리지 프로비저닝과 사용 사이의 추상화를 제공합니다.

pv와 pvc는 노드마다 정해주는 건 아니다 → 별도의 저장공간이 노드 안이 아닌 공유된 저장공간이 따로 있을 수 있다는 말

  • 클러스터(Cluster)란 쿠버네티스에서 여러 노드(Node)들이 모여 구성된 전체 시스템을 의미합니다. 이 노드들은 일반적으로 여러 대의 물리적 또는 가상의 서버로 구성되어 있습니다.
  • PV(Persistent Volume)는 클러스터 전체에서 사용 가능한 스토리지 리소스를 나타냅니다. 이 PV는 특정 노드에 종속되지 않으며, 클러스터 내의 여러 노드에 걸쳐 접근할 수 있습니다. 예를 들어, NFS, AWS EBS, Google Cloud Persistent Disk, Azure Disk 등 다양한 백엔드 스토리지 시스템에 데이터를 저장할 수 있습니다.

따라서 PVC(Persistent Volume Claim)를 사용하면 파드(Pod)는 어느 노드에서 실행되든 동일한 스토리지 리소스에 접근할 수 있게 됩니다. 이렇게 PVC는 파드가 요청하는 스토리지의 용량과 속성을 정의하며, 해당 PVC에 적합한 PV와 바인딩되어 실제 스토리지 리소스를 사용하게 됩니다.

요약하면, 클러스터는 여러 노드들로 구성된 전체 쿠버네티스 시스템을 말하고, PV는 이 클러스터 전체에서 사용 가능한 스토리지를 나타내며, PVC는 이런 스토리지 리소스를 파드가 사용하기 위한 요청 방식입니다.

NFS 볼륨을 파드에 직접 마운트도 가능

사용자가 관리자와 동일한 단일 시스템이라면 PV와 PVC를 사용할 필요가 없

  • NFS(Network File System)는 네트워크를 통해 다른 시스템에 있는 파일 시스템을 마운트하여 사용할 수 있게 해주는 분산 파일 시스템 중 하나입니다. 쿠버네티스에서는 NFS를 지원하는 볼륨 플러그인을 제공하므로, NFS 서버에 저장된 데이터를 파드 내에서 직접 사용할 수 있습니다.

NFS 볼륨을 파드에 마운트하는 과정은 대략 다음과 같습니다:

  1. NFS 서버 설정: 먼저 NFS 서버와 해당 경로를 준비합니다.
  2. 쿠버네티스에서 Persistent Volume (PV) 생성: NFS 서버의 정보와 경로를 지정하여 PV를 생성합니다.
  3. Persistent Volume Claim (PVC) 생성: 파드에서 사용할 스토리지 용량과 접근 모드를 지정하여 PVC를 생성합니다.
  4. 파드 생성: PVC를 사용하여 NFS 볼륨을 파드에 마운트합니다.

이렇게 설정하면 파드는 NFS 볼륨에 저장된 데이터에 접근하고, 데이터를 읽거나 쓸 수 있게 됩니다. 이를 통해 여러 파드가 동일한 데이터에 접근하거나, 데이터를 지속적으로 저장할 필요가 있을 때 유용하게 사용할 수 있습니다.

스테이트풀셋

  • 스테이트풀셋(StatefulSet)은 쿠버네티스에서 스테이트풀 애플리케이션을 관리하기 위한 워크로드 API 오브젝트입니다. 즉, 일반적인 파드와 달리 각 파드에 고유한 식별자와 순서가 보장되는 스토리지를 제공하는 것이 특징입니다.
  • 스테이트풀셋의 주요 특징은 다음과 같습니다:
    1. 고유한 식별자: 스테이트풀셋에 의해 생성된 각 파드는 안정적이고 예측 가능한 이름을 가집니다. (예: web-0, web-1 등)
    2. 안정적이고 지속적인 스토리지: 각 파드에 연결된 볼륨은 파드가 삭제되고 재생성될 때도 변하지 않습니다.
    3. 순서 보장: 스테이트풀셋의 파드는 순서대로 생성되고 종료됩니다. 예를 들면, web-0, web-1, web-2 순서로 생성되며, 종료 시에도 동일한 순서로 종료됩니다.
    4. 서비스 이름: 네트워크 도메인을 관리하는 데 사용되는 이름입니다. 이를 통해 각 파드에 대한 안정적인 네트워크 ID를 제공합니다.

스테이트풀셋은 다음과 같은 경우에 사용되기 적합합니다:

  • 데이터베이스와 같은 스테이트풀 애플리케이션을 운영할 때
  • 각 파드의 식별자와 순서가 중요한 작업에 사용
  • 파드와 함께 지속적인 스토리지를 필요로 하는 경우

스테이트풀셋을 사용하면, 데이터베이스와 같은 스테이트풀 애플리케이션을 쿠버네티스 환경에서 안정적으로 관리하고 운영할 수 있습니다.

스테이트풀셋

  • k8s 자체만 돌리떄는 별 필요 없을 수 는데 다른 외부 라이브러리나 기능이 필요할 떄 거기에 맞는 이름 규격이라든가 이름 생성 순서등이 필요할 때 거기에 맞춰서 생성해주는 것
  • 스테이트풀셋은 쿠버네티스 환경에서 스테이트리스한 애플리케이션을 운영하는 것과는 달리, 각 파드에 대한 고유한 식별자와 지속적인 스토리지가 필요한 스테이트풀한 애플리케이션(예: 데이터베이스, 메시지 브로커 등)을 관리할 때 사용됩니다.
  • 외부 라이브러리나 기능이 특정한 순서나 이름 규칙을 요구할 때 스테이트풀셋은 그 요구사항을 만족시키기 위한 용도로 사용될 수 있습니다. 예를 들면, 분산 데이터베이스의 노드들이 특정 순서로 시작되거나, 각 노드의 데이터가 지속적으로 보존되어야 할 때 스테이트풀셋을 사용하면 이러한 요구사항을 쉽게 만족시킬 수 있습니다.
  • 스테이트풀셋의 핵심 기능 중 하나는 각 파드에 대한 안정적이고 예측 가능한 이름을 제공하는 것입니다. 이 이름은 파드가 재시작되거나 클러스터 내에서 이동될 때도 변하지 않습니다. 따라서 이러한 고유한 이름은 외부 시스템이나 라이브러리와 통합할 때 중요한 역할을 할 수 있습니다.

스테이트풀셋 헤드리스(Headless) 서비스

스테이트풀셋은 헤드리스 서비스와 함께 사용되는 것이 일반적입니다.

헤드리스 서비스는 일반적인 쿠버네티스 서비스와는 약간 다르게 동작합니다. 일반적인 서비스는 (예: ClusterIP 또는 LoadBalancer 타입) 서비스에 접근할 때 해당 서비스에 연결된 파드 중 하나로 트래픽을 로드밸런싱합니다. 반면, 헤드리스 서비스는 로드밸런싱 또는 클러스터IP를 제공하지 않습니다.

대신, 헤드리스 서비스는 DNS에 파드의 IP 주소를 직접 반환하게 됩니다. 즉, 해당 서비스에 DNS 질의를 하면, 서비스와 연결된 모든 파드의 IP 주소들이 반환됩니다.

스테이트풀셋과 헤드리스 서비스를 함께 사용하면, 각 파드는 고유한 DNS 호스트네임 (예: web-0, web-1 등)을 가질 수 있습니다. 이는 분산 시스템, 특히 데이터 저장소와 같은 스테이트풀 애플리케이션에서 각 노드 간의 통신에 매우 유용합니다.

스테이트풀셋에 연결된 헤드리스 서비스는, 스테이트풀셋의 각 파드가 자체적인 고유한 DNS 이름을 가지게 해주어, 파드 간의 안정적인 통신을 보장하는데 도움을 줍니다.

스테이트풀셋와 헤드리스 서비스를 같이 이용하면 트래픽을 라우팅하는 것이 아니라 직접 ip를 제공

스테이트풀셋(StatefulSet)은 스테이트풀(stateful) 애플리케이션에 대한 배포와 스케일링을 관리합니다. 스테이트풀셋의 각 파드는 고유하고 예측 가능한 이름(예: web-0, web-1)을 가집니다.

헤드리스(Headless) 서비스는 일반 서비스와 달리 로드밸런싱과 클러스터 IP를 제공하지 않습니다. 대신, 이 서비스는 직접적인 파드의 IP 주소를 제공합니다. 즉, 헤드리스 서비스는 스테이트풀셋의 파드에 직접 접근할 수 있게 도와줍니다.

스테이트풀셋과 헤드리스 서비스를 같이 사용하면, 각 파드는 고유한 DNS 이름을 가지게 됩니다. 예를 들면, web-0.myservice.default.svc.cluster.local와 같은 형태입니다. 이는 스테이트풀 애플리케이션에서 중요한데, 각각의 인스턴스(파드)가 독립적인 네트워크 신원을 가져야하는 경우가 많기 때문입니다.

따라서, 스테이트풀셋과 헤드리스 서비스를 함께 사용할 때, 트래픽을 일반적인 로드밸런싱 방식으로 라우팅하는 것이 아니라, 애플리케이션이나 클라이언트가 각 파드의 고유한 IP나 DNS 이름을 통해 직접 통신할 수 있게 됩니다.

클라우드 스토리지에서 PV와 PVC가 동적으로 할당이 되는 경우

클라우드 환경에서는 동적 프로비저닝(dynamic provisioning)을 통해 PV와 PVC가 동적으로 할당될 수 있습니다.

동적 프로비저닝은 클러스터 관리자가 미리 스토리지의 볼륨을 생성해두지 않아도 PVC 요청에 따라 자동으로 PV를 생성하게 됩니다. 이를 위해 StorageClass라는 오브젝트를 사용합니다.

StorageClass는 볼륨을 동적으로 프로비저닝할 때 사용되는 스토리지 프로비저너와 프로비저닝할 때 사용되는 파라미터들을 정의합니다. 예를 들면, AWS 환경에서는 EBS, Google Cloud에서는 PD와 같은 클라우드 고유의 스토리지 솔루션을 이용하여 동적 프로비저닝이 이루어집니다.

PVC가 StorageClass를 참조하게 설정되면, 해당 PVC는 StorageClass에 정의된 프로비저너와 설정을 사용하여 PV를 동적으로 생성하게 됩니다.

이러한 방식은 클라우드 환경에서 자주 사용되며, 특히 마이크로서비스 아키텍처와 같이 동적인 환경에서 스토리지 요구사항이 빠르게 변경될 수 있는 경우에 매우 유용합니다.

요약

쿠버네티스는 컨테이너 오케스트레이션 시스템으로, 애플리케이션을 여러 개의 컨테이너로 분리하여 운영할 수 있습니다. 이를 통해 애플리케이션의 확장성과 가용성을 높일 수 있습니다. 그러나 데이터베이스와 같은 스테이트풀한 애플리케이션을 컨테이너로 운영하는 것은 쉽지 않습니다. 이를 해결하기 위해 쿠버네티스에서는 스테이트풀셋(StatefulSet)이라는 오브젝트를 제공합니다.

스테이트풀셋은 각 파드에 안정적이고 예측 가능한 이름을 제공하여 데이터베이스와 같은 스테이트풀한 애플리케이션을 안정적으로 운영할 수 있도록 합니다. 스테이트풀셋은 파드를 순차적으로 생성하고 삭제하여 안정적인 운영을 보장합니다. 또한, 각 파드는 고유한 DNS 이름을 가지며, 헤드리스 서비스와 함께 사용하면 각 파드는 고유한 DNS 이름을 가질 수 있습니다. 이는 분산 시스템, 특히 데이터 저장소와 같은 스테이트풀 애플리케이션에서 각 노드 간의 통신에 매우 유용합니다.

스테이트풀셋과 함께 사용되는 헤드리스 서비스는 일반적인 쿠버네티스 서비스와는 약간 다르게 동작합니다. 일반적인 서비스는 서비스에 접근할 때 해당 서비스에 연결된 파드 중 하나로 트래픽을 로드밸런싱합니다. 반면, 헤드리스 서비스는 로드밸런싱 또는 클러스터IP를 제공하지 않으며, DNS에 파드의 IP 주소를 직접 반환합니다. 이는 각 파드가 고유한 DNS 호스트네임을 가질 수 있도록 하며, 스테이트풀 애플리케이션에서 파드 간의 안정적인 통신을 보장하는데 도움을 줍니다.

클라우드 환경에서는 동적 프로비저닝(dynamic provisioning)을 통해 PV와 PVC가 동적으로 할당될 수 있습니다. 동적 프로비저닝은 PVC 요청에 따라 자동으로 PV를 생성하며, 이를 위해 StorageClass라는 오브젝트를 사용합니다. StorageClass는 볼륨을 동적으로 프로비저닝할 때 사용되는 스토리지 프로비저너와 프로비저닝할 때 사용되는 파라미터들을 정의합니다. PVC가 StorageClass를 참조하게 설정되면, 해당 PVC는 StorageClass에 정의된 프로비저너와 설정을 사용하여 PV를 동적으로 생성하게 됩니다.

스테이트풀셋과 헤드리스 서비스를 함께 사용하면 데이터베이스와 같은 스테이트풀한 애플리케이션을 안정적으로 운영할 수 있습니다. 또한, 클라우드 환경에서는 동적 프로비저닝을 통해 스토리지 요구사항이 빠르게 변경될 수 있는 경우에도 유연하게 대응할 수 있습니다. 이를 통해 쿠버네티스를 활용하여 안정적이고 확장 가능한 애플리케이션을 운영할 수 있습니다.