안녕하세요. IT Window 킷도우입니다.
오늘은 kubernetes 클러스터에서 사용하는 kubectl 명령어에 대해 정리해 보는 시간을 갖겠습니다.
지난 시간에 쿠버네티스 리소스 생성, 조회, 삭제, 갱신하는 명령어에 대해 소개해 드렸는데 혹 못 보신 분들은 아래 링크를 참조해 주세요.
[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 명령어로 리소스 상태를 변경하고 확인하는 방법에 대해 알아봤습니다. 다음 시간에도 더 유익한 정보로 찾아뵙겠습니다. 감사합니다!
댓글