가지 주요 요점
1. 쿠버네티스: 클라우드 네이티브 애플리케이션의 기초
쿠버네티스는 컨테이너 오케스트레이션 플랫폼으로, 그 위에 구축된 다른 플랫폼의 기초를 형성합니다.
분산 프리미티브. 쿠버네티스는 클라우드 네이티브 애플리케이션을 구축하기 위한 새로운 분산 프리미티브 세트를 도입합니다. 여기에는 컨테이너 그룹인 파드(Pods), 네트워킹 및 로드 밸런싱을 위한 서비스(Services), 애플리케이션 수명 주기를 관리하는 다양한 컨트롤러가 포함됩니다. 이러한 프리미티브는 전통적인 인프로세스 빌딩 블록에 비해 더 높은 수준의 추상화를 제공하여 개발자가 인프라 문제보다는 애플리케이션 로직에 집중할 수 있게 합니다.
선언적 접근 방식. 쿠버네티스는 개발자가 애플리케이션의 원하는 상태를 지정하고, 플랫폼이 지속적으로 그 상태를 유지하도록 하는 선언적 모델을 채택합니다. 이 접근 방식은 애플리케이션 관리를 단순화하고 자동화된 치유 및 확장을 가능하게 합니다. 주요 쿠버네티스 개념은 다음과 같습니다:
- 컨테이너: 애플리케이션 코드와 종속성을 패키징하고 격리된 단위
- 파드: 하나 이상의 컨테이너로 구성된 가장 작은 배포 단위
- 서비스: 파드 그룹에 접근하기 위한 안정적인 네트워크 엔드포인트
- 라벨과 주석: 리소스를 조직하고 선택하기 위한 메타데이터
- 네임스페이스: 리소스 격리 및 다중 테넌시를 위한 가상 클러스터
2. 기초 패턴: 컨테이너화된 앱의 빌딩 블록
완전히 자동화되기 위해 클라우드 네이티브 애플리케이션은 상태를 추론할 수 있도록 하여 쿠버네티스가 애플리케이션이 실행 중인지, 요청을 처리할 준비가 되었는지 감지할 수 있어야 합니다.
예측 가능한 요구. 애플리케이션은 리소스 요구 사항과 런타임 종속성을 선언해야 합니다. 이를 통해 쿠버네티스는 배치 및 확장에 대한 지능적인 결정을 내릴 수 있습니다. 주요 측면은 다음과 같습니다:
- 리소스 프로필: CPU 및 메모리 요청과 제한을 지정
- 품질 서비스(QoS) 클래스: Best-Effort, Burstable, Guaranteed
- 파드 우선순위: 파드의 상대적 중요도를 나타냄
선언적 배포. 쿠버네티스는 최소한의 다운타임으로 애플리케이션을 업데이트할 수 있는 메커니즘을 제공합니다:
- 롤링 업데이트: 오래된 파드를 새로운 파드로 점진적으로 교체
- 블루-그린 배포: 두 버전 간의 트래픽 전환
- 카나리 릴리스: 새로운 버전에 대한 트래픽을 점진적으로 증가
건강 프로브 및 관리 수명 주기. 애플리케이션은 건강 검사를 구현하고 수명 주기 이벤트에 응답해야 합니다:
- 생존 프로브: 애플리케이션이 실행 중인지 감지
- 준비 프로브: 애플리케이션이 트래픽을 처리할 준비가 되었는지 결정
- 수명 주기 훅: 시작 및 중지 이벤트에 응답
3. 행동 패턴: 파드 관리 및 서비스 디스커버리
싱글톤 서비스 패턴은 애플리케이션의 인스턴스가 한 번에 하나만 활성화되도록 하면서도 높은 가용성을 보장합니다.
작업 관리. 쿠버네티스는 다양한 유형의 워크로드를 관리하기 위한 추상화를 제공합니다:
- 배치 작업: 유한하고 완료 가능한 작업 실행
- 주기적 작업(CronJobs): 예약된 반복 작업
- 데몬 서비스: 모든 노드에서 시스템 수준 서비스를 실행
상태 저장 서비스. 쿠버네티스는 안정적인 네트워크 ID와 지속적인 스토리지가 필요한 애플리케이션을 관리하기 위해 StatefulSets를 제공합니다:
- 순차적 배포 및 확장
- 안정적인 네트워크 ID
- 파드당 지속적인 스토리지
서비스 디스커버리. 쿠버네티스는 여러 가지 서비스 디스커버리 메커니즘을 제공합니다:
- 클러스터IP 서비스: 내부 통신용
- 노드포트 및 로드밸런서 서비스: 외부 접근용
- 인그레스: HTTP 기반 라우팅 및 로드 밸런싱
4. 구조적 패턴: 파드 내 컨테이너 조직
사이드카 컨테이너는 기존 컨테이너의 기능을 변경하지 않고 확장하고 향상시킵니다.
다중 컨테이너 파드. 쿠버네티스는 여러 컨테이너를 단일 파드로 그룹화할 수 있어 다양한 패턴을 가능하게 합니다:
- 초기화 컨테이너: 메인 컨테이너 시작 전에 초기화 작업 수행
- 사이드카: 메인 컨테이너에 기능 추가
- 어댑터: 이질적인 애플리케이션의 출력을 표준화
- 앰배서더: 외부 서비스와의 통신 프록시
이러한 패턴은 관심사의 분리, 모듈성 및 재사용성을 촉진합니다. 개발자는 파드 추상화가 제공하는 공유 컨텍스트와 리소스를 활용하여 단순하고 단일 목적의 컨테이너로 복잡한 애플리케이션을 구성할 수 있습니다.
5. 구성 패턴: 다양한 환경에 맞춘 애플리케이션 적응
ConfigMaps와 Secrets는 쿠버네티스 API로 쉽게 관리할 수 있는 전용 리소스 객체에 구성 정보를 저장할 수 있게 합니다.
외부화된 구성. 쿠버네티스는 애플리케이션 구성을 관리하기 위한 여러 메커니즘을 제공합니다:
- 환경 변수: 간단한 키-값 쌍
- ConfigMaps: 민감하지 않은 구성 데이터
- Secrets: 비밀번호, API 키 등 민감한 정보
불변 구성. 환경 간 일관성을 보장하기 위해 구성은 불변 컨테이너 이미지로 패키징될 수 있습니다:
- 구성 컨테이너: 구성 데이터를 저장하기 위한 전용 이미지
- 초기화 컨테이너: 공유 볼륨에 구성을 복사
구성 템플릿. 환경 간 약간씩 다른 복잡한 구성을 위해:
- 템플릿 처리: Gomplate와 같은 도구를 사용하여 구성 파일 생성
- 초기화 컨테이너: 파드 초기화 중 템플릿 처리
이러한 패턴은 개발자가 애플리케이션 코드와 구성을 분리하여 이식성을 촉진하고 환경별 문제의 위험을 줄일 수 있게 합니다.
6. 고급 패턴: 쿠버네티스 확장 및 복잡한 워크로드 관리
오퍼레이터는 쿠버네티스와 다른 도메인을 이해하는 쿠버네티스 컨트롤러입니다. 두 영역에 대한 지식을 결합하여 일반적으로 두 도메인을 이해하는 인간 운영자가 필요한 작업을 자동화할 수 있습니다.
컨트롤러와 오퍼레이터. 쿠버네티스는 복잡한 애플리케이션을 관리하기 위해 확장될 수 있습니다:
- 컨트롤러: 리소스 변경에 기반한 사용자 정의 동작 구현
- 오퍼레이터: 도메인별 지식을 인코딩하고 복잡한 작업 자동화
- 사용자 정의 리소스 정의(CRD): 새로운 리소스 유형 정의
프레임워크와 도구. 여러 프로젝트가 컨트롤러와 오퍼레이터 개발을 용이하게 합니다:
- 오퍼레이터 프레임워크: Go 기반 오퍼레이터 구축
- 쿠베빌더: 오퍼레이터 프로젝트 스캐폴딩 및 관리
- 메타컨트롤러: 모든 언어로 오퍼레이터 구현
이러한 패턴은 개발자가 쿠버네티스의 기능을 확장하고 클러스터 내에서 복잡하고 애플리케이션별 작업을 자동화할 수 있게 합니다.
7. 확장 및 빌딩: 탄력적인 애플리케이션 및 클러스터 내 이미지 생성
쿠버네티스의 자동 확장은 고정된 용량이 아닌 다양한 애플리케이션 용량을 정의할 수 있게 하여 다른 부하를 처리하기에 충분한 용량을 보장합니다.
탄력적 확장. 쿠버네티스는 애플리케이션을 확장하기 위한 여러 메커니즘을 제공합니다:
- 수평 파드 자동 확장(HPA): 파드 복제본 수 조정
- 수직 파드 자동 확장(VPA): 리소스 요청 및 제한 수정
- 클러스터 자동 확장: 리소스 수요에 따라 노드 추가 또는 제거
이미지 빌딩. 쿠버네티스를 사용하여 클러스터 내에서 컨테이너 이미지를 빌드할 수 있습니다:
- 오픈시프트 빌드: 다양한 전략을 사용한 통합 이미지 빌드 시스템
- Knative 빌드: 쿠버네티스 네이티브 빌드 프레임워크
- 데몬리스 빌드: img, buildah, Kaniko와 같은 루트리스 이미지 생성 도구
이러한 패턴은 개발자가 탄력적이고 자체 조정 가능한 애플리케이션을 만들고 쿠버네티스의 스케줄링 및 리소스 관리 기능을 활용하여 이미지 빌드 프로세스를 간소화할 수 있게 합니다.
Last updated:
리뷰
Kubernetes Patterns는 대체로 긍정적인 평가를 받고 있으며, 독자들은 흥미로운 내용, 명확한 구조, 실용적인 예시를 칭찬하고 있다. 많은 이들이 Kubernetes 개념과 모범 사례를 이해하는 데 유용하다고 생각한다. 일부 리뷰어들은 책의 패턴 설명 접근 방식을 높이 평가하는 반면, 다른 이들은 특정 "패턴"이 기본적인 Kubernetes 기능에 불과하다고 느낀다. 이 책은 Kubernetes에 대한 깊은 지식을 추구하는 개발자와 시스템 관리자에게 추천되지만, 경험이 많은 실무자에게는 그다지 유용하지 않을 수 있다. 전반적으로, 클라우드 네이티브 애플리케이션을 구축하는 데 도움이 되는 유용한 자료로 간주된다.