본문 바로가기
DevOps/DockerKubernetes

쿠버네티스 기본 명령어

by 계영수 2022. 8. 16.
728x90

1. 컨테이너의 실행

student@master:~$ kubectl run mynginx --image nginx
pod/mynginx created
student@master:~$
mynginx 라는 이름의 컨테이너를 nginx라는 이미지를 이용하여 생성하라는 의미이다.

2. 컨테이너의 조회

student@master:~$ kubectl get pod
NAME      READY   STATUS    RESTARTS   AGE
mynginx   1/1     Running   0          2m
student@master:~$

쿠버네티스에서는 프로세스를 실행할 때 단순히 컨테이너를 사용하지 않고 Pod라는 리소스를 사용한다. 쿠버네티스의 최소 단위는 Pod이다. 

 

특정 Pod의 상태 정보를 더 자세히 보고 싶다면

student@master:~$ kubectl get pod mynginx -o yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2022-08-16T13:32:17Z"
  labels:
    run: mynginx
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:labels:
          .: {}
          f:run: {}
      f:spec:
        f:containers:
          k:{"name":"mynginx"}:
            .: {}
            f:image: {}
            f:imagePullPolicy: {}
            f:name: {}
            f:resources: {}
            f:terminationMessagePath: {}
            f:terminationMessagePolicy: {}
        f:dnsPolicy: {}
        f:enableServiceLinks: {}
        f:restartPolicy: {}
        f:schedulerName: {}
        f:securityContext: {}
        f:terminationGracePeriodSeconds: {}
    manager: kubectl
    operation: Update
    time: "2022-08-16T13:32:17Z"
  - apiVersion: v1
  ~~~~
  생략

 

간단하게 Pod의 IP를 바로 확인하려면

student@master:~$ kubectl get pod -o wide
NAME      READY   STATUS    RESTARTS   AGE   IP          NODE     NOMINATED NODE   READINESS GATES
mynginx   1/1     Running   0          13m   10.42.1.2   worker   <none>           <none>
student@master:~$

 

3. 컨테이너 상세 정보 확인 

get 명령어와는 조금 다르게 Pod에 대한 Events 기록까지 확인할 수 있다. Pod에 문제가 발생하였을 때 get 명령어와 함께 디버깅 용도로 자주 사용된다.

student@master:~$ kubectl describe pod mynginx
Name:         mynginx
Namespace:    default
Priority:     0
Node:         worker/192.168.187.12
Start Time:   Tue, 16 Aug 2022 22:32:17 +0900
Labels:       run=mynginx
Annotations:  <none>
Status:       Running
IP:           10.42.1.2
IPs:
  IP:  10.42.1.2
Containers:
  mynginx:
    Container ID:   docker://a42121cc0e9a01ec193011872996721a07d5a0837d8e70d5ab195ef57ac2f24b
    Image:          nginx
    Image ID:       docker-pullable://nginx@sha256:790711e34858c9b0741edffef6ed3d8199d8faa33f2870dea5db70f16384df79
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Tue, 16 Aug 2022 22:32:37 +0900
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-56zrv (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  default-token-56zrv:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-56zrv
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type    Reason     Age        From               Message
  ----    ------     ----       ----               -------
  Normal  Scheduled  <unknown>  default-scheduler  Successfully assigned default/mynginx to worker
  Normal  Pulling    15m        kubelet, worker    Pulling image "nginx"
  Normal  Pulled     15m        kubelet, worker    Successfully pulled image "nginx"
  Normal  Created    15m        kubelet, worker    Created container mynginx
  Normal  Started    15m        kubelet, worker    Started container mynginx
student@master:~$

 

4. 컨테이너 로깅 

컨테이너에서 발생하는 로그 정보를 확인할 수 있다.  -f, --follow 옵션을 사용하면 로그의 출력 스트림이 종료되지 않고, 지속적으로 로그를 출력하게 된다.

student@master:~$ kubectl logs -f mynginx
/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
2022/08/16 13:32:37 [notice] 1#1: using the "epoll" event method
2022/08/16 13:32:37 [notice] 1#1: nginx/1.23.1
2022/08/16 13:32:37 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6) 
2022/08/16 13:32:37 [notice] 1#1: OS: Linux 5.15.0-46-generic
2022/08/16 13:32:37 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2022/08/16 13:32:37 [notice] 1#1: start worker processes
2022/08/16 13:32:37 [notice] 1#1: start worker process 32
2022/08/16 13:32:37 [notice] 1#1: start worker process 33

 

5. 컨테이너로 명령을 전달

실행중인 컨테이너 안으로 실행할 명령어를 전달한다. docker exec 명령과 유사하다.  한가지 차이점이 있다면 컨테이너에 실행할 명령을 전달할 때 구분자( -- )로 전달할 명령을 구분한다. 

student@master:~$ kubectl exec mynginx -- apt-get update
Get:1 http://deb.debian.org/debian bullseye InRelease [116 kB]
Get:2 http://deb.debian.org/debian-security bullseye-security InRelease [48.4 kB]
Get:3 http://deb.debian.org/debian bullseye-updates InRelease [44.1 kB]
Get:4 http://deb.debian.org/debian bullseye/main amd64 Packages [8182 kB]
Get:5 http://deb.debian.org/debian-security bullseye-security/main amd64 Packages [176 kB]
Get:6 http://deb.debian.org/debian bullseye-updates/main amd64 Packages [2592 B]
Fetched 8569 kB in 2s (4512 kB/s)
Reading package lists...
student@master:~$

 

만약 컨테이너 내부의 Shell로 진입하려면 -it 옵션을 이용한다. 아래 예에서 mynginx 로 들어가서 hostname 명령어를 입력하면, 호스트 이름이 출력됨을 확인할 수 있다.

student@master:~$ kubectl exec -it mynginx -- bash
root@mynginx:/# hostname
mynginx
root@mynginx:/#

 

6. 컨테이너/호스트간에 파일의 복사

컨테이너에서 호스트로 또는 호스트에서 컨테이너로 파일을 복사할 때 사용한다

<HOST> --> <Container>

kubectl cp /etc/passwd  mynginx:/tmp/passwd 

 
student@master:~$ kubectl cp /etc/passwd mynginx:/tmp/passwd
student@master:~$ kubectl exec mynginx -- ls /tmp/passwd
/tmp/passwd
student@master:~$ kubectl exec mynginx -- cat /tmp/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
~~~
~~~
~~~

 

7. 컨테이너 정보 수정

실행된 컨테니어의 정보를 수정한다. edit 명령을 수행하면, 실제로는 VIM이 실행되어 관련된 yaml 파일을 수정하는 모드로 진입하게 된다. 


student@master:~$ kubectl edit pod mynginx

 

vim 이 실행되어 Pod 관련 yaml 파일을 수정하기 위한 모드로 진입


# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2022-08-16T13:32:17Z"
  labels:
    run: mynginx
    hello: world   <==== 추가한 부분
  managedFields:  
  - apiVersion: v1      
    fieldsType: FieldsV1
    fieldsV1:    
      f:metadata:
        f:labels:
          .: {}    
          f:run: {}
      f:spec:

 

수정이 되었는지 확인


student@master:~$ kubectl get pod mynginx -o yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2022-08-16T13:32:17Z"
  labels:
    hello: world
    run: mynginx
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:status:
        f:conditions:

 

8. 컨테이너 삭제

student@master:~$ kubectl delete pod mynginx
pod "mynginx" deleted
student@master:~$ kubectl get pod
No resources found in default namespace.
student@master:~$
728x90