워크로드란?
- k8s에서 배포할 수 있는 가장 작은 컴퓨트 오브젝트인 Pod와 이를 실행하는데 도움이 되는 상위단계를 추상화한 것
- 클러스터에서 실행되는 애플리케이션을 관리, 유지, 배포, 확장하는 단위 리소스를 총칭하는 개념
- k8s가 제공하는 built-in 워크로드 리소스
- Deployment, ReplicaSet(레거시 :ReplicationController)
- Deployment가 관리하는 Pod가 필요에 의하여 교체/상호교체가 용이하기 때문에 클러스터는 Stateless 애플레이션를 관리하기 좋다
- StatefulSet
- 데이터 지속성이 필요한 경우처럼 상태를 가지는 애플리케이션을 위한 Pod 집합을 관리
- DaemonSet
- 노드별로 하나씩 Pod를 실행해야 하는 경우 사용
- 클러스터에 노드가 추가되면 자동으로 새 노드에 Pod를 생성
- 시스템 구성요소나 에이전트 실행용으로 사용
- Job, CronJob
- 일회성이나 주기적 작업 실행에 사용
- Deployment, ReplicaSet(레거시 :ReplicationController)
- k8s에선 사용자 정의 워크로드 리소스를 생성 가능한데 이를 CRD(Custom Resource Definition) 이라 함
워크로드 - 사용자 네임스페이스
- 네임스페이스 기능은 컨테이너 사용자(user) 와 호스트(node)의 사용자를 서로 다르게 매핑하도록 하는 기능
- 이렇게 사용될 시, 만약 컨테이너 탈출(컨테이너의 권한을 가지고 컨테이너가 속한 상위 시스템으로 이동?)이 발생 시, 나타날 수 있는 현상을 방지
- 사용자 네임스페이스는 본래 리눅스의 기능이지만 k8s 는 리눅스 커널을 기반으로 사용되기 때문에 사용이 가능
- Pod는 pod.spec.hostUser 필드를 false로 설정하여 사용자 네임스페이스를 사용하도록 선택이 가능
- kubelet은 동일 노드에 있는 두 개의 stateless Pod가 동일 매핑을 사용하지 않도록 Pod가 매핑된 UID, GID를 선택하여 겹치지 않도록 한다.
- 주의
- pod.spec.hostUser 를 false로 설정 시, 호스트 네임스페이스는 사용이 불가
- hostNetwork
- hostIPC
- hostPID
=> 호스트의 네트워크, PID, IPC 등을 공유 불가
- raw 블록 디바이스에 대한 마운트(volumeDevices)가 허용되지 않게됨
- raw 블록 디바이스에 대한 마운트 : 파일시스템 계층을 거치지 않고 스토리지 장치에 대한 직접적인 접근
- pod.spec.hostUser 를 false로 설정 시, 호스트 네임스페이스는 사용이 불가
워크로드 - Pod
Pod 란?
- k8s에서 관리하는 가장 작은 배포 가능한 컴퓨팅 단위
- Pod는 1개 이상의 컨테이너 그룹으로 이 그룹은 스토리지와 네트워크를 공유하며 컨테이너들이 어떻게 구동할지 명세(Spec)을 가짐
- Pod 내 컨테이너들을 같이 배치, 스케줄되며 공유 컨텍스트(범위)에서 실행 됨
- Pod는 논리 포스트를 모델링하며 물리/가상 머신이 아닌 클라우드 환경에서의 호스트 개념
- Pod는 애플리케이션 컨테이너 외에도 초기화 컨테이너를 가질 수도 있으며 임시 컨테이너를 삽입하기도 한다.
- Pod 사용 방식
- Pod 1개당 컨테이너 1개(one-container-per-Pod)
- 여러 컨테이너를 함께 실행하는 Pod(리소스를 공유해야 할 때 사용)
- Pod 리소스 공유 : 네트워크 & 스토리지
- Pod 내 컨테이너들은 스토리지 볼륨과 네트워킹 리소스를 공유
- 이로 인하여 Pod 내 컨테이너들은 localhost로 서로 통신이 가능
Pod 라이프사이클
Pod는 Self-Healing 되지 않고, 비교적 일시적인 수명을 가진 엔티티이다.
Pod 라이프사이클
- Pending
- Pod가 k8s 클러스터에서 승인이 되었지만 컨테이터가 설정되지 않았고 실행할 준비가 되지 않았음을 의미
- 이 정보에는 Pod가 스케줄되기 이전까지의 시간만이 아니라 네트워크를 통한 컨테이너 이미지 다운로드 시간이 포함
- Running
- Pod가 노드에 바인딩되었고 모든 컨테이너가 생성됨을 의미
- 1개 이상의 컨테이너가 실행중이거나 시작, 재시작 중에 있음
- 결과
- Succeeded
- Pod에 있는 모든 컨테이너들이 성공적으로 종료되었고, 재시작이 되지 않을 것임을 의미
- Failed
- Pod 내 모든 컨테이너가 종료되었지만 1개 이상의 컨테이너가 실패로 종료되었음을 의미
- 컨테이너가 exited 되었거나 시스템에 의해 terminated 되었음
- Unknown
- Pod의 상태를 얻을 수 없음을 의미
- 노드와의 통신 오류로 발생
Pod 라이프사이클 훅
- PostStart
- 컨테이너가 생성된 직후에 실행
- 컨테이너의 메인 EntryPoint가 실행되는 것과 병렬로 실행
- 컨테이너가 시작된 후 초기화 작업에 사용되며 실패 시 재시작 정책에 따르게 됨
- PreStop
- 컨테이너가 종료되기 직전에 실행
- Pod 삭제 요청 들어오면 SIGTERM 신호가 컨테이너에 전송되기 전에 PreStop 훅이 실행된다
- 트래픽 처리를 중지하고 연결을 닫고 진행중인 요청을 완료하는 등 정리 작업을 수행하여 컨테이너가 정삭적으로 종료되도록 도움, 실패하더라도 SIGTERM 신호는 계속 전송
Pod의 컨디션
- Pod는 하나의 PodStatus를 가지며 PodConditions 배열을 가짐
- PodConditions 의 값 목록
- PodScheduled : Pod가 노드에 스케줄 됨
- PodHasNetwork : 샌드박스가 성공적으로 생성되고 네트워킹이 구성됨
- ContainersReady : Pod의 모든 컨테이너가 준비됨
- Initialized : 모든 초기화 컨테이너가 성공적으로 완료됨
- Ready : Pod가 요청을 처리할 수 있으며 일치하는 모든 서비스의 로드밸런싱 풀에 추가가 되어야 한다.
Pod의 Hostname
- Pod 생성 시 k8s 는 특정 호스트 이름을 할당(기본적으로 Pod의 이름과 동일, pod-name)
- 이 호스트 이름은 컨테이너 내부의 파일시스템에 있는 /etc/hostname에 기록
- Pod의 서브도메인 이름 설정
- pod.spec.subdomain 필드 정의 시, Fully Qualifiede Domain Name(FQDN)이 형성
- 예 :
<pod-name>.<subdomain-name>.<namespace-name>.svc.<cluster-domain>
- 예 :
- 헤드리스 서비스 필요
- pod.spec.subdomain 필드 정의 시, Fully Qualifiede Domain Name(FQDN)이 형성
- Pod의 커스텀 hostname 설정
- pod.spec.hostname 필드를 정의해 호스트 이름을 설정
- RFC 952 및 RFC 1123에서 정의한 유효한 DNS 호스트 이름 규칙을 따라야함
- /etc/hostname 파일에 기록
Pod 서비스 품질(QoS) 클래스
- k8s 는 Pod 내 컨테이너의 리소스 요청과 제한 설정을 기반으로 QoS 클래스를 할당하는데 이 클래스는 리소스 부족 상황이 발생 시, Pod가 축출될 확률을 결정하는데 도움을 줌
- QoS 클래스 종류
- BestEffort
- 다른 QoS 클래스의 Pod에 할당되지 않은 노드 리소스 사용이 가능
- kubelet이 가장 먼저 축출하는 Pod
- Burstable
- 하한 리소스가 보장(requests 설정된 것을 의미)되지만 한도가 설정되지 않은(limits 설정 안됨) Pod를 의미
- Pod가 QoS 클래스 Guaranteed 기준 미충족
- Pod에 있는 하나 이상의 컨테이너에 메모리 또는 CPU 요청이나 한도 있음
- BestEffort 다음 삭제 대상
- Guaranteed
- Pod의 모든 컨테이너에는 메모리 요청과 한도가 있어야하고 메모리 한도는 요청과 같아야 한다.
- Pod의 모든 컨테이너에는 CPU 요청과 한도가 있어야하고 CPU 한도는 요청과 같아야 한다.
- QoS 클래스 중 유일하게 Static CPU 관리 청잭을 사용해 독점적으로 CPU 사용이 가능
- BestEffort
Pod 중단
- Pod는 누군가 파괴하거나 불가피한 하드웨어 오류, 시스템 SW 오류가 아니면 사라지지 않는게 보통인데 만약 이런 경우이면 비자발적 중단(Involuntary Disruptions)이라하고 아니라면 자발적 중단(Voluntary Disruptions) 이라 한다.
- Voluntary Disruptions의 예시
- 복구나 업그레이드를 위한 노드 드레이닝(Draing)
- Deployment나 Pod를 관리하는 컨트롤러의 제거
- Involuntary Disruptions의 예시
- 물리 머신의 하드웨어 오류
- 커널 패닉
- 리소스 부족으로 인한 Pod 축출
- Pod Disruption Budget(PDB)
- Voluntary Disruptions 으로 인한 애플리케이션의 서비스 중단 영향을 최소화하기 위해 사용하는 k8s 리소스
- 최소한의 가용성 수준을 정의
- 축출 API(Eviction API)와 연동하여 작동
- 사용자나 자동화 프로세스가 Pod 축출을 요청
- k8s 는 PDB를 확인하여 축출요청이 허용되었다면 Pod의 최소 가용성 제약 조건을 위반하는지 검사
- PDB 제약 조건이 충족되지 않으면 축출 요청을 거부
- 축출 요청을 해당 PDB 제약이 충족될 때까지 대기하거나 반복으로 재시도
- 핵심 필드
- 필드 중 1개만 정의가 가능
- minAvailable
- 항상 실행 상태여야하는 Pod의 최소 개수나 % 설정
- maxUnavailable
- 동시에 중단될 수 있는 Pod의 최대 개수나 % 정의
워크로드 - Container
컨테이너 상태
- k8s 는 Pod 뿐만 아니라 컨테이너의 상태 또한 추적이 가능
- 컨테이너 라이프사이클 훅을 사용해 컨테이너 라이프사이클의 특정 지점에서 이벤트 트리거가 가능
- 스케줄러가 노드에 Pod를 할당하면 kubelet은 컨테이너 런타임을 사용해 Pod에 대한 컨테이너 생성을 시작하는데 이 때 컨테이너 상태가 표시된다.
- 표시되는 컨테이너 상태 목록
- Waiting
- 컨테이너가 시작을 완료하는데 필요한 작업을 실행중임음 의미
- Running
- 컨테이너가 문제없이 실행중임을 의미
- Terminated
- 컨테이너가 종료되었음을 의미
- 이 종료에는 정상 종료 + 비정상 종료가 포함
- Waiting
컨테이너 재시작 정책
Pod의 Spec 필드에는 restartPolicy 필드가 있는데 이 필드는 Pod내 모든 컨테이너에 적용이되는 재시작 정책을 의미한다.
사용 가능한 재시작 정책값
- Always : 항상 재시작
- OnFailure : 실패일 때만 재시작
- Never : 재시작 없음
컨테이너 프로브
컨테이너 프로브(Probe)
- 컨테이너에서 kubelet에 의하여 주기적으로 수행되는 진단(diagnostic)
- 진단을 하기 위하여 kubelet은 컨테이너 안에서 코드를 실행하거나 네트워크 요청을 전송한다.
- 체크 메커니즘 방법
- exec
- 컨테이너 내에서 지정된 명령어를 실행
- 상태코드 0이면 진단 성공
- grpc
- gRPC를 사용해 원켴 프로시저 호출을 수행
- 체크 대상이 gRPC 헬스체크를 구현해야 함
- 응답의 status 가 SERVING이면 진단 성공
- 2025.11.26. 기준 알파버전 기능이며 GRPCContainerProbe 기능 게이트를 활성화 해야 사용 가능
- httpGet
- 지정한 포트 및 경로에서 컨테이너 IP주소에 대한 HTTP GET 요청을 하여 진단하는 방법
- 응답이 200 이상 400 미만이면 성공
- tcpSocket
- 지정 포트에서 컨테이너 IP주소에 대해 TCP 검사를 수행
- 포트가 열려있다면 진단을 성공으로 간주하며 원격시스템이 연결을 열고 바로 닫아도 진단이 성공한걸로 판단
- exec
- Probe 결과
- Success
- Failure
- Unknown : 진단 자체가 실패
- Probe 종류
- livenessProbe
- 컨테이너가 동작 중인지 여부 확인
- 실패 시, kubelet이 컨테이너를 kill하고 재시작 정책의 대상이 되도록 함
- readinessProbe
- 컨테이너가 요청을 처리할 준비가 되었는지 여부확인
- 실패 시, EndpointController는 Pod에 연결된 모든 Service들의 Endpoint에서 Pod의 IP주소를 제거하여 연결되지 않도록 함
- startupProbe
- 컨테이너 내 애플리케이션이 시작이 되었는지 나타냄
- 이 프로브가 성공할 때까지 나머지 프로브는 활성화되지 않음 실패 시, livenessProbe의 처리와 동일
- livenessProbe
- Pod의 종료
- 사용자가 API 서버에 Pod 삭제를 요청
- Pod 는 Terminating 상태가 되며 grace period 타이머가 시작
- PreStop 훅 실행
- kubeletdms Pod 컨테이너 프로세스에 SIGTERM 신호를 보냄
- Grace Period 타이머에 설정한 시작이 초과되면 SIGKILL 신호를 전송하여 프로세스를 강제 종료하고 Pod는 API 서버에서 삭제
초기화 컨테이너(init Container)
- Pod의 앱 컨테이너들이 실행되기 전, 실행되는 컨테이너
- 앱 이미지에는 없는 유틸리티나 설정 스크립트 등을 포함
- init 컨테이너는 순서가 있어서 앞순서가 성공적으로 완료되어야 한다.
- init 컨테이너의 특징
- init 컨테이너에 대한 리소스 요청 및 제한(requests, limits)을 정의할 수 있는데 k8s 클러스터 내에서 init 컨테이너에 설정된 리소스 요청/제한 중 가장 높은 비용을 기준으로 삼아 Pod 전체의 유효한 초기 리소스 요청 및 제한값으로 계산한다.
- init 컨테이너 또한 restartPolicy 를 따르고 Pod 전체를 재시작한다.
- init 컨테이너의 용도
- 네트워크 설정
- 외부 서비스에 대한 임시 접속 등을 수행
- 볼륨 준비
- Shared Volume 에 애플리케이션에 필요한 데이터나 파일을 준비
- 사전 조건 대기
- 외부 DB나 다른 MS(Micro Service)가 준비될 때까지 기다리는 작업 수행
- 보안 관리 및 설정
- init 컨테이너는 root 계정을 통해 초기화 작업을 수행하여서 애플리케이션 컨테이너의 권한을 미리 설정하는 작업을 할 수 있다.
- 네트워크 설정
Sidecar Container
- Pod 디자인의 패턴으로 같은 Pod 내에서 실행되는 추가적인 보조 컨테이너
- 메인 애플리케이션 컨테이너와 같은 수명, 네트워크 네임스페이스, 저장소 볼륨 등을 공유하며 함께 작동
- Sidecar 컨테이너를 사용하는 이유는 책임을 분산시키기 위함이다.
- Sidecar 컨테이너의 장점
- 관점 분리(Separation of Concerns)
- 메인 애플리케이션 컨테이너는 핵심 비즈니스 로직에 집중하게 하고 그 밖의 로킹이나 모니터링, 보안 등에 대해서는 Sidecar 컨테이너가 담당하게 되어 구분짓게 한다.
- 재사용성 및 모듈성
- 보조 기능을 별도의 컨테이너로 패키징해 여러 Pod에서 쉽게 재사용 하도록 한다.
=> 일종의 템플릿을 만들어 재사용하기 - 느슨한 결합(Loose Coupling)
- 메인 애플리케이션 컨테이너들은 Sidecar 컨테이너가 어떻게 동작하는지는 영향을 받지 않음
- Lecacy 코드 통합
- 레거시를 수정하지 않고 최신 버전을 추가 가능
- 보조 기능을 별도의 컨테이너로 패키징해 여러 Pod에서 쉽게 재사용 하도록 한다.
- 관점 분리(Separation of Concerns)
- Sidecar 컨테이너의 라이프사이클
- 과거에는 일반 컨테이너처럼 실행되어 시점이 맞지 않는 문제가 있었지만 현재는 init 컨테이너처럼 실행되도록 변경되어 해결됨
- init 컨테이너처럼 메인 애플리케이션 컨테이너 선언 전에 시작되고 init 컨테이너와는 다르게 종료되지 않고 계속 실행되다가 메인 애플리케이션 컨테이너와 같이 종료됨
- 보통 initContainers 필드에 정의가 되지만 해당 컨테이너의 restartPolicy를 Always나 OmFailure로 설정해 재시작이 가능한 init 컨테이너로 만듦
임시 컨테이너(Ephemeral container)
- 실행중인 Pod 내에서 문제해결(TroubleShooting)이나 검사(Inspection) 를 목적으로 임시로 추가되는 컨테이너
- Emphemeral 컨테이너는 Pod 스펙에 저장되지 않으며 Pod 라이프사이클에 맞춰 실행되진 않음
- 컨테이너는 기본적으로 볼변성 원칙을 따르기에 디버깅에 관련된 도구가 없는 경우가 많은데 이 임시 컨테이너에 그 디버깅 도구들을 넣어 임시로 사용하여 실행중인 컨테이너에 접근하도록 함
- Ephemeral 컨테이너의 특징
- 네임스페이스 공유
- PID 네임스페이스 공유
- 애플리케이션 컨테이너의 프로세스 트리를 볼 수 있게 되어 ps, strace 등의 도구로 프로세스를 검사가 가능
- 네트워크 네임스페이스 공유
- 애플리케이션 컨테이너의 네트워크 스택에 접근해 네트워크 문제에 대해 진단이 가능
- PID 네임스페이스 공유
- 제한된 기능 및 리소스
- 포트, 리소스, 프로브 설정 불가
- Pod의 기존 Volume 마운트는 가능
- 네임스페이스 공유
- Ephemeral 컨테이너의 라이프사이클
- 사용자가 실행중인 Pod에 임시 컨테이너 추가 요청을 API서버에 보냄
- kubelet이 Pod 내 임시 컨테이너 생성
- 임시 컨테이너는 메인 프로세스를 실행하고 작업이 끝나면 종료(재시작 없음)
워크로드 - 리소스
- Pod에 대한 메니페스트 파일을 작성해 생성할 수 있지만 워크로드 사용시에는 그보다 상위 레벨 메니페스트 파일에 추가하여 생성이 가능
=> Pod는 워크로드 리소스와 컨트롤러에 의해 관리됨 - Deployment, Job 등의 워크로드 리소스를 생성해 Pod를 사용할 수 있고 만약, Pod의 상태를 추적해야한다면 StatefulSet 리소스도 사용할 수 있다.
- 워크로드 리소스는 내부에 Pod 템플릿을 포함하여 Pod를 생성이 가능하며 Pod 템플릿이 변경되면 새 Pod를 생성하는 방식으로 업데이트함
- Pod 를 관리하는 워크로드 리소스 예시
- Deplyment
- ReplicaSet
- StatefulSet
- DaemonSet
- Job, Cron Job
Deplyment
- 애플리케이션 워크로드를 실행하기 위해 Pod 집합을 관리
- Pod와 ReplicaSet 에 대한 선언적 업데이트를 제공
- Deployment는 Desired State를 정의하고 실제 업데이트 작업은 Deployment 컨트롤러가 함
- 기능
- ReplicaSet 관리
- Deployment는 Pod 템플릿을 기반으로 ReplicaSet을 관리
- ReplicaSet은 Pod를 재생성
- 특정 조건에 따라 새 ReplicaSet을 만들고 이전의 것은 유지하거나 축소
- 선언적 롤아웃
- Deployment는 Pod 템플릿이 변경되면 자동으로 ReplicaSet을 생성하고 선택한 롤아웃 전략을 따름
- ReplicaSet 관리
- Rollout 전략 종류
- RollingUpdate
- 업데이트 동안 가용성을 유지하면서 Pod를 점진적으로 변경하는 것
- maxUnavailable : 업데이트 중 몇 개의 Pod를 비가용 상태로 허용할지
- maxSurge : 지정한 복제본 수보다 얼마나 많은 Pod를 생성할 수 있는지
- Recreate 전략(대체 롤아웃 방식)
- 기존 Pod 모두 삭제 후 새 Pod 생성
- 중단이 있어도 되는 워크로드에 사용될만 함
- RollingUpdate
- Rollback 개념
- Deployment가 과거 ReplicaSet을 기록해 두었다가 문제 발생 시, 기존 상태로 되돌리는 것
- revisionHistoryLimit 값으로 보유할 기록 수를 제어(0이면 롤백 불가)
- Scaling 개념
- Deployment는 복제본 수를 조절해 애플리케이션을 수평적으로 관리가 가능
- Rollout 도중 Scaling이 들어오면 비례적 스케일링(proporitional scaling)으로 신규/이전 ReplicaSet 자원을 분배
- HPA(오토 스케일러)가 Deployment 위에서 작동할 수도 있다.
- Selector 개념
- Deployment는 spec.selector라는 Label 기반 선택기로 어떤 Pod를 관리할지 결정이 가능
- ReplicaSet 과의 관계
- Deployment는 Revision 간 전환을 위해 여러 ReplicaSet을 유지
- 현 버전의 ReplicaSet은 원하는 숫자만큼 유지되며 이전 버전의 ReplicaSet은 scale-down된 채로 남겨저 롤백에 사용된다.
- Deployment가 관리하기 적합한 워크로드
- Stateless 애플리케이션
- 무중단 배포가 필요한 경우
- Rollout/Rollback, Scaling, Revision 이 필요한 경우
- Statefull 애플리케이션의 경우는 StatefulSet을 쓰는게 좋다.
ReplicaSet
- 지정한 수만큼의 Pod를 유지하는 것
- ReplicaSet 생성 시, Pod를 지정한 수만큼 ReplicaSet 컨트롤러가 생성/관리
- 매니페스트 내 구성요소
- Selector(spec.selector)
- ReplicaSet이 관리할 Pod를 지정함
- Pod Template(spec.template)
- Pod 생성을 정의
- Replicas(spec.replicas)
- 복제할 Pod의 수를 지정
- Selector(spec.selector)
- ReplicaSet을 사용하게 되는 상황
- 기본적으로 Pod의 복제가 필요한 경우 사용
- ReplicaSet은 Pod의 복제에 대한 단순한 관리만 지원하므로 세부적인 기능이 필요하다면 Deployment가 사용되어야 함
StatefulSet
- Stateful 한 애플리케이션을 위한 워크로드 API 오브젝트
- Deployment는 애플리케이션의 순서나 식별이 상관없을 때 사용한다면 StatefulSet은 반대로 순서나 식별이 필요 시 사용
- 안정된 네트워크 ID, 지속적인 스토리지 볼륨 등이 필요 시 고려 가능
- StatefulSet의 특징
- 식별이 가능한 네트워크(Stable, unique network identity)
- 각 Pod는 StatefulSet 이름 + 순서에 기반한 고정된 hostname 가지고 유지됨
- 식별이 가능한 순서(index)
- Stable, Persistance Storage(볼륨 + 스토리지 지속성)
- spec.volumeClaimTemplate 로 정의되 PVC를 각 Pod에 자동으로 할당하게 되는데 이렇게 되면 각 Pod는 고유한 저장공간을 가지고 재생성 시에도 같은 스토리지를 사용함
- 순차적 배포 및 스케일링 보장
- 생성 시, 순서대로 생성하고 삭제 시, 역순으로 동작
- 자동/순차 롤링 업데이트 지원
- 식별이 가능한 네트워크(Stable, unique network identity)
DaemonSet
- 클러스터 내에서 각 노드나 일부 노드마다 해당 Pod 복제본 하나씩이 반드시 존재하도록 보장이 필요 시에 사용
- 노드가 클러스터에 추가되면 그 노드에 파드가 스케줄되고 노드가 클러스터에서 제거되면 파드도 따라서 자동 정리
- DaemonSet이 제거가 되면 그로 인하여 생성이 되었던 파드도 같이 제거
- DaemonSet 특징
- replicas 를 설정하지 않음
- spec.template, spec.selector를 정의하며 이것을 기반으로 Pod를 생성
- 특정 노드만 대상으로 하려면 nodeSelector, affinity, nodeLabel을 사용해 어떤 노드에만 파드를 만들지 설정이 가능
- Pod의 RestartPolicy는 항상 always 여야 함
- DaemonSet을 사용하는 경우
- 클러스터의 각 노드에서 반드시 동작해야 하는 것이 필요 시
- 노드와 같은 라이프사이클을 가지는 Pod가 필요 시
- 노드 단위로 반복 실행이 되는 구성요소를 선언적으로 관리 시
- DaemonSet의 업데이트 프로세스
- 노드의 label이 변경 시, DaemonSet은 자동으로 일치하는 노드에만 Pod를 추가하고 조건에 맞지 않는 Pod를 제거
- 기본적으로 DaemonSet 삭제 시 그에 해당하는 Pod도 삭제하지만 cascade옵션에 따라 Pod는 보존할 수 있다.
Job, Cron Job
- 일회성, 일정에 따른 작업에 사용되는 워크로드 오브젝트
- 단일/복수의 작업을 처리하고 사라지는 작업에 적합
- 하나 이상의 Pod를 생성하고 지정 성공 횟수에 도달할 때까지 Pod 재시도 생성
- 개념
- Pod Template 기반 생성
- spec.template 필으에 Pod 의 템플릿 정의
- API 버전이나 종류는 포함하지 않음
- RestartPolicy
- Job은 반드시 RestartPolicy가 Never, OmFailure 여야함
- Pod Template 기반 생성
- 실행 방식
- Non-parallel Job
- 기본값. Pod 생성 후 성공적으로 종료 시 Job완료, 실패 시 재시도
- 고정 완료 개수 병렬 Job
- spec.completions 필드에 성공 Pod 개수 지정
- spec.parallelism 필드에 병렬도 지정
- work-queue Job
- spec.completions 지정하지 않고 spec.parallelism만 설정
- 하나라도 성공하면 나머지 Pod에 있는 작업은 모두 종료하거나 중단해야함
- Non-parallel Job
- Job을 사용해야하는 상황
- 한 번 실행하고 끝나는 작업인 경우
- Pod 실패 시 재시도 해야하는 경우
- Cron Job
- 주기적 스케줄에 따라 자동으로 Job을 생성해 실행하게하는 k8s 리소스
- 구성요소
- spec.schedule
- 의 형식을 따름
- spec.jobTemplate
- Cron Job 이 생성하는 Job 에 대한 템플릿
- spec.schedule
- Cron Job이 사용될 수 있는 상황
- 정기적인 백업, 로그 정리 등 같은 반복 작업 필요 시
- k8s 내부에서 스케줄 + 실행을 관리하려할 시
- 주의점
- 스케줄된 시간이 정확하게 지켜진다는 보장이 없음
- 리소스 과부하 이슈 발생가능
- 완료된 Job 자동 정리(TTL-after-finished)
- Job 리소스의 생존기간을 설정해 이 기간 경과 후 정리하도록 하는 기술
- 동작방식
- Job 매니페스트나 이미 존재하는 Job에 spec.ttlSecondsAfterFinished 필드 설정 시 활성화
- Job 완료 후 상태가 Complete, Failed 시점 후 TTL 카운팅 시작(0 설정 시 바로 삭제)
- 주의점
- TTL-after-finished 컨트롤러는 현재 Job 리소스에만 적용
- TTL 값은 수정이 가능하지만 이미 만료된 후 수정하면 삭제를 보장하진 않음
워크로드 - Autoscaling
- 워크로드가 리소스 변경 필요 시 자동으로 조정되는 기능
- 수동 스케일링 방식
- Horizontal scaling - Pod 수(Replicas) 조절
- Vertical scaling - Pod에 할당된 리소스를 조절
- 수평 , 수직 방식의 차이점
- 수평은 kubectl 명령어로 Replicas 직접 지정
- 수직은 워크로드 리소스 정의(pod spec)를 수정해야 함
- 자동 스케일링 방식
- HorizontalPodAutoscaler(HPA)
- 워크로드의 Replicas 를 관측된 리소스 사용량에 맞춰 자동으로 조정하는 컨트롤러
- Replicas 를 조절할 수 있는 워크로드만 가능
- VerticalPodAutoscaler(VPA)
- Pod에 할당된 리소스 요청을 자동으로 조정하는 도구(k8s에 미포함 되어있어 따로 추가해야함)
- HorizontalPodAutoscaler(HPA)
'Cloud Native > K8s' 카테고리의 다른 글
| k8s 이론: 구성 (0) | 2026.02.23 |
|---|---|
| k8s 이론: 스토리지 (0) | 2026.02.23 |
| k8s 이론: 서비스, 로드밸런싱, 네트워킹 (0) | 2026.02.23 |
| k8s 이론: 아키텍처 (0) | 2026.02.23 |
| k8s 이론: 개요 (0) | 2026.02.23 |