본문 바로가기

DevOps/쿠버네티스

쿠버네티스 kubectl 설명 및 예제 모음

 

kubectl은 쿠버네티스 클러스터에 명령을 내리는 CLI(command line interface)입니다.

 

 

 

kubectl 문법

terminal window에서 아래와 같은 명령어로 kubectl을 동작 가능합니다.

 

kubectl [COMMAND] [TYPE] [NAME] [FLAGS]

COMMAND : create, get, describe와 같이 하나 혹은 여러개의 리소스에 대한 operation 종류를 선언합니다.

 

- TYPE : resource type(설명 바로가기)에 대해 선언합니다. 리소스 타입은 case-sensitive하고 아래와 같이 선언 가능합니다.

$ kubectl get pod pod1
$ kubectl get pods pod1
$ kubectl get po pod1

- NAME : 특정 리소스의 이름을 선언합니다. 이름은 case-sensitive합니다. 만약 모든 리소스에 대한 내용을 보고싶다면 아래와 같이 선언합니다.

$ kubectl get pods

 

만약 여러 리소스들에 대해 한번에 명령을 내리고 싶다면 아래와 같이 선언하면 됩니다.

 

(1) 똑같은 operation을 여러 같은 type의 리소스에 명령할 경우 : TYPE1 name1 name2 ...

$ kubectl get pod example-pod1 example-pod

 

(2) 똑같은 operation을 각기 다른 type의 리소스에 명령할 경우 : TYPE1/name1 TYPE1/name2 TYPE2/name3 ...

$ kubectl get pod/example-pod1 replicationcontroller/example-rc1

 

(3) 똑같은 operation을 여러 다른 file의 리소스에 명령할 경우 : -f file1 -f file2 ...

$ kubectl get pod -f ./pod.yaml

 

FLAGS : 추가적인 option을 선언합니다. 

 

 

 

명령어[COMMAND] 종류

kubectl의 명령어 종류와 문법을 간략히 설명합니다.

추가적으로 더 자세한 내용은 kubectl 레퍼런스(바로가기)를 살펴보세요.

명령어

문법 설명
annotate kubectl annotate (-f FILENAME \| TYPE NAME \| TYPE/NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--overwrite] [--all] [--resource-version=version] [flags]

하나 혹은 여러 리소스에 주석을 추가/업데이트

api-versions kubectl api-versions [flags]

사용가능한 API version 조회

apply kubectl apply -f FILENAME [flags]

변경된 리소스 수정 적용하기

attach kubectl attach POD -c CONTAINER [-i] [-t] [flags]

현재 실행중인 컨테이너에 접속 혹은 output stream 확인

autoscale kubectl autoscale (-f FILENAME \| TYPE NAME \| TYPE/NAME) [--min=MINPODS] --max=MAXPODS [--cpu-percent=CPU] [flags]

RC(replication controller)을 활용하여 pod auto scale 기능 활성화

cluster-info kubectl cluster-info [flags]

쿠버네티스 클러스터에 정보조회

config kubectl config SUBCOMMAND [flags]

kubeconfig 파일 수정

create kubectl create -f FILENAME [flags]

리소스 file 생성

delete kubectl delete (-f FILENAME \| TYPE [NAME \| /NAME \| -l label \| --all]) [flags]

생성(활성화된) 리소스 제거

describe kubectl describe (-f FILENAME \| TYPE [NAME_PREFIX \| /NAME \| -l label]) [flags] 리소스 상태 조회
edit kubectl edit (-f FILENAME \| TYPE NAME \| TYPE/NAME) [flags]

리소스에 대해 수정 및 적용

exec kubectl exec POD [-c CONTAINER] [-i] [-t] [flags] [-- COMMAND [args...]] pod 내부의 컨테이너에 명령어 날리기
explain kubectl explain [--include-extended-apis=true] [--recursive=false] [flags]

리소스(pod, node, service) 에 대한 documentation 확인

expose kubectl expose (-f FILENAME \| TYPE NAME \| TYPE/NAME) [--port=port] [--protocol=TCP\|UDP] [--target-port=number-or-name] [--name=name] [----external-ip=external-ip-of-service] [--type=type] [flags]

rc, service, pod 조회(?)

get kubectl get (-f FILENAME \| TYPE [NAME \| /NAME \| -l label]) [--watch] [--sort-by=FIELD] [[-o \| --output]=OUTPUT_FORMAT] [flags]

리소스 리스트 조회

label kubectl label (-f FILENAME \| TYPE NAME \| TYPE/NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--overwrite] [--all] [--resource-version=version] [flags]

리소스 label 업데이트 혹은 추가기능

logs kubectl logs POD [-c CONTAINER] [--follow] [flags]

pod 내부 container 로그확인

patch kubectl patch (-f FILENAME \| TYPE NAME \| TYPE/NAME) --patch PATCH [flags]

리소스의 일부 attribute를 수정, 적용

port-forward kubectl port-forward POD [LOCAL_PORT:]REMOTE_PORT [...[LOCAL_PORT_N:]REMOTE_PORT_N] [flags]

포트포워딩 기능

proxy kubectl proxy [--port=PORT] [--www=static-dir] [--www-prefix=prefix] [--api-prefix=prefix] [flags]

쿠버네티스에 프록시 설정

replace kubectl replace -f FILENAME 리소스 재구성(새로 적용)
rolling-update kubectl rolling-update OLD_CONTROLLER_NAME ([NEW_CONTROLLER_NAME] --image=NEW_CONTAINER_IMAGE \| -f NEW_CONTROLLER_SPEC) [flags]

롤링 업데이트 수행 기능

run kubectl run NAME --image=image [--env="key=value"] [--port=port] [--replicas=replicas] [--dry-run=bool] [--overrides=inline-json] [flags]

클러스터에 특정 이미지 run

scale kubectl scale (-f FILENAME \| TYPE NAME \| TYPE/NAME) --replicas=COUNT [--resource-version=version] [--current-replicas=count] [flags]

RC의 replication 갯수 업데이트

stop kubectl stop

더 이상 사용하지 않음

kubectl delete 사용!.
version kubectl version [--client] [flags] 쿠버네티스 버젼 확인

 

리소스[RESOURCE] 종류

kubectl에 적용 가능한 쿠버네티스 리소스 종류와 단축어 리스트 입니다.

리소스 종류 단축어
apiservices  
certificatesigningrequests csr
clusters  
clusterrolebindings  
clusterroles  
componentstatuses cs
configmaps cm
controllerrevisions  
cronjobs  
customresourcedefinition crd
daemonsets ds
deployments deploy
endpoints ep
events ev
horizontalpodautoscalers hpa
ingresses ing
jobs  
limitranges limits
namespaces ns
networkpolicies netpol
nodes no
persistentvolumeclaims pvc
persistentvolumes pv
poddisruptionbudget pdb
podpreset  
pods po
podsecuritypolicies psp
podtemplates  
replicasets rs
replicationcontrollers rc
resourcequotas quota
rolebindings  
roles  
secrets  
serviceaccounts sa
services svc
statefulsets  
storageclasses  

 

 

Output 옵션

kubectl으로 얻은 여러 정보들을 file로 저장하기를 원할 수 있다. 이때 아래와 같은 옵션으로 추출 가능합니다.

 

kubectl [command] [TYPE] [NAME] -o=<output_format>

output_format으로 아래와 같은 format들을 지원.

Output 포맷

설명
-o=custom-columns=<spec>

comma로 구분가능한 custom형식의 table을 조회

-o=custom-columns-file=<filename> comma로 구분가능한 custom형식의 table을 file로 저장
-o=json

json 형식의 API obejct로 저장

-o=jsonpath=<template>

jsonpath 형식으로 조회

-o=jsonpath-file=<filename>

jsonpath 형식으로 file로 저장

-o=name 리소스 이름만 조회
-o=wide

pod, node 이름 등 추가적인 정보 모두 조회

-o=yaml

yaml 형식의 API object로 저장

output 옵션 예제

$ kubectl get pod web-pod-13je7 -o=yaml

 

 

kubectl 예제

kubectl create

// example-service.yaml 파일이름의 서비스를 생성합니다.
$ kubectl create -f example-service.yaml

// example-controller.yaml 파일이름의 RC를 생성합니다.
$ kubectl create -f example-controller.yaml

 

kubectl get

// pod list를 출력
$ kubectl get pods

// pod list(+ 추가적인 정보 node 이름 등)를 출력
$ kubectl get pods -o wide

// 특정 <rc-name>의 정보를 출력
$ kubectl get replicationcontroller <rc-name>

// 모든 rc, service들 정보를 출력
$ kubectl get rc,services

// 모든 ds(daemon sets)에 대한 정보를 출력(uninitialized ds도 포함)
$ kubectl get ds --include-uninitialized

// 특정 node(server01)에 배포된 pod 정보를 출력
$ kubectl get pods --field-selector=spec.nodeName=server01

 

kubectl describe

// 특정 <node-name>의 node 정보 출력
$ kubectl describe nodes <node-name>

// 특정 <pod-name>의 pod 정보 출력
$ kubectl describe pods/<pod-name>

// 특정 <rc-name>의 rc가 제어하는 pod들 정보 출력
$ kubectl describe pods <rc-name>

// 모든 pod 정보 출력(uninitialized pod은 제외)
$ kubectl describe pods --include-uninitialized=false

 

kubectl delete

// pod.yaml로 선언된 pod들을 제거
$ kubectl delete -f pod.yaml

// 특정 <label-name>이 정의된 pod, service들 제거
$ kubectl delete pods,services -l name=<label-name>

// 특정 <label-name>이 정의된 pod, service들 제거(uninitialized pod, service 포함)
$ kubectl delete pods,services -l name=<label-name> --include-uninitialized

// 모든 pod 
$ kubectl delete pods --all

 

 

kubectl exec

// 특정 <pod-name>을 가진 pod의 첫번째 container에 'date' 라는 명령어 호출
$ kubectl exec <pod-name> date

// 특정 <pod-name>을 가진 pod의 특정 <container-name>이라는 이름의 container에 'date' 라는 명령어 호출
$ kubectl exec <pod-name> -c <container-name> date

// 특정 <pod-name>을 가진 pod의 첫번째 container에 bash shell실행 
$ kubectl exec -ti <pod-name> /bin/bash

 

 

kubectl logs

// 특정 <pod-name> 이름을 가진 pod의 로그 조회
$ kubectl logs <pod-name>

// 특정 <pod-name> 이름을 가진 pod의 로그 tail -f 조회
$ kubectl logs -f <pod-name>
 

 

출처 : 쿠버네티스 kubectl overview - https://kubernetes.io/docs/reference/kubectl/overview/