1. kubectl 개요
Kubectl은 쿠버네티스 클러스터를 제어하기 위한 커맨드 라인 도구이다.
kubectl 은 config 파일을 $HOME/.kube 에서 찾을 수 있다.
KUBECONFIG 환경 변수를 설정하거나 --kubeconfig
플래그를 설정하여 다른 kubeconfig 파일을 지정할 수 있다.
* 참고: 클러스터에 대한 접근을 구성하는 데 사용되는 파일을 kubeconfig 파일 이라 한다. kubeconfig 파일들을 사용하여 클러스터, 사용자, 네임스페이스 및 인증 메커니즘에 대한 정보를 관리할 수 있다.
2. kubectl 구문
kubectl 명령어의 형태는 기본적으로 다음과 같다.
kubectl [command] [TYPE] [NAME] [flags]
• command: 하나 이상의 리소스에서 수행하려는 동작을 지정한다.
ex1) create: 생성
ex2) get: 정보 확인
ex3) describe: 자세한 상태 정보
ex4) delete: 삭제
• TYPE: 리소스 타입(pod, service)을 지정한다. 리소스 타입은 대소문자를 구분하지 않으며 단수형, 복수형 또는 약어 형식을 지정할 수 있다. 예를 들어, 다음의 명령은 동일한 출력 결과를 생성한다.
kubectl get pod pod1
kubectl get pods pod1
kubectl get po pod1
• NAME: 리소스 이름을 지정한다. 이름은 대소문자를 구분한다. 이름을 생략하면, 모든 리소스에 대한 세부 사항이 표시된다.
ex) kubectl get pods
여러 리소스에 대한 작업을 수행할 때, 타입 및 이름별로 각 리소스를 지정하거나 하나 이상의 파일을 지정할 수 있다.
• 타입 및 이름으로 리소스를 지정하려면 다음을 참고한다.
1) 리소스가 모두 동일한 타입인 경우 리소스를 그룹화하려면 다음을 사용한다.
TYPE1 name1 name2 name<#>
ex) kubectl get pod example-pod1 example-pod2
2) 여러 리소스 타입을 개별적으로 지정하려면 다음을 사용한다.
TYPE1/name1 TYPE1/name2 TYPE2/name3 TYPE<#>/name<#>
ex) kubectl get pod/example-pod1 replicationcontroller/example-rc1
• 하나 이상의 파일로 리소스를 지정하려면 다음을 사용한다: -f file1 -f file2 -f file<#>
- YAML이 특히 구성 파일에 대해 더 사용자 친화적이므로, JSON 대신 YAML을 사용한다.
ex) kubectl get -f ./pod.yaml
• flags: 선택적 플래그를 지정한다. 예를 들어, -s 또는 --server 플래그를 사용하여 쿠버네티스 API 서버의 주소와 포트를 지정할 수 있다.
3. Kubectl 명령어 정리
명령어 | 구문 | 설명 |
alpha | kubectl alpha SUBCOMMAND [flags] | 쿠버네티스 클러스터에서 기본적으로 활성화되어 있지 않은 알파 기능의 사용할 수 있는 명령을 나열한다. |
annotate | kubectl annotate (-f FILENAME | TYPE NAME | TYPE/NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--overwrite] [--all] [--resource-version=version] [flags] | 하나 이상의 리소스 어노테이션을 추가하거나 업데이트한다. |
api-resources | kubectl api-resources [flags] | 사용 가능한 API 리소스를 나열한다. |
api-versions | kubectl api-versions [flags] | 사용 가능한 API 버전을 나열한다. |
apply | kubectl apply -f FILENAME [flags] | 파일이나 표준입력(stdin)으로부터 리소스에 구성 변경 사항을 적용한다. FILENAME에 yaml 파일을 작성하여 리소스를 생성한다. |
attach | kubectl attach POD -c CONTAINER [-i] [-t] [flags] | 실행 중인 컨테이너에 연결하여 출력 스트림을 보거나 표준입력을 통해 컨테이너와 상호 작용한다. |
auth | kubectl auth [flags] [options] | 승인을 검사한다. |
autoscale | kubectl autoscale (-f FILENAME | TYPE NAME | TYPE/NAME) [--min=MINPODS] --max=MAXPODS [--cpu-percent=CPU] [flags] | Replication Controller에서 관리하는 Pod 집합을 자동으로 조정한다. |
certificate | kubectl certificate SUBCOMMAND [options] | 인증서 리소스를 수정한다. |
cluster-info | kubectl cluster-info [flags] | 클러스터의 마스터와 서비스에 대한 엔드포인트 정보를 표시한다. |
completion | kubectl completion SHELL [options] | 지정된 셸(bash 또는 zsh)에 대한 셸 완성 코드를 출력한다. |
config | kubectl config SUBCOMMAND [flags] | kubeconfig 파일을 수정한다. 세부 사항은 개별 하위 명령을 참고한다. |
convert | kubectl convert -f FILENAME [options] | 다른 API 버전 간에 구성 파일을 변환한다. YAML 및 JSON 형식이 모두 허용된다. 참고 - kubectl-convert 플러그인을 설치해야 한다. |
cordon | kubectl cordon NODE [options] | 노드를 스케줄 불가능(unschedulable)으로 표시한다. |
cp | kubectl cp <file-spec-src> <file-spec-dest> [options] | 컨테이너에서 그리고 컨테이너로 파일 및 디렉터리를 복사한다. |
create | kubectl create -f FILENAME [flags] | 파일이나 표준입력에서 하나 이상의 리소스를 생성한다. |
delete | kubectl delete (-f FILENAME | TYPE [NAME | /NAME | -l label | --all]) [flags] | 파일, 표준입력 또는 레이블 셀렉터, 이름, 리소스 셀렉터 또는 리소스를 지정하여 리소스를 삭제한다. ex) kubectl delete -f nginx-pod.yml |
describe | kubectl describe (-f FILENAME | TYPE [NAME_PREFIX | /NAME | -l label]) [flags] | 하나 이상의 리소스의 자세한 상태를 표시한다. ex) kubectl describe pods [pod name] -n [namespace] |
diff | kubectl diff -f FILENAME [flags] | 라이브 구성에 대해 파일이나 표준입력의 차이점을 출력한다. |
drain | kubectl drain NODE [options] | 유지 보수를 준비 중인 노드를 드레인한다. |
edit | kubectl edit (-f FILENAME | TYPE NAME | TYPE/NAME) [flags] | 기본 편집기를 사용하여 서버에서 하나 이상의 리소스 정의를 편집하고 업데이트한다. ex) kubectl edit [pods/svc/deploy] [pod name] -n [namespace] |
exec | kubectl exec POD [-c CONTAINER] [-i] [-t] [flags] [-- COMMAND [args...]] | Pod에 직접 접근하여 Pod의 컨테이너에 대해 명령을 실행한다. ex) kubectl exec -it my-nginx-pod bash |
explain | kubectl explain [--recursive=false] [flags] | Pod, Node, Service 등의 다양한 리소스에 대한 문서를 출력한다. |
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] | Replication Controller, Service 또는 Pod를 새로운 쿠버네티스 서비스로 노출한다. |
get | kubectl get (-f FILENAME | TYPE [NAME | /NAME | -l label]) [--watch] [--sort-by=FIELD] [[-o | --output]=OUTPUT_FORMAT] [flags] | 하나 이상의 리소스를 나열한다. -o wide를 추가하면 더 많은 정보를 얻을 수 있다. |
kustomize | kubectl kustomize <dir> [flags] [options] | kustomization.yaml 파일의 지시 사항에서 생성된 API 리소스 집합을 나열한다. 인수는 파일을 포함하는 디렉터리의 경로이거나, 리포지터리 루트와 관련하여 경로 접미사가 동일한 git 리포지터리 URL이어야 한다. |
label | kubectl label (-f FILENAME | TYPE NAME | TYPE/NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--overwrite] [--all] [--resource-version=version] [flags] | 하나 이상의 리소스 레이블을 추가하거나 업데이트한다. |
logs | kubectl logs POD [-c CONTAINER] [--follow] [flags] | Pod의 컨테이너에 대한 로그를 출력한다. ex) kubectl logs my-nginx-pod |
options | kubectl options | 모든 명령에 적용되는 전역 커맨드 라인 옵션을 나열한다. |
patch | kubectl patch (-f FILENAME | TYPE NAME | TYPE/NAME) --patch PATCH [flags] | 전략적 병합 패치 프로세스를 사용하여 리소스의 하나 이상의 필드를 업데이트한다. |
plugin | kubectl plugin [flags] [options] | 플러그인과 상호 작용하기 위한 유틸리티를 제공한다. |
port-forward | kubectl port-forward POD [LOCAL_PORT:]REMOTE_PORT [...[LOCAL_PORT_N:]REMOTE_PORT_N] [flags] | 하나 이상의 로컬 포트를 Pod로 전달한다. |
proxy | kubectl proxy [--port=PORT] [--www=static-dir] [--www-prefix=prefix] [--api-prefix=prefix] [flags] | 쿠버네티스 API 서버에 프록시를 실행한다. |
replace | kubectl replace -f FILENAME | 파일 또는 표준입력에서 리소스를 교체한다. |
rollout | kubectl rollout SUBCOMMAND [options] | 리소스의 롤아웃을 관리한다. 유효한 리소스 타입에는 디플로이먼트(deployment), 데몬셋(daemonset)과 스테이트풀셋(statefulset)이 포함된다. |
run | kubectl run NAME --image=image [--env="key=value"] [--port=port] [--dry-run=server|client|none] [--overrides=inline-json] [flags] | 클러스터에 지정된 이미지를 가지고 pod를 생성한다. * kubernetes v1.18 이상은 run 명령어가 Pod을 만들지만 v1.17 이하는 Deployment를 만든다! |
scale | kubectl scale (-f FILENAME | TYPE NAME | TYPE/NAME) --replicas=COUNT [--resource-version=version] [--current-replicas=count] [flags] | 지정된 Replication Controller의 크기를 업데이트한다. |
set | kubectl set SUBCOMMAND [options] | 애플리케이션 리소스를 구성한다. |
taint | kubectl taint NODE NAME KEY_1=VAL_1:TAINT_EFFECT_1 ... KEY_N=VAL_N:TAINT_EFFECT_N [options] | 하나 이상의 노드에서 테인트(taint)를 업데이트한다. |
top | kubectl top [flags] [options] | 리소스(CPU/메모리/스토리지) 사용량을 표시한다. |
uncordon | kubectl uncordon NODE [options] | 노드를 스케줄 가능(schedulable)으로 표시한다. |
version | kubectl version [--client] [flags] | 클라이언트와 서버에서 실행 중인 쿠버네티스 버전을 표시한다. |
wait | kubectl wait ([-f FILENAME] | resource.group/resource.name | resource.group [(-l label | --all)]) [--for=delete|--for condition=available] [options] | 실험(experimental) 기능: 하나 이상의 리소스에서 특정 조건을 기다린다. |
더 자세한 설명은 아래 링크에서 참고:
https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands
4. Output 옵션
kubectl으로부터 얻은 정보를 출력하거나, 파일 형태의 output으로 저장할 수 있다.
kubectl [command] [TYPE] [NAME] -o <output_format>
kubectl 명령에 따라, 다음과 같은 출력 형식이 지원된다.
출력 형식 | 설명 |
-o custom-columns=<spec> | 쉼표로 구분된 사용자 정의 목록을 사용하여 테이블을 출력 |
-o custom-columns-file=<filename> | 쉼표로 구분된 사용자 정의 목록을 사용하여 테이블을 <filename> 파일로 저장 |
-o json | JSON 형식의 API object로 저장 |
-o jsonpath=<template> | jsonpath 표현식에 정의된 필드를 출력 |
-o jsonpath-file=<filename> | jsonpath 표현식에 정의된 필드를 <filename> 파일로 저장 |
-o name | 리소스 이름만 출력 |
-o wide | 추가 정보가 포함된 일반 텍스트 형식으로 출력. pod의 경우, node 이름이 포함된다. |
-o yaml | YAML 형식의 API 오브젝트를 출력 |
ex1) 다음 명령은 단일 파드에 대한 세부 정보를 YAML 형식의 오브젝트로 출력한다.
kubectl get pod web-pod-13je7 -o yaml
ex2) 사용자 정의 목록을 사용하여 원하는 세부 정보만 테이블에 출력한다.
kubectl get pods <pod-name> -o custom-columns=NAME:.metadata.name,RSRC:.metadata.resourceVersion
Kubectl 명령어 예시
kubectl apply
# example-service.yaml에 정의한 내용을 기반으로 서비스를 생성
kubectl apply -f example-service.yaml
# example-service.yaml에 정의한 내용을 기반으로 replication controller를 생성
kubectl apply -f example-controller.yaml
# <directory> 디렉터리 내의 .yaml, .yml 또는 .json 파일에 정의된 내용을 기반으로 객체 생성
kubectl apply -f <directory>
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 create와 kubectl apply 명령어 차이
command | object가 존재하지 않을 경우 | object가 이미 존재할 경우 |
create | 새로운 object가 생성 | ERROR |
apply | 새로운 object가 생성 | object를 구성 (부분적인 spec을 받아들인다.) |
replace | ERROR | obejct가 삭제된 뒤 새롭게 생성 |
참고: https://kubernetes.io/ko/docs/reference/kubectl/overview/
'Kubernetes' 카테고리의 다른 글
Helm 사용법과 명령어 정리 - Repository 조회, Helm Chart 만들기 (0) | 2022.04.22 |
---|---|
Kubernetes 이론과 설치 방법 알아보기 (0) | 2022.04.05 |