Security (Custom Resource Definitions)
- 이번 장에서는 Certified Kubernetes Administrator (CKA) 을 준비하며 "Custom Resource Definitions(CRD)"에 대해서 자세하게 알아보도록 한다.
Custom Resource Definition (CRD)
쿠버네티스 리소스의 기본 이해
리소스와 ETCD

- 쿠버네티스에서 리소스(예: Deployment)를 생성하면 해당 정보는 ETCD 데이터 저장소에 저장된다.
kubectl create
,kubectl get
,kubectl delete
등의 명령어를 통해 ETCD에 저장된 리소스를 생성, 조회, 삭제할 수 있다.
컨트롤러의 역할

- Deployment를 생성하면 설정된 복제본 수만큼 파드가 생성된다. 이 작업은 Deployment 컨트롤러가 수행한다.
- 컨트롤러는 백그라운드에서 실행되는 프로세스로 관리 대상 리소스의 상태를 지속적으로 모니터링한다.
- 리소스의 생성, 수정, 삭제에 따라 클러스터 상태를 원하는 상태로 유지하기 위한 작업을 수행한다.
- 예: Deployment 컨트롤러는 ReplicaSet을 생성하고, ReplicaSet은 파드를 생성한다.
기본 제공 리소스

- ReplicaSet, Deployment, Job, CronJob, StatefulSet, Namespace 등 많은 기본 제공 리소스가 있으며, 각 리소스에는 담당 컨트롤러가 존재한다.
사용자 정의 리소스(Custom Resource)의 필요성
새로운 리소스 정의

- 기존 제공 리소스 외에 사용자 정의 리소스를 생성하여 특정 요구 사항을 충족할 수 있다.
- 예: 항공권 예약 시스템에서
FlightTicket
리소스를 정의하여 항공권 예약을 관리할 수 있다.

사용자 정의 컨트롤러(Custom Controllers)의 역할
- 실제 동작 수행:
- 사용자 정의 리소스를 생성해도 실제 동작(예: 항공권 예약)은 수행되지 않는다.
- 사용자 정의 컨트롤러를 통해 리소스 생성, 수정, 삭제 시 필요한 작업을 수행한다.
- 예:
FlightTicket
컨트롤러는 항공권 예약 API를 호출하여 실제 예약을 처리한다.
- 컨트롤러 구현:
- 컨트롤러는 Go 언어 등으로 구현되며, 리소스의 상태를 감시하고 필요한 작업을 수행한다.
사용자 정의 리소스 정의(Custom Resource Definition, CRD)

- CRD의 필요성
- 사용자 정의 리소스를 사용하기 전에 CRD를 통해 쿠버네티스 API에 해당 리소스를 등록해야 한다.
- CRD는 쿠버네티스에 새로운 리소스 종류를 알리는 역할을 한다.

- CRD 설정 항목
scope
: 네임스페이스 범위 또는 클러스터 범위 설정group
: API 그룹 이름names
: 리소스 종류, 단수/복수 이름, 축약 이름 설정versions
: API 버전 설정 (alpha, beta, v1 등)schema
: 리소스 정의의 스키마 및 유효성 검사 규칙 설정 (OpenAPI v3 스키마 사용)
CRD 생성 및 사용자 정의 리소스 사용
- CRD 생성:
kubectl create -f <CRD 정의 파일>
명령어를 사용하여 CRD를 생성한다.
- 사용자 정의 리소스 생성:
- CRD 생성 후 사용자 정의 리소스를 생성하고 조회, 삭제할 수 있다.
- 컨트롤러의 필요성:
- CRD는 리소스 정의 및 유효성 검사만 수행하며, 실제 동작은 컨트롤러가 담당한다.
Custom Controller
사용자 정의 컨트롤러의 필요성
CRD와 컨트롤러

- CRD를 생성하여 사용자 정의 리소스(
FlightTicket
)를 정의하고 ETCD에 데이터를 저장할 수 있다. - 하지만 실제 동작(항공권 예약 API 호출)은 컨트롤러를 통해 수행해야 한다.
컨트롤러의 역할
- 컨트롤러는 ETCD에 저장된 사용자 정의 리소스의 상태를 감시하고, 변경 사항에 따라 필요한 작업을 수행한다.
- 예:
FlightTicket
컨트롤러는 항공권 예약 API를 호출하여 항공권을 예약, 수정, 취소한다.
컨트롤러 개발 방법
기본 개념
- 컨트롤러는 특정 객체의 변경 이벤트를 감시하고, 루프를 통해 지속적으로 작업을 수행하는 프로세스 또는 코드다.
- 이론적으로는 어떤 언어로든 컨트롤러를 개발할 수 있다. (예: Python)
Go 언어와 Kubernetes Go 클라이언트

- Python으로 컨트롤러를 개발하는 것은 API 호출 비용, 큐 및 캐싱 메커니즘 구현 등의 어려움이 있다.
- Go 언어와 쿠버네티스 Go 클라이언트를 사용하면
shared informers
와 같은 라이브러리를 통해 캐싱 및 큐잉 메커니즘을 쉽게 구현할 수 있다.
샘플 컨트롤러(sample-controller) 사용

- GitHub의
sample-controller
저장소를 클론하여 사용자 정의 컨트롤러 개발을 시작할 수 있다. controller.go
파일을 사용자 정의 로직으로 수정한다.- Go 언어 설치가 필요하다.
컨트롤러 코드 수정
controller.go
파일에 사용자 정의 로직을 추가한다.- 예: 항공권 예약 API를 호출하는 코드를 추가한다.
컨트롤러 빌드 및 실행

- 수정된
controller.go
파일을 빌드한다. kubeconfig
파일을 지정하여 컨트롤러를 실행한다.- 컨트롤러는 로컬에서 실행되며,
FlightTicket
객체 생성을 감시하고 필요한 API 호출을 수행한다.
컨트롤러 배포
도커 이미지 생성

- 사용자 정의 컨트롤러를 도커 이미지로 패키징한다.
쿠버네티스 클러스터 배포

- 도커 이미지를 사용하여 쿠버네티스 클러스터 내에 파드 또는 Deployment로 컨트롤러를 배포한다.
- 클러스터 내에서 실행되면서 API를 감시하고 작업을 수행한다.
Operator Framework
CRD와 사용자 정의 컨트롤러의 결합
기존 방식의 문제점
- CRD와 사용자 정의 컨트롤러는 별도의 엔티티로 관리되며, 수동으로 생성하고 배포해야 한다.
- CRD 생성, 리소스 생성, 컨트롤러 배포 등의 과정을 개별적으로 수행해야 한다.
오퍼레이터 프레임워크의 도입

- 오퍼레이터 프레임워크를 사용하면 CRD와 사용자 정의 컨트롤러를 하나의 엔티티로 패키징하여 배포할 수 있다.
- 오퍼레이터를 배포하면 CRD, 리소스, 컨트롤러가 자동으로 생성 및 배포된다.
- 배포 과정을 자동화하고 관리 효율성을 높일 수 있다.
오퍼레이터의 기능 및 활용
단순 배포 이상의 기능
- 오퍼레이터는 단순히 CRD와 컨트롤러를 배포하는 것 외에도 다양한 기능을 제공한다.

- 애플리케이션의 설치, 유지 관리, 백업/복구, 문제 해결 등의 작업을 자동화한다.
ETCD 오퍼레이터 예시
- EtcdCluster CRD와 사용자 정의 컨트롤러를 포함한다.
- EtcdCluster 리소스를 감시하고 쿠버네티스 클러스터 내에 etcd를 배포한다.
- 백업 및 복구 기능을 제공하며 Backup 및 Restore 오퍼레이터가 추가 작업을 수행한다.
운영자 역할 자동화
- 오퍼레이터는 사람인 운영자가 특정 애플리케이션을 관리하는 작업을 자동화한다.
- 설치, 유지 관리, 백업/복구, 문제 해결 등의 작업을 자동화하여 운영 효율성을 높인다.
오퍼레이터 허브(OperatorHub) 및 설치
다양한 오퍼레이터 제공

- OperatorHub에서 etcd, MySQL, Prometheus, Grafana, Argo CD, Istio 등 다양한 애플리케이션의 오퍼레이터를 찾을 수 있따.
- 각 오퍼레이터의 상세 정보 및 설치 지침을 확인할 수 있다.
간편한 설치

- 오퍼레이터 설치는 3단계로 구성된다.
- Operator Lifecycle Manager(OLM) 설치: 오퍼레이터 수명 주기를 관리한다.
- 오퍼레이터 설치: OperatorHub에서 원하는 오퍼레이터를 설치한다.
- 사용자 정의 리소스 생성: 오퍼레이터에서 제공하는 CRD를 사용하여 원하는 리소스를 생성한다.
참고한 강의
'Infrastructure > Kubernetes' 카테고리의 다른 글
[CKA] Networking (Pre-Requisites) - 1 (0) | 2025.03.11 |
---|---|
[CKA] Storage (0) | 2025.03.11 |
[CKA] Security (Network Policy) (0) | 2025.03.10 |
[CKA] Security (ClusterRole) (0) | 2025.03.10 |
[CKA] Security (KubeConfig) (0) | 2025.03.07 |