워크로드 (Workloads)
워크로드 (Workloads)
Kubernetes에서 배포할 수 있는 가장 작은 컴퓨팅 단위인 Pod와, Pod를 실행하는 데 도움을 주는 더 높은 수준의 추상화 개념을 이해합니다.
**워크로드(workload)**란 Kubernetes에서 실행되는 애플리케이션입니다. 워크로드가 단일 컴포넌트든 함께 동작하는 여러 컴포넌트로 구성되든, Kubernetes에서는 Pod 집합 안에서 실행합니다. Kubernetes에서 Pod는 클러스터에서 실행 중인 하나 이상의 컨테이너(containers) 집합을 나타냅니다.
Kubernetes의 Pod는 정의된 라이프사이클(lifecycle)을 갖습니다. 예를 들어, 클러스터에서 Pod가 실행 중일 때 해당 Pod가 실행되는 노드(node)에 치명적인 장애가 발생하면 그 노드의 모든 Pod가 실패합니다. Kubernetes는 이런 수준의 실패를 최종적인 것으로 취급합니다. 즉, 나중에 그 노드가 정상으로 돌아오더라도 복구하려면 새 Pod를 만들어야 합니다.
하지만 훨씬 편리하게 만들기 위해, 각 Pod를 직접 관리할 필요는 없습니다. 대신 사용자를 대신해 Pod 집합을 관리하는 **워크로드 리소스(workload resources)**를 사용할 수 있습니다. 이러한 리소스는 지정한 상태와 일치하도록 올바른 종류의 올바른 수의 Pod가 실행되고 있는지 확인하는 컨트롤러(controller)를 구성합니다.
Kubernetes는 다음과 같은 여러 내장 워크로드 리소스를 제공합니다.
- Deployment와 ReplicaSet (레거시 리소스인 ReplicationController를 대체). Deployment는 클러스터에서 무상태(stateless) 애플리케이션 워크로드를 관리하기에 적합합니다. Deployment의 어떤 Pod든 서로 교체 가능하며 필요 시 교체할 수 있습니다.
- StatefulSet은 어떤 식으로든 상태를 추적하는 하나 이상의 관련 Pod를 실행할 수 있게 해 줍니다. 예를 들어 워크로드가 데이터를 영구적으로 기록한다면, 각 Pod를 PersistentVolume과 연결하는 StatefulSet을 실행할 수 있습니다. StatefulSet의 Pod에서 실행되는 코드는 동일한 StatefulSet의 다른 Pod로 데이터를 복제하여 전반적인 복원력을 향상시킬 수 있습니다.
- DaemonSet은 노드에 국한된 기능을 제공하는 Pod를 정의합니다. DaemonSet의 사양과 일치하는 노드를 클러스터에 추가할 때마다 컨트롤 플레인은 그 새 노드에 DaemonSet용 Pod 하나를 스케줄링합니다. DaemonSet의 각 Pod는 클래식 Unix/POSIX 서버의 시스템 데몬과 유사한 작업을 수행합니다. DaemonSet은 클러스터 네트워킹을 실행하기 위한 플러그인처럼 클러스터 운영의 핵심이 될 수도 있고, 노드 관리에 도움이 될 수도 있으며, 실행 중인 컨테이너 플랫폼을 향상시키는 선택적 동작을 제공할 수도 있습니다.
- Job과 CronJob은 완료될 때까지 실행된 후 중지되는 태스크를 정의하는 서로 다른 방식을 제공합니다. Job은 완료될 때까지 딱 한 번 실행되는 태스크를 정의할 때 사용합니다. CronJob은 스케줄에 따라 동일한 Job을 여러 번 실행할 때 사용합니다.
더 넓은 Kubernetes 생태계에서는 추가 동작을 제공하는 서드파티 워크로드 리소스를 찾을 수 있습니다. 커스텀 리소스 정의(custom resource definition)를 사용하면 Kubernetes 코어에 없는 특정 동작이 필요할 때 서드파티 워크로드 리소스를 추가할 수 있습니다. 예를 들어 애플리케이션용 Pod 그룹을 실행하되 모든 Pod가 사용 가능할 때까지 작업을 중지하고 싶다면(아마도 고처리량 분산 작업을 위해), 그 기능을 제공하는 확장 기능을 구현하거나 설치할 수 있습니다.
워크로드 배치 (Workload placement)
FEATURE STATE: Kubernetes v1.35 [alpha](기본적으로 비활성화)
표준 워크로드 리소스(Deployment, Job 등)는 Pod의 라이프사이클을 관리하지만, Pod 그룹을 단일 단위로 취급해야 하는 복잡한 스케줄링 요구사항이 있을 수 있습니다.
Workload API를 사용하면 Pod를 그룹화하고 갱(gang) 스케줄링 같은 고급 스케줄링 정책을 적용하는 PodGroupTemplates를 정의할 수 있습니다. 컨트롤러는 런타임에 이러한 템플릿에서 PodGroup 객체를 생성하며, Pods는 spec.schedulingGroup 필드를 통해 자신의 PodGroup을 참조합니다. 이는 "전부 아니면 전무(all-or-nothing)" 배치가 필요한 배치 처리 및 머신러닝 워크로드에 특히 유용합니다.
다음 내용 (What's next)
워크로드 관리를 위한 각 API 종류를 읽는 것 외에도, 특정 태스크를 수행하는 방법을 읽을 수 있습니다.
- Deployment를 사용해 무상태 애플리케이션 실행하기
- 유상태 애플리케이션을 단일 인스턴스 또는 복제된 집합으로 실행하기
- CronJob으로 자동화된 태스크 실행하기
코드와 구성을 분리하는 Kubernetes 메커니즘을 배우려면 Configuration을 방문하세요.
Kubernetes가 애플리케이션용 Pod를 어떻게 관리하는지에 대한 배경을 설명하는 두 가지 보조 개념이 있습니다.
- 가비지 컬렉션(garbage collection)은 *소유 리소스(owning resource)*가 제거된 후 클러스터에서 객체를 정리합니다.
- 완료 후 수명(time-to-live after finished) 컨트롤러는 Job이 완료된 후 정의된 시간이 지나면 Job을 제거합니다.
애플리케이션이 실행되기 시작하면 이를 인터넷에서 Service로 제공하거나, 웹 애플리케이션에 한해 Ingress를 사용해 제공하고 싶을 것입니다.