Kubernetes 확장
지원 버전: Kubernetes 1.32, 1.33, 1.34 마지막 업데이트: 2026년 2월 19일
Kubernetes는 확장성을 고려하여 설계된 플랫폼으로, 다양한 방법으로 기능을 확장할 수 있습니다. 이 장에서는 Kubernetes를 확장하는 다양한 방법과 Amazon EKS에서의 확장 기능 활용 방법에 대해 알아보겠습니다.
목차
Kubernetes 확장 개요
Kubernetes는 다양한 확장 지점을 제공하여 기본 기능을 확장하고 사용자 정의할 수 있습니다. 주요 확장 지점은 다음과 같습니다:
커스텀 리소스: 새로운 API 객체 유형 정의
오퍼레이터: 커스텀 리소스와 컨트롤러를 결합하여 복잡한 애플리케이션 관리
어드미션 컨트롤러: API 요청을 가로채고 수정하거나 검증
API 서버 확장: API 서버에 새로운 엔드포인트 추가
스케줄러 확장: 포드 스케줄링 로직 사용자 정의
클라우드 컨트롤러 매니저: 클라우드 제공업체별 기능 통합
CSI(Container Storage Interface): 스토리지 시스템 통합
CNI(Container Network Interface): 네트워킹 솔루션 통합
디바이스 플러그인: 특수 하드웨어 통합
다음 다이어그램은 Kubernetes의 주요 확장 지점을 보여줍니다:
확장 방법 선택
적절한 확장 방법을 선택하는 데 고려해야 할 사항:
사용 사례: 확장하려는 기능의 유형
복잡성: 구현 및 유지 관리의 복잡성
성능 영향: 확장이 클러스터 성능에 미치는 영향
업그레이드 호환성: Kubernetes 버전 업그레이드와의 호환성
커뮤니티 지원: 확장 방법에 대한 커뮤니티 지원 수준
커스텀 리소스
커스텀 리소스는 Kubernetes API를 확장하여 새로운 객체 유형을 정의하는 방법입니다.
다음 다이어그램은 커스텀 리소스의 작동 방식을 보여줍니다:
커스텀 리소스 정의(CRD)
CRD는 새로운 리소스 유형을 정의하는 가장 간단한 방법입니다:
위 예시에서 Backup이라는 새로운 리소스 유형을 정의하고, 해당 리소스의 스키마와 추가 프린터 열을 지정합니다.
커스텀 리소스 인스턴스 생성
CRD를 정의한 후 해당 유형의 리소스 인스턴스를 생성할 수 있습니다:
커스텀 리소스 검증
CRD에서 OpenAPI v3 스키마를 사용하여 커스텀 리소스의 유효성을 검증할 수 있습니다:
위 예시에서 replicas 필드는 1에서 10 사이의 정수여야 하고, image 필드는 지정된 패턴과 일치해야 합니다.
버전 관리
CRD는 여러 버전을 지원하여 API 진화를 가능하게 합니다:
위 예시에서 v1alpha1, v1beta1, v1 세 가지 버전이 제공되지만, 데이터는 v1 형식으로 저장됩니다.
변환 웹훅
서로 다른 버전 간의 변환을 처리하기 위해 변환 웹훅을 사용할 수 있습니다:
오퍼레이터 패턴
오퍼레이터 패턴은 커스텀 리소스와 컨트롤러를 결합하여 복잡한 애플리케이션의 운영 지식을 자동화하는 방법입니다.
다음 다이어그램은 오퍼레이터 패턴의 작동 방식을 보여줍니다:
오퍼레이터 개념
오퍼레이터는 다음 구성 요소로 이루어집니다:
커스텀 리소스 정의(CRD): 관리할 리소스의 스키마 정의
컨트롤러: 커스텀 리소스의 상태를 모니터링하고 원하는 상태로 조정하는 로직
Kubernetes API 클라이언트: Kubernetes API와 상호 작용하기 위한 클라이언트
오퍼레이터 예시
데이터베이스 오퍼레이터 예시:
오퍼레이터 개발 도구
오퍼레이터를 개발하기 위한 도구:
Operator SDK: Go, Ansible, Helm을 사용하여 오퍼레이터 개발
KUDO(Kubernetes Universal Declarative Operator): 선언적 방식으로 오퍼레이터 개발
Kubebuilder: Go 기반 오퍼레이터 개발 프레임워크
Metacontroller: 웹훅 기반 오퍼레이터 개발
Operator SDK 예시
Operator SDK를 사용한 오퍼레이터 생성:
인기 있는 오퍼레이터
많이 사용되는 오픈 소스 오퍼레이터:
Prometheus Operator: Prometheus 모니터링 스택 관리
Elasticsearch Operator: Elasticsearch 클러스터 관리
etcd Operator: etcd 클러스터 관리
PostgreSQL Operator: PostgreSQL 데이터베이스 관리
Jaeger Operator: Jaeger 분산 추적 시스템 관리
Strimzi Kafka Operator: Apache Kafka 클러스터 관리
Istio Operator: Istio 서비스 메시 관리
어드미션 컨트롤러
어드미션 컨트롤러는 Kubernetes API 서버에 대한 요청을 가로채고 수정하거나 검증하는 플러그인입니다.
다음 다이어그램은 어드미션 컨트롤러의 작동 방식을 보여줍니다:
어드미션 컨트롤러 유형
Kubernetes에는 두 가지 유형의 어드미션 컨트롤러가 있습니다:
변형(Mutating) 어드미션 컨트롤러: 리소스를 변경할 수 있음
검증(Validating) 어드미션 컨트롤러: 리소스를 검증만 할 수 있음
내장 어드미션 컨트롤러
Kubernetes에는 여러 내장 어드미션 컨트롤러가 있습니다:
NamespaceLifecycle: 삭제 중인 네임스페이스에 리소스 생성을 방지
LimitRanger: 포드 및 컨테이너에 기본 리소스 제한 설정
ServiceAccount: 서비스 계정 자동 생성 및 토큰 추가
DefaultStorageClass: PVC에 기본 스토리지 클래스 할당
ResourceQuota: 네임스페이스별 리소스 사용량 제한
PodSecurityPolicy: 포드 보안 정책 적용
NodeRestriction: 노드가 수정할 수 있는 리소스 제한
웹훅 어드미션 컨트롤러
사용자 정의 로직을 구현하기 위해 웹훅 어드미션 컨트롤러를 사용할 수 있습니다:
웹훅 서버 구현
웹훅 서버는 다음과 같은 엔드포인트를 구현해야 합니다:
인기 있는 어드미션 컨트롤러 프로젝트
OPA Gatekeeper: Open Policy Agent를 사용한 정책 적용
Kyverno: YAML 기반 정책 엔진
Istio: 서비스 메시 사이드카 주입
cert-manager: TLS 인증서 관리
API 서버 확장
API 서버 확장은 Kubernetes API 서버에 새로운 엔드포인트를 추가하는 방법입니다.
확장 API 서버
확장 API 서버는 Kubernetes API 서버와 별도로 실행되는 서버로, 커스텀 API를 제공합니다:
확장 API 서버 구현
확장 API 서버는 다음과 같은 구성 요소로 이루어집니다:
API 서버: Kubernetes API 서버와 유사한 인터페이스 제공
리소스 핸들러: 특정 리소스 유형에 대한 요청 처리
스토리지 백엔드: 리소스 데이터 저장
애그리게이션 레이어
애그리게이션 레이어는 여러 API 서버를 단일 API 서버처럼 보이게 합니다:
스케줄러 확장
스케줄러 확장은 Kubernetes 스케줄러의 동작을 사용자 정의하는 방법입니다.
스케줄러 프레임워크
Kubernetes 1.15부터 도입된 스케줄러 프레임워크는 플러그인을 통해 스케줄링 파이프라인의 다양한 단계를 확장할 수 있습니다:
Queue Sort: 스케줄링 큐의 포드 정렬
Pre-filter: 필터링 전 포드 및 클러스터 상태 검사
Filter: 포드를 실행할 수 없는 노드 필터링
Post-filter: 필터링 후 작업 수행
Pre-score: 점수 계산 전 작업 수행
Score: 노드에 점수 부여
Normalize Score: 점수 정규화
Reserve: 포드를 위한 리소스 예약
Permit: 포드 스케줄링 허용, 거부 또는 지연
Pre-bind: 바인딩 전 작업 수행
Bind: 포드를 노드에 바인딩
Post-bind: 바인딩 후 작업 수행
스케줄러 구성
스케줄러 구성 예시:
사용자 정의 스케줄러
자체 스케줄러를 구현하여 Kubernetes와 함께 실행할 수도 있습니다:
포드에서 사용자 정의 스케줄러 지정:
클라우드 컨트롤러 매니저
클라우드 컨트롤러 매니저는 Kubernetes와 클라우드 제공업체 간의 인터페이스를 제공합니다.
클라우드 컨트롤러 매니저 구성 요소
클라우드 컨트롤러 매니저는 다음과 같은 컨트롤러로 구성됩니다:
노드 컨트롤러: 클라우드 제공업체 API를 통해 노드 정보 업데이트
라우트 컨트롤러: 클라우드 네트워크에 라우트 설정
서비스 컨트롤러: 클라우드 로드 밸런서 생성, 업데이트, 삭제
AWS 클라우드 컨트롤러 매니저
AWS 클라우드 컨트롤러 매니저 구성 예시:
CSI(Container Storage Interface)
CSI는 Kubernetes와 스토리지 시스템 간의 표준 인터페이스를 제공합니다.
다음 다이어그램은 CSI의 아키텍처와 작동 방식을 보여줍니다:
CSI 아키텍처
CSI는 다음과 같은 구성 요소로 이루어집니다:
CSI 컨트롤러 플러그인: 볼륨 생성, 삭제, 스냅샷 등의 작업 처리
CSI 노드 플러그인: 볼륨 마운트, 언마운트 등의 작업 처리
CSI 드라이버: 특정 스토리지 시스템과 통합하는 구현체
CSI 드라이버 배포
CSI 드라이버 배포 예시:
스토리지 클래스 및 PVC
CSI 드라이버를 사용하는 스토리지 클래스 및 PVC 예시:
인기 있는 CSI 드라이버
AWS EBS CSI 드라이버: AWS EBS 볼륨 관리
AWS EFS CSI 드라이버: AWS EFS 파일 시스템 관리
GCE PD CSI 드라이버: Google Compute Engine 영구 디스크 관리
Azure Disk CSI 드라이버: Azure 디스크 관리
Ceph RBD CSI 드라이버: Ceph RBD 볼륨 관리
NFS CSI 드라이버: NFS 볼륨 관리
CNI(Container Network Interface)
CNI는 Kubernetes와 네트워킹 솔루션 간의 표준 인터페이스를 제공합니다.
다음 다이어그램은 CNI의 아키텍처와 작동 방식을 보여줍니다:
CNI 아키텍처
CNI는 다음과 같은 구성 요소로 이루어집니다:
CNI 플러그인: 컨테이너 네트워크 인터페이스 구성
IPAM 플러그인: IP 주소 할당 및 관리
메타 플러그인: 여러 플러그인을 조합하여 사용
CNI 플러그인 구성
CNI 플러그인 구성 예시:
인기 있는 CNI 플러그인
Calico: 네트워크 정책 및 보안 기능이 강화된 CNI
Flannel: 간단한 오버레이 네트워크 제공
Cilium: eBPF 기반의 네트워킹 및 보안 솔루션
Weave Net: 멀티 호스트 컨테이너 네트워킹 솔루션
AWS VPC CNI: AWS VPC와 통합된 CNI
Azure CNI: Azure 가상 네트워크와 통합된 CNI
Antrea: Open vSwitch 기반의 네트워킹 솔루션
CNI 플러그인 설치
Calico CNI 플러그인 설치 예시:
디바이스 플러그인
디바이스 플러그인은 Kubernetes와 특수 하드웨어 간의 인터페이스를 제공합니다.
디바이스 플러그인 아키텍처
디바이스 플러그인은 다음과 같은 구성 요소로 이루어집니다:
디바이스 플러그인 서버: 디바이스 검색, 할당, 초기화 등의 작업 처리
kubelet: 디바이스 플러그인과 통신하여 포드에 디바이스 할당
NVIDIA GPU 디바이스 플러그인
NVIDIA GPU 디바이스 플러그인 배포 예시:
GPU 요청 포드
GPU를 요청하는 포드 예시:
인기 있는 디바이스 플러그인
NVIDIA GPU 디바이스 플러그인: NVIDIA GPU 관리
AMD GPU 디바이스 플러그인: AMD GPU 관리
FPGA 디바이스 플러그인: FPGA 디바이스 관리
InfiniBand 디바이스 플러그인: InfiniBand 디바이스 관리
SRIOV 네트워크 디바이스 플러그인: SR-IOV 네트워크 디바이스 관리
Amazon EKS에서의 확장 기능
Amazon EKS는 다양한 확장 기능을 지원하여 Kubernetes 클러스터의 기능을 확장할 수 있습니다.
다음 다이어그램은 Amazon EKS의 확장 기능 아키텍처를 보여줍니다:
EKS 추가 기능
Amazon EKS는 다음과 같은 추가 기능을 제공합니다:
Amazon VPC CNI: AWS VPC와 통합된 네트워킹
CoreDNS: 클러스터 내 DNS 서비스
kube-proxy: 네트워크 프록시
Amazon EBS CSI 드라이버: EBS 볼륨 관리
AWS Load Balancer Controller: AWS 로드 밸런서 관리
AWS Controllers for Kubernetes(ACK)
ACK는 Kubernetes에서 AWS 리소스를 관리할 수 있게 해주는 오퍼레이터 모음입니다:
AWS Load Balancer Controller
AWS Load Balancer Controller는 Kubernetes 서비스 및 인그레스를 AWS 로드 밸런서와 통합합니다:
IAM Roles for Service Accounts(IRSA)
IRSA는 Kubernetes 서비스 계정에 AWS IAM 역할을 연결하여 포드가 AWS 서비스에 안전하게 접근할 수 있게 합니다:
모범 사례
Kubernetes 확장 기능을 구현할 때 고려해야 할 모범 사례를 알아보겠습니다.
설계 모범 사례
표준 인터페이스 사용: 가능한 경우 CSI, CNI 등의 표준 인터페이스 사용
선언적 API 설계: 명령형이 아닌 선언적 API 설계
Kubernetes 디자인 원칙 준수: 컨트롤러 패턴, 레벨 트리거링 등의 원칙 준수
버전 관리: API 버전 관리 및 호환성 유지
최소 권한 원칙: 필요한 최소한의 권한만 부여
구현 모범 사례
재사용 가능한 라이브러리 활용: client-go, controller-runtime 등의 라이브러리 활용
적절한 오류 처리: 오류 상황에 대한 적절한 처리 및 로깅
지수 백오프: 재시도 시 지수 백오프 사용
리소스 제한 설정: 메모리 및 CPU 제한 설정
상태 보고: 리소스 상태 정확히 보고
배포 모범 사례
점진적 롤아웃: 한 번에 모든 것을 변경하지 않고 점진적으로 롤아웃
버전 관리: 이미지 태그에 latest 사용 지양
헬스 체크: 적절한 활성 및 준비 프로브 구성
로깅 및 모니터링: 포괄적인 로깅 및 모니터링 구성
문서화: API 및 사용 방법 문서화
보안 모범 사례
최소 권한 원칙: 필요한 최소한의 권한만 부여
RBAC 사용: 적절한 RBAC 정책 구성
네트워크 정책: 적절한 네트워크 정책 구성
이미지 스캐닝: 컨테이너 이미지 취약점 스캐닝
시크릿 관리: 시크릿 안전하게 관리
EKS 특화 모범 사례
관리형 추가 기능 사용: 가능한 경우 EKS 관리형 추가 기능 사용
IRSA 사용: 포드별 IAM 권한 관리를 위해 IRSA 사용
VPC CNI 구성: 네트워킹 요구 사항에 맞게 VPC CNI 구성
보안 그룹: 적절한 보안 그룹 구성
비용 최적화: 적절한 인스턴스 유형 및 크기 선택
결론
Kubernetes는 다양한 확장 지점을 제공하여 기본 기능을 확장하고 사용자 정의할 수 있습니다. 커스텀 리소스, 오퍼레이터, 어드미션 컨트롤러, API 서버 확장, 스케줄러 확장, CSI, CNI, 디바이스 플러그인 등의 확장 메커니즘을 통해 Kubernetes를 다양한 환경과 요구 사항에 맞게 조정할 수 있습니다.
Amazon EKS는 이러한 확장 기능을 지원하고, 추가적으로 EKS 추가 기능, ACK, AWS Load Balancer Controller, IRSA 등의 AWS 특화 기능을 제공하여 Kubernetes와 AWS 서비스 간의 통합을 간소화합니다.
Kubernetes 확장 기능을 구현할 때는 표준 인터페이스 사용, 선언적 API 설계, 최소 권한 원칙 등의 모범 사례를 따르는 것이 중요합니다. 이를 통해 안정적이고 확장 가능한 Kubernetes 환경을 구축할 수 있습니다.
퀴즈
이 장에서 배운 내용을 테스트하려면 Kubernetes 확장 퀴즈를 풀어보세요.
마지막 업데이트