Kubernetes 객체 관리
Kubernetes 객체 관리 (Kubernetes Object Management)
kubectl 명령줄 도구는 Kubernetes 객체를 생성하고 관리하는 여러 가지 방법을 지원해요. 이 문서는 그 서로 다른 접근 방식을 개괄적으로 소개해요. kubectl로 객체를 관리하는 자세한 내용은 Kubectl 책을 참고해요.
출처: 문서
본문
관리 기법 (Management techniques)
| 관리 기법 | 대상 | 권장 환경 | 지원 작성자 수 | 학습 곡선 |
|---|---|---|---|---|
| 명령형 명령 (Imperative commands) | 실행 중인 객체 | 개발 프로젝트 | 1+ | 가장 낮음 |
| 명령형 객체 구성 (Imperative object configuration) | 개별 파일 | 프로덕션 프로젝트 | 1 | 보통 |
| 선언형 객체 구성 (Declarative object configuration) | 파일 디렉터리 | 프로덕션 프로젝트 | 1+ | 가장 높음 |
명령형 명령 (Imperative commands)
명령형 명령을 사용하면 사용자가 클러스터 안의 실행 중인(live) 객체를 직접 조작해요. 사용자는 kubectl 명령에 인자나 플래그로 작업(operation)을 제공해요.
이 방식은 시작하거나 일회성 작업을 할 때 권장돼요. 실행 중인 객체를 직접 조작하기 때문에 이전 구성에 대한 기록이 남지 않아요.
예시
Deployment 객체를 만들어 nginx 컨테이너 인스턴스를 실행해요:
kubectl create deployment nginx --image nginx
장단점
객체 구성에 비한 장점:
- 명령이 단일 동작 단어로 표현돼요.
- 클러스터에 변경을 가하는 데 단 한 단계만 필요해요.
객체 구성에 비한 단점:
- 변경 검토 프로세스와 통합되지 않아요.
- 변경과 관련된 감사 추적(audit trail)을 제공하지 않아요.
- 실행 중인 것 외에 기록의 원천을 제공하지 않아요.
- 새 객체 생성을 위한 템플릿을 제공하지 않아요.
명령형 객체 구성 (Imperative object configuration)
명령형 객체 구성에서는 kubectl 명령이 작업(create, replace 등), 선택적 플래그, 그리고 최소한 하나의 파일 이름을 지정해요. 지정된 파일은 YAML 또는 JSON 형식으로 객체의 전체 정의를 포함해야 해요.
객체 정의에 대한 자세한 내용은 API 참조를 참고해요.
예시
구성 파일에 정의된 객체를 생성해요:
kubectl create -f nginx.yaml
두 구성 파일에 정의된 객체를 삭제해요:
kubectl delete -f nginx.yaml -f redis.yaml
실행 중인 구성을 덮어써서 구성 파일의 객체를 업데이트해요:
kubectl replace -f nginx.yaml
장단점
명령형 명령에 비한 장점:
- 객체 구성을 Git 같은 소스 제어 시스템에 저장할 수 있어요.
- 객체 구성은 변경 검토와 감사 추적 같은 프로세스와 통합될 수 있어요.
- 객체 구성은 새 객체 생성을 위한 템플릿을 제공해요.
명령형 명령에 비한 단점:
- 객체 구성은 객체 스키마에 대한 기본 이해가 필요해요.
- 객체 구성은 YAML 파일을 작성하는 추가 단계가 필요해요.
선언형 객체 구성에 비한 장점:
- 명령형 객체 구성의 동작이 더 단순하고 이해하기 쉬워요.
- Kubernetes 1.5 버전부터 명령형 객체 구성이 더 성숙해요.
선언형 객체 구성에 비한 단점:
- 명령형 객체 구성은 디렉터리보다 파일에서 가장 잘 동작해요.
- 실행 중인 객체에 대한 업데이트는 구성 파일에 반영해야 해요. 그렇지 않으면 다음 replace 때 손실돼요.
선언형 객체 구성 (Declarative object configuration)
선언형 객체 구성을 사용하면 사용자가 로컬에 저장된 객체 구성 파일을 대상으로 작업하지만, 파일에 수행할 작업을 정의하지는 않아요. 생성·업데이트·삭제 작업은 kubectl이 객체별로 자동 감지해요. 그래서 객체마다 다른 작업이 필요할 수 있는 디렉터리에서도 작업할 수 있어요.
예시
configs 디렉터리의 모든 객체 구성 파일을 처리하고 실행 중인 객체를 생성하거나 패치해요. 먼저 diff로 어떤 변경이 일어날지 확인한 다음 apply를 할 수 있어요:
kubectl diff -f configs/
kubectl apply -f configs/
디렉터리를 재귀적으로 처리해요:
kubectl diff -R -f configs/
kubectl apply -R -f configs/
장단점
명령형 객체 구성에 비한 장점:
- 실행 중인 객체에 직접 가한 변경이, 구성 파일에 병합되지 않더라도 유지돼요.
- 선언형 객체 구성은 디렉터리에서 작업하고 객체별 작업 유형(create, patch, delete)을 자동 감지하는 지원이 더 좋아요.
명령형 객체 구성에 비한 단점:
- 선언형 객체 구성은 예상치 못한 결과가 나올 때 디버깅하고 이해하기 더 어려워요.
- diff를 사용한 부분 업데이트는 복잡한 병합과 패치 작업을 만들어요.
다음 단계
- 명령형 명령으로 Kubernetes 객체 관리
- 구성 파일로 Kubernetes 객체 명령형 관리
- 구성 파일로 Kubernetes 객체 선언형 관리
- Kustomize로 Kubernetes 객체 선언형 관리
- kubectl 명령 참조
- Kubectl 책
- Kubernetes API 참조