구성 파일로 쿠버네티스 객체 명령적 관리
구성 파일로 쿠버네티스 객체 명령적 관리 (Imperative Management of Kubernetes Objects Using Configuration Files)
쿠버네티스 객체는 kubectl 명령줄 도구와 함께 YAML 또는 JSON로 작성된 객체 구성 파일을 사용해 만들고, 업데이트하고, 삭제할 수 있어요. 이 문서는 구성 파일을 사용해 객체를 정의하고 관리하는 방법을 설명해요.
출처: 문서
본문
시작하기 전에
kubectl을 설치하세요.
쿠버네티스 클러스터가 필요하고, kubectl 명령줄 도구가 클러스터와 통신하도록 설정돼 있어야 해요. 이 튜토리얼은 제어 플레인 호스트 역할을 하지 않는 노드가 최소 두 개 있는 클러스터에서 실행하는 것을 권장해요. 아직 클러스터가 없다면 minikube를 사용하거나 다음 쿠버네티스 플레이그라운드 중 하나를 사용해 만들 수 있어요.
- iximiuz Labs
- Killercoda
- KodeKloud
버전을 확인하려면 kubectl version을 입력하세요.
트레이드오프 (Trade-offs)
kubectl 도구는 세 가지 종류의 객체 관리를 지원해요.
- 명령적 커맨드 (imperative commands)
- 명령적 객체 구성 (imperative object configuration)
- 선언적 객체 구성 (declarative object configuration)
각 객체 관리 방식의 장단점에 대한 논의는 '쿠버네티스 객체 관리' 문서를 참고하세요.
객체 만들기
kubectl create -f를 사용해 구성 파일에서 객체를 만들 수 있어요. 자세한 내용은 쿠버네티스 API 참조를 참조하세요.
kubectl create -f <filename|url>
객체 업데이트하기
경고:
kubectl replace -f를 사용해 구성 파일에 따라 실시간(live) 객체를 업데이트할 수 있어요.
kubectl replace -f <filename|url>
객체 삭제하기
kubectl delete -f를 사용해 구성 파일에 설명된 객체를 삭제할 수 있어요.
kubectl delete -f <filename|url>
참고:
구성 파일이 metadata 섹션에서 name 필드 대신 generateName 필드를 지정한 경우, kubectl delete -f <filename|url>로는 객체를 삭제할 수 없어요. 객체를 삭제하려면 다른 플래그를 사용해야 해요. 예를 들어:
kubectl delete <type> <name>
kubectl delete <type> -l <label>
객체 보기
kubectl get -f를 사용해 구성 파일에 설명된 객체에 대한 정보를 볼 수 있어요.
kubectl get -f <filename|url> -o yaml
-o yaml 플래그는 전체 객체 구성을 출력하도록 지정해요. 옵션 목록을 보려면 kubectl get -h를 사용하세요.
제한 사항 (Limitations)
create, replace, delete 명령은 각 객체의 구성이 완전히 정의되고 구성 파일에 기록되어 있을 때 잘 동작해요. 하지만 실시간 객체가 업데이트되고 그 업데이트가 구성 파일에 병합되지 않으면, 다음에 replace를 실행할 때 그 업데이트는 손실돼요. 이는 HorizontalPodAutoscaler 같은 컨트롤러가 실시간 객체를 직접 업데이트할 때 발생할 수 있어요. 예를 들어:
- 구성 파일에서 객체를 만들어요.
- 다른 소스가 어떤 필드를 변경해 객체를 업데이트해요.
- 구성 파일에서 객체를 replace해요. 2단계에서 다른 소스가 만든 변경은 손실돼요.
같은 객체에 여러 작성자(writer)를 지원해야 한다면 kubectl apply를 사용해 객체를 관리할 수 있어요.
구성 저장 없이 URL에서 객체 만들고 편집하기
객체 구성 파일의 URL이 있다고 해 보죠. 객체가 생성되기 전에 구성을 변경하려면 kubectl create --edit를 사용할 수 있어요. 이는 독자가 수정할 수 있는 구성 파일을 가리키는 튜토리얼과 작업에 특히 유용해요.
kubectl create -f <url> --edit
명령적 커맨드에서 명령적 객체 구성으로 마이그레이션하기
명령적 커맨드에서 명령적 객체 구성으로 마이그레이션하는 것은 여러 수동 단계를 포함해요.
- 실시간 객체를 로컬 객체 구성 파일로 내보내기:
kubectl get <kind>/<name> -o yaml > <kind>_<name>.yaml - 객체 구성 파일에서 status 필드를 수동으로 제거하세요.
- 이후 객체 관리를 위해서는 replace만 사용하세요.
kubectl replace -f <kind>_<name>.yaml
컨트롤러 셀렉터와 PodTemplate 라벨 정의하기
경고:
권장되는 접근 방식은 컨트롤러 셀렉터에서만 사용하고 다른 의미적 의미는 없는 단일이고 불변인 PodTemplate 라벨을 정의하는 것이에요.
예시 라벨:
selector:
matchLabels:
controller-selector: "apps/v1/deployment/nginx"
template:
metadata:
labels:
controller-selector: "apps/v1/deployment/nginx"