[kubernetes] kubectl 명령어 정리

rin·2021년 2월 20일
3
post-thumbnail

kubectl version --short

버전 정보

> kubectl version --short
Client Version: v1.16.6-beta.0
Server Version: v1.17.12

kubectl api-resources

쿠버네티스에서 사용가능한 오브젝트 리스트

> kubectl api-resources
NAME                               SHORTNAMES     APIGROUP                       NAMESPACED   KIND
bindings                                                                         true         Binding
componentstatuses                  cs                                            false        ComponentStatus
configmaps                         cm                                            true         ConfigMap
endpoints                          ep                                            true         Endpoints
events                             ev                                            true         Event
limitranges                        limits                                        true         LimitRange
namespaces                         ns                                            false        Namespace
nodes                              no                                            false        Node
persistentvolumeclaims             pvc                                           true         PersistentVolumeClaim

... 후략

kubectl apply -f ${yaml_file_name}

yaml 파일을 이용해 리소스 생성

> kubectl apply -f nginx-pod.yaml
pod/my-nginx-pod created

kubectl get ${object_type}

현재 쿠버네티스에 존재하는 특정 오브젝트의 리스트

> kubectl get pods
NAME           READY   STATUS    RESTARTS   AGE
my-nginx-pod   1/1     Running   0          6m28s
  • -o wide 옵션을 추가하면 더 많은 정보를 얻을 수 있다.
  • --show-lables 옵션을 추가하면 라벨을 함께 출력할 수 있다.
    • -l ${label} 옵션을 통해 원하는 리소스만을 출력하는 용도로 사용할 수 있다.

kubectl describe ${object_type} ${resource_name}

해당 리소스의 자세한 정보 출력

> kubectl describe pods my-nginx-pod
Name:         my-nginx-pod
Namespace:    default
Priority:     0
Node:         dkosv3-dev-worker-1/10.202.97.81
Start Time:   Sat, 20 Feb 2021 17:26:20 +0900
Labels:       <none>
Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"name":"my-nginx-pod","namespace":"default"},"spec":{"containers":[{"image":"...
Status:       Running
IP:           10.240.1.225

... 후략

kubectl exec -it ${pod_name} bash

해당 파드에 직접 접근

  • -it 옵션을 사용해 배시 셸을 유지한다.

위의 describe에서 얻은 IP를 사용해 nginx에 접근해 보자

> kubectl exec -it my-nginx-pod bash
root@my-nginx-pod:/# curl 10.240.1.225
'<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

kubectl exec -it ${pod_name} -c ${container_name} bash

  • -c 옵션을 사용해 파드의 어떤 컨테이너에 대해 명령어를 수행할 것인지 명시한다.
> kubectl exec -it my-nginx-pod -c ubuntu-sidecar-container bash
root@my-nginx-pod:/# curl localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

kubectl logs ${pod_name}

파드 로그확인

> kubectl logs my-nginx-pod
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
10.240.1.225 - - [20/Feb/2021:08:37:36 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.64.0" "-"
10.240.1.225 - - [20/Feb/2021:08:40:19 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.64.0" "-"

kubectl delete -f ${yaml_file_name}

오브젝트 삭제

> kubectl delete -f nginx-pod.yaml
pod "my-nginx-pod" deleted

> kubectl get pods
No resources found in default namespace.

kubectl delete ${object_type} ${resource_name}

오브젝트 삭제

kubectl delete deployment,pod,rs --all

모든 리소스를 삭제한다.

> kubectl delete deployment,pod,rs --all
deployment.apps "my-nginx-deployment" deleted
pod "my-nginx-deployment-85d657c94d-4hxjn" deleted
pod "my-nginx-deployment-85d657c94d-rc57k" deleted
pod "my-nginx-deployment-85d657c94d-rjxsb" deleted

kubectl edit ${object_type} ${resource_name}

리소스의 속성을 변경할 수 있도록 텍스트 편집기를 실행하며, 변경 사항을 적용하려면 파일을 저장한 뒤 빠져나오면 된다.

> kubectl edit pods replicaset-nginx-hldsk
pod/replicaset-nginx-hldsk edited

kubectl set image deployment ${deployment_name} ${prev_image}=${next_image} --record

해당 디플로이먼트가 보유한 포드의 특정 이미지를 변경한다.
yaml 파일에서 직접 image 항목을 변경하고 kubectl apply -f 명령어를 사용하거나, kubectl edit 명령어를 사용해도 동일하다.

  • --record 옵션으로 변경된 디플로이먼트는 변경 사항을 기록한다.
> kubectl apply -f deployment-nginx.yaml --record
deployment.apps/my-nginx-deployment created

kubectl rollout history deployment ${deployment_name}

디플로이먼트의 포드 정보가 업데이트 된 경우, 리버전 정보를 확인할 수 있다.

> kubectl rollout history deployment my-nginx-deployment
deployment.apps/my-nginx-deployment
REVISION  CHANGE-CAUSE
1         kubectl apply --filename=deployment-nginx.yaml --record=true
2         kubectl set image deployment my-nginx-deployment nginx=nginx:1.11 --record=true

kubectl rollout undo deployment ${deployment_name} --to-revision=${revision_version}

이전 버전의 레플리카셋으로 롤백한다.

> kubectl rollout undo deployment my-nginx-deployment --to-revision=1
deployment.apps/my-nginx-deployment rolled back

kubectl scale --replicas=${count} deployment ${deployment_name}

디플로이먼트의 포드 개수를 변경할 수 있다.

> kubectl scale --replicas=1 deployment hostname-deployment
deployment.apps/hostname-deployment scaled

kubectl create configmap ${configmap_name} --from-literal ${key}=${value}

--from-literal ${key}=${value} 옵션을 반복사용하여 해당 설정값을 가지는 컨피그맵을 생성한다.

> kubectl create configmap start-k8s --from-literal k8s=kubernetes \
--from-literal container=docker

kubectl get configmap ${configmap_name} -o yaml 명령어를 사용하면 yaml 형태로 생성된 컨피그맵을 확인할 수 있다.

> kubectl get configmap start-k8s -o yaml
apiVersion: v1
data:
  container: docker
  k8s: kubernetes
kind: ConfigMap
metadata:
  creationTimestamp: "2021-02-22T12:45:34Z"
  name: start-k8s
  namespace: default
  resourceVersion: "1568917"
  selfLink: /api/v1/namespaces/default/configmaps/start-k8s
  uid: f7c882b0-0bf7-4c33-a95e-5e9df6b55a51

kubectl create configmap ${configmap_name} --from-file ${file_name}

--from-file ${file_name} 옵션을 반복하여 해당 파일을 value로 가지는 컨피그맵을 생성한다.

> kubectl create configmap index-file --from-file index.html
configmap/index-file created

> kubectl describe cm index-file
Name:         index-file
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
index.html:
----
hello world!

Events:  <none>

위와 같이 생성하는 경우 확장자를 포함한 파일이름이 키값이 된다.

  • --from-file ${key}=${file_name} 과 같이 작성하면 파일이름이 아닌 키 값을 지정할 수 있다.

  • --from-env-file 옵션을 사용하면 여러 개의 키-값 형태의 내용으로 구성된 설정 파일을 한꺼번에 컨피그맵으로 가져올 수 있다.

> cat multiple-keyvalue.env
mykey1=myvalue1
mykey2=myvalue2
mykey3=myvalue3

> kubectl create configmap from-envfile --from-env-file multiple-keyvalue.env
configmap/from-envfile created

> kubectl get cm from-envfile -o yaml
apiVersion: v1
data:
  mykey1: myvalue1
  mykey2: myvalue2
  mykey3: myvalue3
kind: ConfigMap
metadata:
  creationTimestamp: "2021-02-22T13:58:59Z"
  name: from-envfile
  namespace: default
  resourceVersion: "1588099"
  selfLink: /api/v1/namespaces/default/configmaps/from-envfile
  uid: 12cfdf96-dfe4-455c-9d37-5f327a82f34a
  • --dry-run -o yaml 옵션을 사용해 컨피그맵을 생성하지 않은 채로 yaml 파일을 생성하고 배포할 수 있다.
    • 일반적으로 --dry-run은 특정 작업의 실행 가능 여부를 검토하는 명령어 또는 api를 의미한다.
    • 예를 들어, kubectl apply, kubectl create와 같은 명령어에 해당 옵션을 추가하면 실행 가능 여부만 확인하고, 실제 리소스를 생성하지는 않는다.
> kubectl create configmap my-configmap --from-literal mykey=myvalue --dry-run -o yaml > my-configmap.yaml

> cat my-configmap.yaml
apiVersion: v1
data:
  mykey: myvalue
kind: ConfigMap
metadata:
  creationTimestamp: null
  name: my-configmap

> kubectl apply -f my-configmap.yaml
configmap/my-configmap created
profile
🌱 😈💻 🌱

0개의 댓글