클러스터 구성 요소 소개
쿠버네티스 중요 요소들을 논리적으로 간단하게 설명 하고 나눤다면:
Hardware(하드웨어) | Node |
---|---|
Orchestration(오케스트레이션) | Deployment, Job, CronJob, StatefulSet, DaemonSet |
Configuration(구성) | ConfigMap, Secret |
Persistence(지속성) | PersistentVolume, PersistentVolumeClaim(PVC) |
AccessControl(접근 제어) | Namespace, ServiceAccount, Role, ClusterRole |
Exposure(외부 노출) | Service, Ingress |
Node
클러스터 내에서 하드웨어 역할을 한다. 컨테이너화된 워크로드를 실행할 수 있는 물리적 또는 가상의 서버이다. 쿠버네티스 클러스터 내에서 노드는 워커(Worker) 및 마스터(Master)노드로 나눠줘 있다. 각 노드는 클러스터의 일부가되어 컨테이너화된 애플리케이션을 실행하고 클러스터 내에서 다른 노드와 통신한다.
Pod
쿠버네티스에서는 애플리케이션을 배포할 수 있는 최소 단위인 파드(Pod)라는 개념을 제공한다. 파드는 하나 이상의 컨테이너를 포함할 수 있으며, 같은 파드 안에 있는 컨테이너는 동일한 호스트에서 실행된다.
Deployment
레플리카셋(ReplicaSet)을 이용하여 애플리케이션의 배포를 관리한다. Deployment을 사용하면 롤아웃 및 롤백, 업데이트, 스케일링 등을 쉽게 처리할 수 있다.
ReplicaSet
Pod의 수를 관리하고, 원하는 수의 Pod가 항상 실행되도록 유지하는 역할을 하는 오브젝트. ReplicaSet은 주로 Pod을 생성하고, 감시하고, Pod가 정상적으로 실행되지 않을 경우 다른 Pod으로 대체하는 작업을 수행한다.
Job
일회성 작업을 실행하며, 해당 작업이 성공적으로 완료될 때까지 실행을 유지하는 쿠버네티스 리소스. 일반적으로 배치 작업 또는 데이터 처리와 같은 일회성 작업을 수행하는 데 사용된다.
CronJob
쿠버네티스에서 제공하는 오브젝트 중 하나로, 정해진 시간 간격으로 반복적으로 실행되는 Job을 생성하기 위해 사용된다. CronJob을 사용하면 정기적인 작업을 반복적으로 실행할 수 있으며, 예를 들어 백업, 데이터베이스 업데이트, 인덱스 생성 등의 작업을 스케줄링할 수 있다.
StatefulSet
StatefulSet은 ReplicaSet의 확장된 버전이다. 상태(state)를 가지는 애플리케이션을 관리하기 위해 사용된다. 일반적인 Deployment와는 달리, StatefulSet은 각 Pod에 고유한 식별자를 부여하며, Pod가 재시작되더라도 동일한 식별자를 유지한다. 이로 인해 StatefulSet은 데이터베이스나 메시지와 같이 상태가 중요한 애플리케이션을 배포하는 데 적합하다.
HPA(Horizontal Pod Autoscaler)
HPA는 쿠버네티스 클러스터에서 현재 실행 중인 파드 수를 모니터링하고, 이에 대한 CPU나 메모리 사용량 등의 지표를 기반으로 파드 수를 자동으로 조절한다. 이를 통해 클러스터에서 파드 수를 최적화하고, 예상치 못한 트래픽 급증에 대응할 수 있도록 한다.
DaemonSet
모든 노드에 특정 파드를 실행하도록 하는 Kubernetes 오브젝트. 이러한 파드들은 클러스터의 모든 노드에서 실행되며, 노드가 추가될 때 자동으로 파드가 추가되며, 노드가 제거될 때 자동으로 파드도 제거된다. 로그 수집 에이전트나 모니터링 에이전트 실행할때 활용할 수 있다.
Service
하나 이상의 Pod 집합에 대한 네트워크 엔드포인트를 정의하고 안정적인 DNS 이름을 제공하는 Kubernetes 오브젝트. 서비스 옵젝트는 파드 집합에 대한 네트워크 엔드포인트를 제공하며, 애플리케이션에 접근할 수 있는 방법을 제공한다. 서비스 옵젝트에는 ClusterIP, NodePort, LoadBalancer 및 ExternalName이 있다.
Ingress & Ingress Controller
클러스터 내부에 있는 서비스에 접근하기 위한 외부에서의 진입점을 제공하는 쿠버네티스 리소스 옵젝트. HTTP, HTTPS, 그리고 TLS 등의 프로토콜을 지원하며, 라우팅 규칙을 설정하여 클러스터 내부의 다양한 서비스에 대한 접근을 제어할 수 있다.
인그레스는 Ingress Controller와 함께 사용되며, 인그레스 규칙을 수신하여 요청을 올바른 서비스로 라우팅한다. Ingress Controller는 클라우드 제공 업체에서 제공하는 로드밸런서, Nginx, Traefik 등의 소프트웨어를 사용할 수 있다.
Volume
볼륨(Volume)은 컨테이너에서 사용할 수 있는 디스크 공간을 제공합니다. 파드 안에 있는 컨테이너는 볼륨을 공유할 수 있으며, 디스크에 저장된 데이터를 읽고 쓸 수 있습니다.
Persistent Volume Claim & Persistent Volume
Persistent Volume(PV)은 컨테이너화된 어플리케이션에서 사용될 수 있는, 클러스터 레벨에서 정의된 스토리지 볼륨이다. 이 스토리지 볼륨은 클러스터 안의 노드에 있는 물리적 스토리지와 매핑되어, 클러스터 안의 다른 오브젝트와 마찬가지로 클러스터 노드 사이에서 이동될 수 있다.
Persistent Volume Claim(PVC)은 어플리케이션에서 사용할 특정한 Persistent Volume을 요청하는 Kubernetes 오브젝트. 어플리케이션이 필요한 용량, 스토리지 클래스 및 액세스 모드 등을 정의하고 PVC를 사용하여 해당 요청 사항을 표현한다. 이를 통해 어플리케이션은 실제 스토리지를 직접 다루지 않아도 되며, 볼륨에 대한 액세스를 안전하게 보호할 수 있다.
ConfigMap/Secret
애플리케이션에서 사용되는 환경변수, 설정 값 등과 같은 구성 데이터를 저장하는 쿠버네티스 옵젝트. ConfigMap과 Secret의 차이점은, Secret은 보안 데이터를 저장하는데 사용되고, ConfigMap은 설정값 및 환경변수 데이터를 저장한다.
Namespace
쿠버네티스 클러스터 안에서 리소스들을 논리적인 그룹으로 분류하기 위한 추상화된 방법. 각각의 네임스페이스는 자신만의 리소스를 가질 수 있으며, 다른 네임스페이스의 리소스와 격리된다. 즉 Namespace는 클러스터를 논리적으로 분리한다.
Role
Role은 사용자 또는 서비스 계정이 클러스터 내에서 수행할 수 있는 작업 집합을 정의하는 Kubernetes 리소스 중 하나. Role을 사용하여 사용자 또는 서비스 계정에 권한을 할당할 수 있다. Role은 RoleBinding과 함께 사용되며, RoleBinding은 특정 사용자 또는 서비스 계정에 Role을 할당하는 데 사용된다. 즉, RoleBinding은 Role을 사용하여 사용자 또는 서비스 계정에 권한을 부여한다.
ClusterRole
클러스터 자체에서 동작하며 권한을 부여하는 권한 모음이다. 예를 들어, 클러스터 관리자는 클러스터 전체에 대한 역할을 만들어 로그 및 이벤트를 볼 수 있지만, 개발자 역할은 각 네임스페이스에서 사용할 수 있는 권한만 가질 수 있다. 이러한 역할은 클러스터의 모든 네임스페이스에서 권한을 가질 수 있다.
ServiceAccount
클러스터 내부에서 사용자나 프로세스에게 권한을 부여하기 위한 리소스. 쿠버네티스의 계정에는 2종류(유저 어카운트, 서비스 어카운트)가 존재. UserAccount는 엔지니어/개발자 등이 클러스터를 운영하는데 활용. ServiceAccount는 쿠버네티스 서비스 또는 3rd party 서비스(Prometheus, Jenkins등)가 사용하는 계정. 각 네임스페이스마다 디폴트 ServiceAccount가 있다. 이 디폴트 ServiceAccount는 해당 네임스페이스의 모든 파드에 대해 기본적으로 사용되며, 이외의 ServiceAccount는 수동으로 생성하고 사용해야한다.