명령형(Imperative) 명령으로 Kubernetes 객체 관리하기
명령형(Imperative) 명령으로 Kubernetes 객체 관리하기
Kubernetes 객체는 kubectl 명령줄 도구에 내장된 명령형(imperative) 명령을 직접 사용해 빠르게 생성·업데이트·삭제할 수 있어요. 이 문서는 그런 명령들이 어떻게 구성되어 있는지, 그리고 어떻게 활용해 실행 중인 객체를 관리하는지 설명해요.
출처: 문서
본문
시작하기 전에
kubectl을 설치해요. Kubernetes 클러스터가 있어야 하고, kubectl 명령줄 도구가 클러스터와 통신하도록 구성되어 있어야 해요. 이 튜토리얼은 컨트롤 플레인 호스트가 아닌 노드가 최소 두 개 있는 클러스터에서 실행하는 것을 권장해요. 아직 클러스터가 없다면 minikube를 이용해 만들거나, 아래 Kubernetes 플레이그라운드 중 하나를 사용할 수 있어요.
버전을 확인하려면 kubectl version을 입력해요.
트레이드오프 (Trade-offs)
kubectl 도구는 세 가지 종류의 객체 관리를 지원해요.
- 명령형 명령 (Imperative commands)
- 명령형 객체 구성 (Imperative object configuration)
- 선언형 객체 구성 (Declarative object configuration)
각 객체 관리 방식의 장단점은 Kubernetes 객체 관리 문서에서 확인할 수 있어요.
객체 생성하기
kubectl 도구는 가장 흔한 객체 유형 중 일부를 생성하는 동사 기반(verb-driven) 명령을 지원해요. 명령 이름은 Kubernetes 객체 유형에 익숙하지 않은 사용자도 알아볼 수 있게 지어졌어요.
run— 컨테이너를 실행할 새 파드 생성expose— 파드 간 트래픽을 로드밸런싱할 새 서비스 객체 생성autoscale— Deployment 같은 컨트롤러를 자동으로 수평 확장할 새 Autoscaler 객체 생성
kubectl 도구는 객체 유형 기반 생성 명령도 지원해요. 이 명령들은 더 많은 객체 유형을 지원하고 의도를 더 명확히 드러내지만, 사용자가 만들려는 객체의 유형을 알고 있어야 해요.
create <objecttype> [<subtype>] <instancename>
일부 객체 유형은 create 명령에서 지정할 수 있는 하위 유형(subtype)이 있어요. 예를 들어 Service 객체에는 ClusterIP, LoadBalancer, NodePort 등 여러 하위 유형이 있어요. NodePort 하위 유형으로 서비스를 만드는 예시:
kubectl create service nodeport <myservicename>
위 예시에서 create service nodeport 명령은 create service 명령의 하위 명령(subcommand)이라고 불러요.
-h 플래그를 사용해 하위 명령이 지원하는 인자와 플래그를 확인할 수 있어요:
kubectl create service nodeport -h
객체 업데이트하기
kubectl 명령은 일반적인 업데이트 작업을 위한 동사 기반 명령을 지원해요. Kubernetes 객체에 익숙하지 않은 사용자도 특정 필드를 직접 알지 않아도 업데이트를 수행할 수 있게 지어졌어요.
scale— 컨트롤러의 replica 수를 업데이트해 파드를 추가/제거하는 수평 확장annotate— 객체에서 어노테이션 추가/제거label— 객체에서 라벨 추가/제거
kubectl 명령은 객체의 특정 측면(aspect) 기반 업데이트 명령도 지원해요. 이 측면을 설정하면 객체 유형에 따라 다른 필드가 설정될 수 있어요.
set <field>— 객체의 특정 측면 설정
kubectl 도구는 실행 중인 객체를 직접 업데이트하는 추가 방법도 지원하지만, Kubernetes 객체 스키마에 대한 더 나은 이해가 필요해요.
edit— 편집기에서 구성을 열어 실행 중인 객체의 원시 구성을 직접 편집patch— 패치 문자열을 사용해 실행 중인 객체의 특정 필드를 직접 수정. 패치 문자열에 대한 자세한 내용은 API 관례의 patch 섹션 참고
객체 삭제하기
delete 명령을 사용해 클러스터에서 객체를 삭제할 수 있어요.
delete <type>/<name>
kubectl delete deployment/nginx
객체 조회하기
객체에 대한 정보를 출력하는 명령은 여러 가지가 있어요.
get— 일치하는 객체의 기본 정보 출력.get -h로 옵션 목록 확인describe— 일치하는 객체의 상세 정보를 종합해 출력logs— 파드에서 실행 중인 컨테이너의 stdout과 stderr 출력
생성 전에 set 명령으로 객체 수정하기
create 명령에 사용할 수 있는 플래그가 없는 객체 필드도 있어요. 그런 경우 set과 create를 조합해 객체 생성 전에 필드 값을 지정할 수 있어요. create 명령의 출력을 set 명령으로 파이프하고, 다시 create 명령으로 돌려보내는 방식이에요. 예시:
kubectl create service clusterip my-svc --clusterip="None" -o yaml --dry-run=client | kubectl set selector --local -f - 'environment=qa' -o yaml | kubectl create -f -
kubectl create service -o yaml --dry-run=client명령은 Service의 구성을 만들지만, Kubernetes API 서버로 보내지 않고 YAML로 stdout에 출력해요.kubectl set selector --local -f - -o yaml명령은 stdin에서 구성을 읽고, 업데이트된 구성을 stdout에 YAML로 써요.kubectl create -f -명령은 stdin으로 제공된 구성을 사용해 객체를 생성해요.
--edit으로 생성 전에 객체 수정하기
kubectl create --edit을 사용해 객체가 생성되기 전에 임의의 변경을 가할 수 있어요. 예시:
kubectl create service clusterip my-svc --clusterip="None" -o yaml --dry-run=client > /tmp/srv.yaml
kubectl create --edit -f /tmp/srv.yaml
kubectl create service명령은 Service의 구성을 만들어/tmp/srv.yaml에 저장해요.kubectl create --edit명령은 객체를 생성하기 전에 구성 파일을 편집을 위해 열어요.