kubectl [명령어] [오브젝트] [이름] [옵션]$ mkdir workspace && cd $_
$ kubectl get node
kubectl run : 포드에서 특정 이미지 생성 및 실행$ kubectl run NAME --image=image [--env="key=value"] [--port=port] [--dry-run=server|client] [--overrides=inline-json] [--command] -- [COMMAND] [args...]| Name | Shorthand | Default | Usage |
|---|---|---|---|
| image | 실행할 컨테이너의 이미지입니다. |
# "Pod" 안에 "nginx" 이미지를 이용한 컨테이너를 만듬.
$ kubectl run nginx-pod --image=nginx # pending > ContainerCreating > Running
# get
# https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#get
# ps 출력 형식으로 모든 포드 나열
$ kubectl get pod
# 모든 서비스를 ps 출력 형식으로 함께 나열
$ kubectl get service

kubectl expose : 리소스를 새 Kubernetes 서비스로 노출$ kubectl expose (-f FILENAME | TYPE NAME) [--port=port] [--protocol=TCP|UDP|SCTP] [--target-port=number-or-name] [--name=name] [--external-ip=external-ip-of-service] [--type=type]| Name | Shorthand | Default | Usage |
|---|---|---|---|
| name | 새로 생성된 object의 이름입니다. | ||
| port | 서비스가 제공되어야 하는 포트입니다. 지정되지 않은 경우 노출되는 리소스에서 복사됨 | ||
| type | 이 서비스에 대해 ClusterIP, NodePort, LoadBalancer 또는 ExternalName을 입력합니다. 기본값은 'ClusterIP' | ||
| external-ip | 서비스에 대해 수락할 추가 외부 IP 주소(Kubernetes에서 관리하지 않음). 이 IP가 노드로 라우팅되면 생성된 서비스 IP 외에도 "추가 외부 주소 IP" 에서 서비스에 액세스 가능 |
# "ClusterIP" 유형은 내부에서 "nginx-pod" 파드로 접속
# 클러스터 안에서만 이용되는 클러스터 아이피 제공
$ kubectl expose pod nginx-pod --name clusterip --type=ClusterIP --port 80
$ kubectl get service
$ curl 10.110.73.199

# "NodePort, LoadBalancer" 유형은 외부에서 접속하는 경우
# 포트 번호를 정할수도 있지만 접속 가능한 랜덤 포트 제공
# Node 의 IP에 포트번호를 이용하여 접속 가능
$ kubectl expose pod nginx-pod --name nodeport --type=NodePort --port 80


# 외부 IP 로 접속 하면 내부의 클러스터 IP로 라우팅 된다.
$ kubectl expose pod nginx-pod --name loadbalancer --type=LoadBalancer --external-ip 192.168.0.29 --port 80





kubectl describe : 특정 리소스 또는 리소스 그룹의 세부 정보를 표시$ kubectl describe (-f FILENAME | TYPE [NAME_PREFIX | -l label] | TYPE/NAME)$ kubectl describe pod nginx-pod
# "clusterip" 라는 서비스를 자세히 표시
$ kubectl describe service clusterip
$ kubectl describe service nodeport

Namespace : 리소스 그룹, 기본값(default)
Labels : 연결/연동에 사용 (태그와 유사), 라벨을 정하지 않으면 이미지이름을 알아서 정함
IP : 컨테이너 IP
Events : 로그 역할

Selector : Labels 에 해당되는 Pod 에 연결시켜준다.
TargetPort :
Endpoints : 도커의 엔드포인트
kubectl exec : 컨테이너에서 명령을 실행$ kubectl exec (POD | TYPE/NAME) [-c CONTAINER] [flags] -- COMMAND [args...]| Name | Shorthand | Default | Usage |
|---|---|---|---|
| stdin | i | false | Pass stdin to the container |
| tty | t | false | Stdin is a TTY |
$ kubectl exec -it nginx-pod -- bash
# `-c` string : , `-c` 옵션이 있으면 문자열에서 명령을 읽습니다.
# kubectl exec -it nginx-pod -- bash -C 'echo "web01" > /usr/share/nginx/html/index.html'
# "pod" 가 하나인 경우 손쉽게 바꿔보기
$ echo "<h1>web01</h1>" > /usr/share/nginx/html/index.html
kubectl cp : 파일과 디렉터리를 컨테이너 간에 복사$ kubectl cp <file-spec-src> <file-spec-dest>$ mkdir html
$ tar xvf ./gcp.tar -C html/
# "html" 디렉터리 쨰로 컨테이너에 복사
$ kubectl cp html nginx-pod:/usr/share/nginx


kubectl get : 하나 이상의 리소스(;오브젝트)를 표시$ kubectl get [(-o|--output=)json|yaml|name|go-template|go-template-file|template|templatefile|jsonpath|jsonpath-as-json|jsonpath-file|custom-columns|custom-columns-file|wide] (TYPE[.VERSION][.GROUP] [NAME | -l label] | TYPE[.VERSION][.GROUP]/NAME ...) [flags]| Name | Shorthand | Default | Usage |
|---|---|---|---|
| output | o | json/yaml/name/go-template/go-template-file/template/templatefile/jsonpath/jsonpath-as-json/jsonpath-file/custom-columns-file/custom-columns/wide | |
| show-labels | false | 마지막 열에 모든 라벨을 표시, 기본값: 출력하지 않음. |
# 생성한 거의 모든 오브젝트 표시
$ kubectl get all
# "`-o` wide" => 넒게 보여주세요
$ kubectl get nodes -o wide
# "--show-labels" 라벨 출력
$ kubectl get pod -o wide --show-labels
# 헤더(열 이름) 표시 X
$ kubectl get nodes -o wide no-headers
# 출력 결과 중에서 "6열"에 해당되는 부분만 출력
$ kubectl get nodes -o wide --no-headers | awk '{print $6}'

kubectl delete : 리소스 삭제$ kubectl delete ([-f FILENAME] | [-k DIRECTORY] | TYPE [(NAME | -l label | --all)])# "svc" - service 의 준말
# 모든 서비스를 지우겠다.
$ kubectl delete svc --all
# "kubernetes" 삭제되서는 안되는 서비스는 지워지면 다시 생성된다.
$ kubectl get svc
# "nginx-pod" 제거
$ kubectl delete pod nginx-pod
# pod 와 service 모두 제거
$ kubectl delete pod,svc --all
# <pod> 파드를 `--grace-period=0` 지연 시간 0으로 `--force` 강제로 지움
$ kubectl delete pods <pod> --grace-period=0 --force pod

kubectl options$ kubectl options

kubectl api-resources : 서버에서 지원되는 API 리소스를 출력KIND : yaml 작성할때 리소스의 종류를 표현할 때 이용
kubectl create deployment : 특정한 이름으로 배포 리소스(오브젝트) 생성deploymentreplicasets : deployment 가 나오기 전에의 사용, 복제와 관련된 부분deployment : 두개이상의 파드를 운영하기 적합| Name | Shorthand | Default | Usage |
|---|---|---|---|
| replicas | r | 1 | 생성할 복제본 수 |
| image | [] | 실행할 이미지 이름 |
# "nginx-app" 이라고 하는 배포를 `nginx` 이미지로 2개의 복제본을 가지고 생성
$ kubectl create deployment nginx-app --replicas=2 --image=nginx
# 배포 정보 확인
$ kubectl get deployments.apps
$ kubectl get deployments.apps -o wide
# 복제 관련 정보 확인, 목표치(DESIRED) 와 현재 상태 등을 확인 가능
$ kubectl get replicasets.apps
$ kubectl get replicasets.apps -o wide
$ kubectl expose deployment nginx-app --name clusterip-app --type ClusterIP --port 80
$ kubectl expose deployment nginx-app --name nodeport-app --type=NodePort --port 80
$ kubectl expose deployment nginx-app --name loadbalancer-app --type=LoadBalancer --external-ip 192.168.2.46 --port 80
$ kubectl get service
deployments.apps 조회
replicasets.apps 조회

kubectl scale$ kubectl scale [--resource-version=version] [--current-replicas=count] --replicas=COUNT (-f FILENAME | TYPE NAME)$ kubectl scale deployment nginx-app --replicas=4
$ kubectl get pods
----------------------------------------
NAME READY STATUS RESTARTS AGE
nginx-app-d6ff45774-4vdjm 1/1 Running 0 138m
nginx-app-d6ff45774-lpg5c 1/1 Running 0 138m
nginx-app-d6ff45774-rs865 0/1 ContainerCreating 0 6s
nginx-app-d6ff45774-znhw5 1/1 Running 0 6s
----------------------------------------
$ kubectl scale deployment nginx-app --replicas=2
$ kubectl get pods
----------------------------------------
NAME READY STATUS RESTARTS AGE
nginx-app-d6ff45774-4vdjm 1/1 Running 0 140m
nginx-app-d6ff45774-lpg5c 1/1 Running 0 140m

kubectl delete$ kubectl delete ([-f FILENAME] | [-k DIRECTORY] | TYPE [(NAME | -l label | --all)])# "nginx-app" deployments 를 지운다.( pod까지 싹다.)
$ kubectl delete deployments.apps nginx-app
# 모든 서비스를 지운다.
$ kubectl delete service --all
# 모두 지운다.
$ kubectl delete all --all
# 파드만 지운다.
$ kubectl delete pod --all
kubectl set$ kubectl set SUBCOMMAND$ kubectl set image (-f FILENAME | TYPE NAME) CONTAINER_NAME_1=CONTAINER_IMAGE_1 ... CONTAINER_NAME_N=CONTAINER_IMAGE_N# "deployment.apps/nginx-deployment" 의 "nginx-deployment-container" 이미지를
# `halilinux/web-site:v1.0`로 변경
$ kubectl set image deployment.apps/nginx-deployment nginx-deployment-container=halilinux/web-site:v1.0
# nginx 배포의 nginx 컨테이너 이미지를 'nginx:1.9.1'로 설정하고 해당 busybox 컨테이너 이미지를 'busybox'로 설정합니다.
$ kubectl set image deployment/nginx busybox=busybox nginx=nginx:1.9.1
kubectl rollout$ kubectl rollout SUBCOMMAND$ kubectl rollout history (TYPE NAME | TYPE/NAME) [flags]| Name | Shorthand | Default | Usage |
|---|---|---|---|
| revision | 0 | 특정 리비전의 podTemplate 을 포함한 세부 정보 보기 |
# "deployment"의 "nginx-deployment" 롤아웃 기록 보기
$ kubectl rollout history deployment nginx-deployment
# "deployment"의 "abc" 롤아웃 기록 보기
$ kubectl rollout history deployment/abc
# 리비전 2 상세보기
$ kubectl rollout history deployment nginx-deployment --revision=2
$ kubectl rollout undo (TYPE NAME | TYPE/NAME) [flags]| Name | Shorthand | Default | Usage |
|---|---|---|---|
| to-revision | 0 | 롤백할 버전. 기본값은 0 (latest revision) |
# 롤백(전 단계로 복원)
$ kubectl rollout undo deployment nginx-deployment
# 리비전2로 복원
$ kubectl rollout undo deployment nginx-deployment --to-revision=2
$ kubectl run nginx-pod --image=halilinux/web-site:aws
$ kubectl expose pod nginx-pod --name loadbalancer --type LoadBalancer --external-ip 192.168.2.46 --port 80
# pod, service 등을 짧게 쓸 수도 있다.
$ kubectl api-resourece
$ kubectl get po -o wide
$ kubectl get svc -o wide
# echo 명령 써보기
$ kubectl exec -it nginx-app-d6ff45774-lpg5c -- /bin/sh -c 'echo "<h1>web02</h1>" > /usr/share/nginx/html/index.html'
$ kubectl exec -it nginx-replicaset-hgtbx -- bash -c 'echo "web01" > /usr/share/nginx/html/index.html'
$ kubectl -n jsb get all
$ kubectl get ns jsb
$ kubectl delete resourcequotas sample-resourcequota
$ kubectl delete ns jsb
$ kubectl label nodes worker1 tier=dev
$ kubecl get nodes --show-labels

$ kubectl label nodes worker1 tier-
