본문 바로가기
킷도우의 클라우드, 쿠버네티스/쿠버네티스(kubernetes)

[kubectl 명령어 정리] kubectl set, kubectl describe, kubectl diff 명령어 사용법(리소스 상태 변경, 확인 및 매니페스트 파일과 비교하기)

by 킷도우 2023. 2. 5.
반응형

안녕하세요. IT Window 킷도우입니다.

오늘은 kubernetes 클러스터에서 사용하는 kubectl 명령어에 대해 정리해 보는 시간을 갖겠습니다.

 

지난 시간에 쿠버네티스 리소스 생성, 조회, 삭제, 갱신하는 명령어에 대해 소개해 드렸는데 혹 못 보신 분들은 아래 링크를 참조해 주세요.

https://kitdow.tistory.com/30

 

[kubernetes] 쿠버네티스 리소스 생성/조회/삭제/갱신 명령어(kubectl create/get/delete/apply)

안녕하세요. IT Window 킷도우입니다. 오늘 여러분들에게 포스팅 할 내용은 바로 kubectl 명령어 활용하기입니다. 첫째로, 쿠버네티스 리소스를 생성, 삭제, 갱신하는 방법에 대해 알아보겠습니다.

kitdow.tistory.com

 

실습을 하면서 진행할 예정이기에 아래와 같이 쿠버네티스 클러스테어 매니페스트 파일을 하나 만들어 주겠습니다.

cat <<EOF > test-pod.yaml
apiVersion: v1
kind: Pod
metadata:
 name: test-pod
spec:
 containers:
 - name: nginx-container
   image: nginx:1.16
EOF

파일이 정상적으로 만들어졌는지 확인합니다.

kitdow_on@cloudshell:~ (gke-cloud-nexacro)$ ls
README-cloudshell.txt  test-pod.yaml

이 매니페스트 파일을 토대로  pod 하나 만들어 주겠습니다.

kubectl apply -f test-pod.yaml

정상적으로 만들어졌는지 확인하겠습니다.

kitdow_on@cloudshell:~ (gke-cloud-nexacro)$ kubectl get pods
NAME       READY   STATUS    RESTARTS   AGE
test-pod   1/1     Running   0          6s

실습을 위한 준비가 끝났습니다. 바로 본론으로 들어가겠습니다.

 

1. kubectl set 명령어

쿠버네티스에서 pod을 생성할 땐 위처럼 매니페스트 파일을 만들고 apply 명령어를 활용해 pod를 생성합니다. pod의 근본적인 설정 변경(pod 내 컨테이너 이미지 버전 업그레이드 등)이 필요하다면 yaml로 작성한 매니페스트 파일을 다시 재작성하여 apply 명령어를 활용해 갱신해줘야겠죠?

 

하지만 이 set 명령어를 사용하면 곧장 pod의 동작 상태를 변경할 수 있습니다. 당연히 매니페스트 yaml 파일은 변경되지 않겠죠? 따라서 set 명령어를 쓰면 해당 pod의 근본인 매니페스트 파일은 그대로이나 서버 상의 pod 상태가 일치하지 않기 때문에 혼돈을 불러일으킬 수 있으므로 실제 운영 환경에서는 남발해선 안되는 명령어임을 알아야겠습니다.

 

명령어는 아래와 같이 쓰면됩니다.

kubectl set (변경할 항목) (리소스종류) (리소스명) (변경할 내용)

kitdow_on@cloudshell:~ (gke-cloud-nexacro)$ kubectl set image pod test-pod nginx-container=nginx:1.19
pod/test-pod image updated

이제 아래의 describe 명령어를 활용해 set 명령어로 변경한 내용이 정상적으로 조회되는지 확인해 보겠습니다.

 

반응형

2. kubectl describe 명령어

describe 명령어를 활용해 우리는 리소스의 상세 정보를 확인할 수 있습니다. 

최초 우리는 매니페스트 파일에서 nginx 이미지 버전을 1.16으로 정의하고 생성했지만, 현재는 set 명령어로 pod의 이미지를 변경하면서 1.19 버전으로 변경된 것을 확인할 수 있습니다.

kitdow_on@cloudshell:~ (gke-cloud-nexacro)$ kubectl describe pod test-pod
Name:             test-pod
Namespace:        default
Priority:         0
Service Account:  default
Node:             gke-cluster-1-default-pool-ff0b2e22-c890/10.128.0.4
Start Time:       Sun, 05 Feb 2023 08:15:10 +0000
Labels:           <none>
Annotations:      <none>
Status:           Running
IP:               10.4.1.10
IPs:
  IP:  10.4.1.10
Containers:
  nginx-container:
    Container ID:   containerd://c13959adde9ef9361e0f7af9cc955d5b1c47d12d22bbb30a168859fd4d7062ea
    Image:          nginx:1.19
    Image ID:       docker.io/library/nginx@sha256:df13abe416e37eb3db4722840dd479b00ba193ac6606e7902331dcea50f4f1f2
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Sun, 05 Feb 2023 08:32:30 +0000
    Last State:     Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Sun, 05 Feb 2023 08:15:11 +0000
      Finished:     Sun, 05 Feb 2023 08:32:26 +0000
    Ready:          True
    Restart Count:  1
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-r8cz4 (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
Volumes:
  kube-api-access-r8cz4:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason     Age                  From               Message
  ----    ------     ----                 ----               -------
  Normal  Scheduled  20m                  default-scheduler  Successfully assigned default/test-pod to gke-cluster-1-default-pool-ff0b2e22-c890
  Normal  Pulled     20m                  kubelet            Container image "nginx:1.16" already present on machine
  Normal  Killing    3m3s                 kubelet            Container nginx-container definition changed, will be restarted
  Normal  Pulling    3m3s                 kubelet            Pulling image "nginx:1.19"
  Normal  Created    2m59s (x2 over 20m)  kubelet            Created container nginx-container
  Normal  Started    2m59s (x2 over 20m)  kubelet            Started container nginx-container
  Normal  Pulled     2m59s                kubelet            Successfully pulled image "nginx:1.19" in 3.855085865s

위 코드에서 맨 마지막에 events 영역에 변경 이력이 모두 남는 것을 확인할 수 있네요~

하지만 누군가가 이미지를 변경했을 때 이것을 매니페스트 파일을 변경해서 이미지를 변경한 것인지, 아니면 set 명령어를 통해 바꾼 것인지 정확히 확인할 방법이 없습니다. 이럴땐 diff 명령어를 사용하여 확인할 수 있습니다.

 

3. kubectl diff 명령어 

diff 명령어는 위에 말한 것처럼 매니페스트 파일의 내용과 실제 클러스터에 올라가 있는 리소스 정보가 다른지 비교해 주는 명령어입니다. 서로 리소스 설정이 다를 경우 아래와 같이 출력됩니다.

kitdow_on@cloudshell:~ (gke-cloud-nexacro)$ kubectl diff -f test-pod.yaml
diff -u -N /tmp/LIVE-3141963022/v1.Pod.default.test-pod /tmp/MERGED-882096359/v1.Pod.default.test-pod
--- /tmp/LIVE-3141963022/v1.Pod.default.test-pod        2023-02-05 08:44:19.431028737 +0000
+++ /tmp/MERGED-882096359/v1.Pod.default.test-pod       2023-02-05 08:44:19.432028736 +0000
@@ -11,7 +11,7 @@
   uid: a4c31404-037f-443b-ae9c-105de7dc11d2
 spec:
   containers:
-  - image: nginx:1.19
+  - image: nginx:1.16
     imagePullPolicy: IfNotPresent
     name: nginx-container
     resources: {}

--- : LIVE 즉 운영중인 pod의 정보

+++ : merged 즉 매니페스트의 최종 변경된 버전

위 표시에 따라 - 즉 운영(LIVE)중인 팟의 컨테이너 이미지는 1.19, 매니페스트에 정의된 컨테이너 이미지 버전은 1.16인 것으로 알 수 있겠습니다.

 

심플하게 확인할 수 있는 방법은 위 diff 명령어를 입력한 후 echo $? 명령어를 입력하는 것입니다.

echo $?

 해당 명령어의 결과가

1 : 매니페스트와 클러스터에 등록된 정보가 다르다

0 : 매니페스트와 클러스터에 등록된 정보가 같다

입니다.

 

네 이상으로 kubectl set, describe, diff 명령어로 리소스 상태를 변경하고 확인하는 방법에 대해 알아봤습니다. 다음 시간에도 더 유익한 정보로 찾아뵙겠습니다. 감사합니다!

반응형

댓글