명령형(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 명령에 사용할 수 있는 플래그가 없는 객체 필드도 있어요. 그런 경우 setcreate를 조합해 객체 생성 전에 필드 값을 지정할 수 있어요. 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 명령은 객체를 생성하기 전에 구성 파일을 편집을 위해 열어요.

다음 단계

더 알아보기 (Learn more)