Information in this document may be out of date
This document has an older update date than the original, so the information it contains may be out of date. If you're able to read English, see the English version for the most up-to-date information: Debug Running Pods
๋์ ์ค์ธ ํ๋ ๋๋ฒ๊ทธ
์ด ํ์ด์ง๋ ๋ ธ๋์์ ๋์ ์ค์ธ(ํน์ ํฌ๋์๋) ํ๋๋ฅผ ๋๋ฒ๊ทธํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช ํ๋ค.
์์ํ๊ธฐ ์ ์
- ์ฌ๋ฌ๋ถ์ ํ๋๋ ์ด๋ฏธ ์ค์ผ์ค๋ง ๋์ด ๋์ํ๊ณ ์์ ๊ฒ์ด๋ค. ๋ง์ฝ ํ๋๊ฐ ์์ง ๋์์ค์ด์ง ์๋ค๋ฉด, ์ ํ๋ฆฌ์ผ์ด์ ํธ๋ฌ๋ธ์ํ ์ ์ฐธ๊ณ ํ๋ค.
- ์ผ๋ถ ๊ณ ๊ธ ๋๋ฒ๊น
๊ณผ์ ์์๋ ํด๋น ํ๋๊ฐ ์ด๋ค ๋
ธ๋์์ ๋์ํ๊ณ ์๋์ง
์์์ผ ํ๊ณ , ํด๋น ๋
ธ๋์์ ์ ๋ช
๋ น์ด๋ฅผ ์คํ์ํฌ ์ ์์ด์ผ ํ๋ค.
kubectl
์ ์ฌ์ฉํ๋ ์ผ๋ฐ์ ์ธ ๋๋ฒ๊น ๊ณผ์ ์์๋ ์ด๋ฌํ ์ ๊ทผ ๊ถํ์ด ํ์ํ์ง ์๋ค.
kubectl describe pod
๋ช
๋ น์ผ๋ก ํ๋ ์์ธ์ฌํญ ๊ฐ์ ธ์ค๊ธฐ
์ด ์์ ์์๋ ์์ ์์ ์ ๋น์ทํ๊ฒ ๋ ๊ฐ์ ํ๋๋ฅผ ์์ฑํ๊ธฐ ์ํด ๋ํ๋ก์ด๋จผํธ๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ค.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
resources:
limits:
memory: "128Mi"
cpu: "500m"
ports:
- containerPort: 80
๋ค์ ๋ช ๋ น์ ์คํํ์ฌ ๋ํ๋ก์ด๋จผํธ๋ฅผ ์์ฑํ๋ค.
kubectl apply -f https://k8s.io/examples/application/nginx-with-request.yaml
deployment.apps/nginx-deployment created
๋ค์ ๋ช ๋ น์ ์คํํ์ฌ ํ๋ ์ํ๋ฅผ ํ์ธํ๋ค.
kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-67d4bdd6f5-cx2nz 1/1 Running 0 13s
nginx-deployment-67d4bdd6f5-w6kd7 1/1 Running 0 13s
๋ค์๊ณผ ๊ฐ์ด kubectl describe pod
๋ช
๋ น์ ์ฌ์ฉํ์ฌ ๊ฐ ํ๋์ ๋ํ ๋ ๋ง์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
kubectl describe pod nginx-deployment-67d4bdd6f5-w6kd7
Name: nginx-deployment-67d4bdd6f5-w6kd7
Namespace: default
Priority: 0
Node: kube-worker-1/192.168.0.113
Start Time: Thu, 17 Feb 2022 16:51:01 -0500
Labels: app=nginx
pod-template-hash=67d4bdd6f5
Annotations: <none>
Status: Running
IP: 10.88.0.3
IPs:
IP: 10.88.0.3
IP: 2001:db8::1
Controlled By: ReplicaSet/nginx-deployment-67d4bdd6f5
Containers:
nginx:
Container ID: containerd://5403af59a2b46ee5a23fb0ae4b1e077f7ca5c5fb7af16e1ab21c00e0e616462a
Image: nginx
Image ID: docker.io/library/nginx@sha256:2834dc507516af02784808c5f48b7cbe38b8ed5d0f4837f16e78d00deb7e7767
Port: 80/TCP
Host Port: 0/TCP
State: Running
Started: Thu, 17 Feb 2022 16:51:05 -0500
Ready: True
Restart Count: 0
Limits:
cpu: 500m
memory: 128Mi
Requests:
cpu: 500m
memory: 128Mi
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-bgsgp (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
kube-api-access-bgsgp:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional: <nil>
DownwardAPI: true
QoS Class: Guaranteed
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 34s default-scheduler Successfully assigned default/nginx-deployment-67d4bdd6f5-w6kd7 to kube-worker-1
Normal Pulling 31s kubelet Pulling image "nginx"
Normal Pulled 30s kubelet Successfully pulled image "nginx" in 1.146417389s
Normal Created 30s kubelet Created container nginx
Normal Started 30s kubelet Started container nginx
์ ์์์์ ์ปจํ ์ด๋์ ํ๋์ ๋ํ ๊ตฌ์ฑ ์ ๋ณด(๋ ์ด๋ธ, ๋ฆฌ์์ค ์๊ตฌ์ฌํญ ๋ฑ) ๋ฐ ์ํ ์ ๋ณด(์ํ(state), ์ค๋น์ฑ(readiness), ์ฌ์์ ํ์, ์ด๋ฒคํธ ๋ฑ)๋ฅผ ๋ณผ ์ ์๋ค.
์ปจํ ์ด๋์ ์ํ(state)๊ฐ์ Waiting, Running, ๋๋ Terminated ์ค ํ๋์ด๋ค. ๊ฐ ์ํ์ ๋ฐ๋ผ, ์ถ๊ฐ ์ ๋ณด๊ฐ ์ ๊ณต๋ ๊ฒ์ด๋ค. ์ ์์์์ Running ์ํ์ ์ปจํ ์ด๋์ ๋ํด์๋ ์ปจํ ์ด๋์ ์์ ์๊ฐ์ ์์คํ ์ด ํ์ํด ์ฃผ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
Ready ๊ฐ์ ์ปจํ ์ด๋์ ๋ง์ง๋ง ์ค๋น์ฑ ํ๋ก๋ธ(readiness probe) ํต๊ณผ ์ฌ๋ถ๋ฅผ ์๋ ค ์ค๋ค. (์ ์์์์๋ ์ปจํ ์ด๋์ ์ค๋น์ฑ ํ๋ก๋ธ๊ฐ ์ค์ ๋์ด ์์ง ์๋ค. ์ปจํ ์ด๋์ ์ค๋น์ฑ ํ๋ก๋ธ๊ฐ ์ค์ ๋์ด ์์ง ์์ผ๋ฉด, ์ปจํ ์ด๋๋ ์ค๋น(ready) ์ํ๋ก ๊ฐ์ฃผ๋๋ค.)
'์ฌ์์ ์นด์ดํธ'๋ ์ปจํ ์ด๋๊ฐ ์ฌ์์๋ ํ์๋ฅผ ๋ณด์ฌ ์ค๋ค. ์ด ์ ๋ณด๋ ์ฌ์์ ์ ์ฑ ์ด 'always'๋ก ์ค์ ๋ ์ปจํ ์ด๋์ ๋ฐ๋ณต์ ์ธ ๊ฐ์ ์ข ๋ฃ๋ฅผ ์์์ฐจ๋ฆฌ๋ ๋ฐ์ ์ ์ฉํ๋ค.
์ ์์์์ ํ๋์ ์ฐ๊ด๋ ์ ์ผํ ์ปจ๋์ (Condition)์ True ๋๋ False ๊ฐ์ ๊ฐ๋ Ready ์ปจ๋์ ์ด๋ฉฐ, ์ด ๊ฐ์ด True๋ผ๋ ๊ฒ์ ํ๋๊ฐ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์์ผ๋ฉฐ ๋ชจ๋ ๋์ผํ ์๋น์ค๋ฅผ ๋ฌถ๋ ๋ก๋ ๋ฐธ๋ฐ์ฑ ํ์ ์ถ๊ฐ๋์ด์ผ ํจ์ ์๋ฏธํ๋ค.
๋ง์ง๋ง์ผ๋ก, ํ๋์ ๊ด๋ จ๋ ์ต๊ทผ ์ด๋ฒคํธ ๋ก๊ทธ๊ฐ ํ์๋๋ค. ์์คํ ์ ๋์ผํ ์ฌ๋ฌ ์ด๋ฒคํธ๋ฅผ ์ฒ์/๋ง์ง๋ง ๋ฐ์ ์๊ฐ ๋ฐ ๋ฐ์ ํ์๋ง ์์ถ์ ์ผ๋ก ํ์ํ๋ค. "From"์ ์ด๋ฒคํธ ๋ก๊ทธ๋ฅผ ๋ฐ์ํ๋ ๊ตฌ์ฑ ์์๋ฅผ ๊ฐ๋ฆฌํค๊ณ , "SubobjectPath"๋ ์ฐธ์กฐ๋๋ ๊ฐ์ฒด(์: ํ๋ ๋ด ์ปจํ ์ด๋)๋ฅผ ๋ํ๋ด๋ฉฐ, "Reason" ๋ฐ "Message"๋ ๋ฐ์ํ ์ํฉ์ ์๋ ค ์ค๋ค.
์์: Pending ์ํ์ ํ๋ ๋๋ฒ๊น ํ๊ธฐ
์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์งํ ์ ์๋ ์ผ๋ฐ์ ์ธ ์๋๋ฆฌ์ค๋ ๋ ธ๋์ ํ ๋น๋ ์ ์๋ ํ๋๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ์ด๋ค. ์๋ฅผ ๋ค์ด ํ๋๊ฐ ๋ ธ๋์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฆฌ์์ค๋ณด๋ค ๋ ๋ง์ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ๊ฑฐ๋, ๋๋ ์ด๋ค ๋ ธ๋์๋ ํด๋น๋์ง ์๋ ๋ ์ด๋ธ ์ ๋ ํฐ๋ฅผ ๋ช ์ํ์ ์ ์๋ค. ์๋ฅผ ๋ค์ด 4๊ฐ ๋ ธ๋๋ก ๊ตฌ์ฑ๋๋ฉฐ ๊ฐ (๊ฐ์) ๋จธ์ ์ 1 CPU๊ฐ ์๋ ํด๋ฌ์คํฐ๊ฐ ์๋ ์ํฉ์์, ์ ์์ ๋์ 2 ๋ ํ๋ฆฌ์นด๊ฐ ์๋๋ผ 5 ๋ ํ๋ฆฌ์นด๋ฅผ, 500 ๋ฐ๋ฆฌ์ฝ์ด๊ฐ ์๋๋ผ 600 ๋ฐ๋ฆฌ์ฝ์ด๋ฅผ ์์ฒญํ๋ ๋ํ๋ก์ด๋จผํธ๋ฅผ ๋ฐฐํฌํ๋ค๊ณ ํด ๋ณด์. ์ด๋ฌํ ๊ฒฝ์ฐ 5๊ฐ์ ํ๋ ์ค ํ๋๋ ์ค์ผ์ค๋ง๋ ์ ์์ ๊ฒ์ด๋ค. (๊ฐ ๋ ธ๋์๋ fluentd, skydns ๋ฑ์ ํด๋ฌ์คํฐ ์ ๋์จ๋ ์คํ๋๊ณ ์์ผ๋ฏ๋ก, ๋ง์ฝ 1000 ๋ฐ๋ฆฌ์ฝ์ด๋ฅผ ์์ฒญํ๋ค๋ฉด ํ๋๊ฐ ํ๋๋ ์ค์ผ์ค๋ ์ ์์์ ๊ฒ์ด๋ค.)
kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-1006230814-6winp 1/1 Running 0 7m
nginx-deployment-1006230814-fmgu3 1/1 Running 0 7m
nginx-deployment-1370807587-6ekbw 1/1 Running 0 1m
nginx-deployment-1370807587-fg172 0/1 Pending 0 1m
nginx-deployment-1370807587-fz9sd 0/1 Pending 0 1m
nginx-deployment-1370807587-fz9sd ํ๋๊ฐ ์ ์คํ๋์ง ์๋์ง๋ฅผ ์์ ๋ณด๋ ค๋ฉด, pending ์ํ์ ํ๋์ ๋ํด kubectl describe pod
๋ช
๋ น์ ์คํํ๊ณ ์ด๋ฒคํธ(event) ํญ๋ชฉ์ ํ์ธํด ๋ณผ ์ ์๋ค.
kubectl describe pod nginx-deployment-1370807587-fz9sd
Name: nginx-deployment-1370807587-fz9sd
Namespace: default
Node: /
Labels: app=nginx,pod-template-hash=1370807587
Status: Pending
IP:
Controllers: ReplicaSet/nginx-deployment-1370807587
Containers:
nginx:
Image: nginx
Port: 80/TCP
QoS Tier:
memory: Guaranteed
cpu: Guaranteed
Limits:
cpu: 1
memory: 128Mi
Requests:
cpu: 1
memory: 128Mi
Environment Variables:
Volumes:
default-token-4bcbi:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-4bcbi
Events:
FirstSeen LastSeen Count From SubobjectPath Type Reason Message
--------- -------- ----- ---- ------------- -------- ------ -------
1m 48s 7 {default-scheduler } Warning FailedScheduling pod (nginx-deployment-1370807587-fz9sd) failed to fit in any node
fit failure on node (kubernetes-node-6ta5): Node didn't have enough resource: CPU, requested: 1000, used: 1420, capacity: 2000
fit failure on node (kubernetes-node-wul5): Node didn't have enough resource: CPU, requested: 1000, used: 1100, capacity: 2000
์ฌ๊ธฐ์ ์ค์ผ์ค๋ฌ๊ฐ ๊ธฐ๋กํ ์ด๋ฒคํธ๋ฅผ ํตํด, ํ๋๊ฐ FailedScheduling
์ฌ์ ๋ก ์ธํด ์ค์ผ์ค๋ง๋์ง ์์์์ ์ ์ ์๋ค(๋ค๋ฅธ ์ด์ ๋ ์์ ์ ์์). ์ด ๋ฉ์์ง๋ฅผ ํตํด ์ด๋ค ๋
ธ๋์๋ ์ด ํ๋๋ฅผ ์คํํ๊ธฐ ์ํ ์ถฉ๋ถํ ๋ฆฌ์์ค๊ฐ ์์์์ ์ ์ ์๋ค.
์ด ์ํฉ์ ๋ฐ๋ก์ก์ผ๋ ค๋ฉด, kubectl scale
๋ช
๋ น์ผ๋ก ๋ํ๋ก์ด๋จผํธ์ ๋ ํ๋ฆฌ์นด๋ฅผ 4 ์ดํ๋ก ์ค์ผ ์ ์๋ค. (๋๋ ํ ํ๋๋ฅผ pending ์ํ๋ก ๋์ด๋ ๋๋ฉฐ, ์ด๋ ๊ฒ ํด๋ ๋ฌธ์ ๋ ์๋ค.)
kubectl describe pod
์ถ๋ ฅ์ ๋ง์ง๋ง์ ์๋ ๊ฒ๊ณผ ๊ฐ์ ์ด๋ฒคํธ๋ etcd์ ๊ธฐ๋ก๋์ด ๋ณด์กด๋๋ฉฐ ํด๋ฌ์คํฐ์ ์ด๋ค ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง์ ๋ํ ๋์ ์ฐจ์์ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ค. ๋ชจ๋ ์ด๋ฒคํธ์ ๋ชฉ๋ก์ ๋ณด๋ ค๋ฉด ๋ค์ ๋ช
๋ น์ ์คํํ๋ค.
kubectl get events
๊ทธ๋ฐ๋ฐ ์ด๋ฒคํธ๋ ๋ค์์คํ์ด์ค ์ค์ฝํ ๊ฐ์ฒด๋ผ๋ ๊ฒ์ ๊ธฐ์ตํด์ผ ํ๋ค. ์ฆ ๋ค์์คํ์ด์ค ์ค์ฝํ ๊ฐ์ฒด์ ๋ํ ์ด๋ฒคํธ(์: my-namespace
๋ค์์คํ์ด์ค์ ํ๋์ ์ด๋ค ์ผ์ด ๋ฐ์ํ๋์ง)๊ฐ ๊ถ๊ธํ๋ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ด ์ปค๋งจ๋์ ๋ค์์คํ์ด์ค๋ฅผ ๋ช
์ํด์ผ ํ๋ค.
kubectl get events --namespace=my-namespace
๋ชจ๋ ๋ค์์คํ์ด์ค์ ๋ํ ์ด๋ฒคํธ๋ฅผ ๋ณด๋ ค๋ฉด, --all-namespaces
์ธ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
kubectl describe pod
๋ช
๋ น ์ธ์๋, kubectl get pod
์ด์์ ์ ๋ณด๋ฅผ ์ป๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ kubectl get pod
๋ช
๋ น์ ์ถ๋ ฅ ํ์ ํ๋๊ทธ -o yaml
์ธ์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด๋ค. ์ด๋ ๊ฒ ํ๋ฉด kubectl describe pod
๋ช
๋ น๋ณด๋ค ๋ ๋ง์ ์ ๋ณด, ์์ฒ์ ์ผ๋ก๋ ์์คํ
์ด ํ๋์ ๋ํด ์๊ณ ์๋ ๋ชจ๋ ์ ๋ณด๋ฅผ YAML ํ์์ผ๋ก ๋ณผ ์ ์๋ค. ์ฌ๊ธฐ์ ์ด๋
ธํ
์ด์
(๋ ์ด๋ธ ์ ํ์ด ์๋ ํค-๋ฐธ๋ฅ ๋ฉํ๋ฐ์ดํฐ์ด๋ฉฐ, ์ฟ ๋ฒ๋คํฐ์ค ์์คํ
๊ตฌ์ฑ ์์๊ฐ ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํจ), ์ฌ์์ ์ ์ฑ
, ํฌํธ, ๋ณผ๋ฅจ๊ณผ ๊ฐ์ ์ ๋ณด๋ฅผ ๋ณผ ์ ์์ ๊ฒ์ด๋ค.
kubectl get pod nginx-deployment-1006230814-6winp -o yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: "2022-02-17T21:51:01Z"
generateName: nginx-deployment-67d4bdd6f5-
labels:
app: nginx
pod-template-hash: 67d4bdd6f5
name: nginx-deployment-67d4bdd6f5-w6kd7
namespace: default
ownerReferences:
- apiVersion: apps/v1
blockOwnerDeletion: true
controller: true
kind: ReplicaSet
name: nginx-deployment-67d4bdd6f5
uid: 7d41dfd4-84c0-4be4-88ab-cedbe626ad82
resourceVersion: "1364"
uid: a6501da1-0447-4262-98eb-c03d4002222e
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: nginx
ports:
- containerPort: 80
protocol: TCP
resources:
limits:
cpu: 500m
memory: 128Mi
requests:
cpu: 500m
memory: 128Mi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: kube-api-access-bgsgp
readOnly: true
dnsPolicy: ClusterFirst
enableServiceLinks: true
nodeName: kube-worker-1
preemptionPolicy: PreemptLowerPriority
priority: 0
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
serviceAccount: default
serviceAccountName: default
terminationGracePeriodSeconds: 30
tolerations:
- effect: NoExecute
key: node.kubernetes.io/not-ready
operator: Exists
tolerationSeconds: 300
- effect: NoExecute
key: node.kubernetes.io/unreachable
operator: Exists
tolerationSeconds: 300
volumes:
- name: kube-api-access-bgsgp
projected:
defaultMode: 420
sources:
- serviceAccountToken:
expirationSeconds: 3607
path: token
- configMap:
items:
- key: ca.crt
path: ca.crt
name: kube-root-ca.crt
- downwardAPI:
items:
- fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
path: namespace
status:
conditions:
- lastProbeTime: null
lastTransitionTime: "2022-02-17T21:51:01Z"
status: "True"
type: Initialized
- lastProbeTime: null
lastTransitionTime: "2022-02-17T21:51:06Z"
status: "True"
type: Ready
- lastProbeTime: null
lastTransitionTime: "2022-02-17T21:51:06Z"
status: "True"
type: ContainersReady
- lastProbeTime: null
lastTransitionTime: "2022-02-17T21:51:01Z"
status: "True"
type: PodScheduled
containerStatuses:
- containerID: containerd://5403af59a2b46ee5a23fb0ae4b1e077f7ca5c5fb7af16e1ab21c00e0e616462a
image: docker.io/library/nginx:latest
imageID: docker.io/library/nginx@sha256:2834dc507516af02784808c5f48b7cbe38b8ed5d0f4837f16e78d00deb7e7767
lastState: {}
name: nginx
ready: true
restartCount: 0
started: true
state:
running:
startedAt: "2022-02-17T21:51:05Z"
hostIP: 192.168.0.113
phase: Running
podIP: 10.88.0.3
podIPs:
- ip: 10.88.0.3
- ip: 2001:db8::1
qosClass: Guaranteed
startTime: "2022-02-17T21:51:01Z"
ํ๋์ ๋ก๊ทธ ํ์ธํ๊ธฐ
๋จผ์ , ํ์ธํ๊ณ ์ ํ๋ ์ปจํ ์ด๋์ ๋ก๊ทธ๋ฅผ ํ์ธํ๋ค.
kubectl logs ${POD_NAME} ${CONTAINER_NAME}
๋ง์ฝ ์ปจํ ์ด๋๊ฐ ์ด์ ์ ํฌ๋์ ๋์๋ค๋ฉด, ๋ค์์ ๋ช ๋ น์ ํตํด ์ปจํ ์ด๋์ ํฌ๋์ ๋ก๊ทธ๋ฅผ ์ดํด๋ณผ ์ ์๋ค.
kubectl logs --previous ${POD_NAME} ${CONTAINER_NAME}
exec๋ฅผ ํตํด ์ปจํ ์ด๋ ๋๋ฒ๊น ํ๊ธฐ
๋ง์ฝ ์ปจํ
์ด๋ ์ด๋ฏธ์ง์
๋๋ฒ๊น
๋๊ตฌ๊ฐ ํฌํจ๋์ด ์๋ค๋ฉด, kubectl exec
์ ํตํด ํน์ ์ปจํ
์ด๋์์ ํด๋น ๋ช
๋ น๋ค์
์คํํ ์ ์๋ค. (๋ฆฌ๋
์ค๋ ์๋์ฐ OS๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ง ์ด๋ฏธ์ง์๋ ๋๋ถ๋ถ ๋๋ฒ๊น
๋๊ตฌ๋ฅผ ํฌํจํ๊ณ
์๋ค.)
kubectl exec ${POD_NAME} -c ${CONTAINER_NAME} -- ${CMD} ${ARG1} ${ARG2} ... ${ARGN}
์ฐธ๊ณ :
-c ${CONTAINER_NAME}
์ธ์๋ ์ ํ์ ์ด๋ค. ๋ง์ฝ ํ๋์ ์ปจํ
์ด๋๋ง ํฌํจ๋ ํ๋๋ผ๋ฉด ํด๋น ์ต์
์ ์๋ตํ ์ ์๋ค.์๋ฅผ ๋ค์ด, ๋์ ์ค์ธ ์นด์ฐ๋๋ผ ํ๋์ ๋ก๊ทธ๋ฅผ ์ดํด๋ณด๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ ๋ช ๋ น์ ์คํํ ์ ์๋ค.
kubectl exec cassandra -- cat /var/log/cassandra/system.log
kubectl exec
์ -i
์ -t
์ต์
์ ์ฌ์ฉํด์ ํฐ๋ฏธ๋์์ ์ ๊ทผํ ์ ์๋ ์์ ์คํ์ํฌ ์๋ ์๋ค.
์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
kubectl exec -it cassandra -- sh
๋์ฑ ์์ธํ ๋ด์ฉ์ ๋์์ค์ธ ์ปจํ ์ด๋์ ์์ ์ ๊ทผํ๊ธฐ๋ฅผ ์ฐธ๊ณ ํ๋ค.
์์(ephemeral) ๋๋ฒ๊ทธ ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํด์ ๋๋ฒ๊น ํ๊ธฐ
Kubernetes v1.25 [stable]
์ปจํ
์ด๋๊ฐ ํฌ๋์ ๋๊ฑฐ๋
distroless ์ด๋ฏธ์ง์ฒ๋ผ
์ปจํ
์ด๋ ์ด๋ฏธ์ง์ ๋๋ฒ๊น
๋๊ตฌ๋ฅผ ํฌํจํ๊ณ ์์ง ์์ kubectl exec
๋ก๋ ์ถฉ๋ถํ์ง ์์ ๊ฒฝ์ฐ์๋
์์(Ephemeral) ์ปจํ
์ด๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด
์ธํฐ๋ํฐ๋ธํ ํธ๋ฌ๋ธ์ํ
์ ์ ์ฉํ๋ค.
์์ ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ ๋๋ฒ๊น ์์
kubectl debug
๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํด์ ๋์ ์ค์ธ ํ๋์ ์์ ์ปจํ
์ด๋๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
๋จผ์ , ๋ค์๊ณผ ๊ฐ์ด ํ๋๋ฅผ ์ถ๊ฐํ๋ค.
kubectl run ephemeral-demo --image=registry.k8s.io/pause:3.1 --restart=Never
์ด ์น์
์ ์์์์๋ ๋๋ฒ๊น
๋๊ตฌ๊ฐ ํฌํจ๋์ง ์์ ์ด๋ฏธ์ง์ ์ฌ๋ก๋ฅผ ๋ณด์ฌ๋๋ฆฌ๊ธฐ ์ํด
pause
์ปจํ
์ด๋ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋๋ฐ, ์ด ๋์ ์ด๋ ํ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํด๋
๋ ๊ฒ์ด๋ค.
๋ง์ฝ kubectl exec
์ ํตํด ์์ ์์ฑํ๋ ค ํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ์๋ฌ๋ฅผ
ํ์ธํ ์ ์์ ํ
๋ฐ, ๊ทธ ์ด์ ๋ ์ด ์ด๋ฏธ์ง์ ์์ด ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
kubectl exec -it ephemeral-demo -- sh
OCI runtime exec failed: exec failed: container_linux.go:346: starting container process caused "exec: \"sh\": executable file not found in $PATH": unknown
์ด ๋ช
๋ น์ด ๋์ kubectl debug
์ ์ฌ์ฉํด์ ๋๋ฒ๊น
์ปจํ
์ด๋๋ฅผ ์์ฑํ ์ ์๋ค.
๋ง์ฝ -i
/--interactive
์ธ์๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, kubectl
์ ์์
์ปจํ
์ด๋์ ์ฝ์์ ์๋์ผ๋ก ์ฐ๊ฒฐํ ๊ฒ์ด๋ค.
kubectl debug -it ephemeral-demo --image=busybox --target=ephemeral-demo
Defaulting debug container name to debugger-8xzrl.
If you don't see a command prompt, try pressing enter.
/ #
์ด ๋ช
๋ น์ด๋ ์๋ก์ด busybox ์ปจํ
์ด๋๋ฅผ ์ถ๊ฐํ๊ณ ํด๋น ์ปจํ
์ด๋๋ก ์ฐ๊ฒฐํ๋ค. --target
ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค๋ฅธ ์ปจํ
์ด๋์ ํ๋ก์ธ์ค ๋ค์์คํ์ด์ค๋ฅผ ๋์์ผ๋ก ํ๊ฒ ๋๋ค. ์ฌ๊ธฐ์๋
์ด ์ต์
์ด ๊ผญ ํ์ํ๋ฐ, kubectl run
์ด ์์ฑํ๋ ํ๋์ ๋ํด
ํ๋ก์ธ์ค ๋ค์์คํ์ด์ค ๊ณต์ ๋ฅผ
ํ์ฑํํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ฐธ๊ณ :
--target
ํ๋ผ๋ฏธํฐ๋ ์ฌ์ฉ ์ค์ธ
์ปจํ
์ด๋ ๋ฐํ์์์
์ง์ํด์ผ์ง๋ง ์ฌ์ฉํ ์ ์๋ค. ๋ง์ผ ์ง์๋์ง ์๋๋ค๋ฉด,
์์ ์ปจํ
์ด๋๊ฐ ์์๋์ง ์์ ์ ์๊ฑฐ๋ ๋
๋ฆฝ์ ์ธ ํ๋ก์ธ์ค
๋ค์์คํ์ด์ค๋ฅผ ๊ฐ์ง๊ณ ์์๋ ์ ์๋ค.kubectl describe
๋ช
๋ น์ ์ฌ์ฉํ๋ฉด ์๋กญ๊ฒ ์์ฑ๋ ์์ ์ปจํ
์ด๋์ ์ํ๋ฅผ ํ์ธํ ์ ์๋ค.
kubectl describe pod ephemeral-demo
...
Ephemeral Containers:
debugger-8xzrl:
Container ID: docker://b888f9adfd15bd5739fefaa39e1df4dd3c617b9902082b1cfdc29c4028ffb2eb
Image: busybox
Image ID: docker-pullable://busybox@sha256:1828edd60c5efd34b2bf5dd3282ec0cc04d47b2ff9caa0b6d4f07a21d1c08084
Port: <none>
Host Port: <none>
State: Running
Started: Wed, 12 Feb 2020 14:25:42 +0100
Ready: False
Restart Count: 0
Environment: <none>
Mounts: <none>
...
๋๋ฒ๊น
์ด ๋ค ๋๋๋ฉด kubectl delete
์ ํตํด ํ๋๋ฅผ ์ ๊ฑฐํ ์ ์๋ค.
kubectl delete pod ephemeral-demo
ํ๋์ ๋ณต์ ๋ณธ์ ์ด์ฉํด์ ๋๋ฒ๊น ํ๊ธฐ
๋๋๋ก ํ๋์ ์ค์ ์ต์
์ ๋ฐ๋ผ ํน์ ์ํฉ์์ ํธ๋ฌ๋ธ์ํ
์ ํ๊ธฐ๊ฐ ์ด๋ ค์ธ ์ ์๋ค.
์๋ฅผ ๋ค์ด, ๋ง์ผ ์ฌ๋ฌ๋ถ์ ์ปจํ
์ด๋ ์ด๋ฏธ์ง๊ฐ ์์ ํฌํจํ๊ณ ์์ง ์๊ฑฐ๋, ์ฌ๋ฌ๋ถ์
์ ํ๋ฆฌ์ผ์ด์
์ด ์ปจํ
์ด๋ ์์์์ ํฌ๋์๊ฐ ๋ฐ์ํ๋ค๋ฉด kubectl exec
์ ์ด์ฉํด์
์ปจํ
์ด๋๋ฅผ ํธ๋ฌ๋ธ์ํ
ํ ์ ์์ ์ ์๋ค. ์ด๋ฌํ ์ํฉ์์๋ kubectl debug
์ ์ฌ์ฉํด์
ํ๋์ ๋ณต์ ๋ณธ์ ๋๋ฒ๊น
์ ์ํ ์ถ๊ฐ์ ์ธ ์ค์ ์ต์
๊ณผ ํจ๊ป ์์ฑํ ์ ์๋ค.
์ ์ปจํ ์ด๋์ ํจ๊ป ํ๋์ ๋ณต์ ๋ณธ ์์ฑํ๊ธฐ
๋ง์ผ ์ฌ๋ฌ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋์์ ํ๊ณ ์์ง๋ง ์์๊ณผ๋ ๋ค๋ฅด๊ฒ ๋์ํ๋ ๊ฒฝ์ฐ, ํ๋์ ๋ณต์ ๋ณธ์ ์๋ก์ด ์ปจํ ์ด๋๋ฅผ ์ถ๊ฐํจ์ผ๋ก์จ ์ถ๊ฐ์ ์ธ ํธ๋ฌ๋ธ์ํ ๋๊ตฌ๋ค์ ํ๋์ ํจ๊ป ์ถ๊ฐํ ์ ์๋ค.
๊ฐ๋ น, ์ฌ๋ฌ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์
์ปจํ
์ด๋ ์ด๋ฏธ์ง๋ busybox
๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๊ณ ์๋๋ฐ
์ฌ๋ฌ๋ถ์ busybox
์๋ ์๋ ๋๋ฒ๊น
๋๊ตฌ๋ฅผ ํ์๋ก ํ๋ค๊ณ ๊ฐ์ ํด ๋ณด์. ์ด๋ฌํ
์๋๋ฆฌ์ค๋ kubectl run
๋ช
๋ น์ ํตํด ์๋ฎฌ๋ ์ด์
ํด๋ณผ ์ ์๋ค.
kubectl run myapp --image=busybox --restart=Never -- sleep 1d
๋ค์์ ๋ช
๋ น์ ์คํ์์ผ ๋๋ฒ๊น
์ ์ํ ์๋ก์ด ์ฐ๋ถํฌ ์ปจํ
์ด๋์ ํจ๊ป myapp-debug
์ด๋
์ด๋ฆ์ myapp
์ปจํ
์ด๋ ๋ณต์ ๋ณธ์ ์์ฑํ ์ ์๋ค.
kubectl debug myapp -it --image=ubuntu --share-processes --copy-to=myapp-debug
Defaulting debug container name to debugger-w7xmf.
If you don't see a command prompt, try pressing enter.
root@myapp-debug:/#
์ฐธ๊ณ :
- ๋ง์ผ ์ฌ๋ฌ๋ถ์ด ์๋ก ์์ฑ๋๋ ์ปจํ
์ด๋์ ์ด๋ฆ์
--container
ํ๋๊ทธ์ ํจ๊ป ์ง์ ํ์ง ์๋๋ค๋ฉด,kubectl debug
๋ ์๋์ผ๋ก ์๋ก์ด ์ปจํ ์ด๋ ์ด๋ฆ์ ์์ฑํ๋ค. -i
ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ๋ฉดkubectl debug
๋ช ๋ น์ด ์๋ก์ด ์ปจํ ์ด๋์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฐ๊ฒฐ๋๊ฒ ๋๋ค. ์ด๋ฌํ ๋์์--attach=false
์ ์ง์ ํ์ฌ ๋ฐฉ์งํ ์ ์๋ค. ๋ง์ผ ์ฌ๋ฌ๋ถ์ ์ธ์ ์ด ์ฐ๊ฒฐ์ด ๋์ด์ง๋ค๋ฉดkubectl attach
๋ฅผ ์ฌ์ฉํด์ ๋ค์ ์ฐ๊ฒฐํ ์ ์๋ค.--share-processes
์ต์ ์ ์ด ํ๋์ ์๋ ์ปจํ ์ด๋๊ฐ ํด๋น ํ๋์ ์ํ ๋ค๋ฅธ ์ปจํ ์ด๋์ ํ๋ก์ธ์ค๋ฅผ ๋ณผ ์ ์๋๋ก ํ๋ค. ์ด ์ต์ ์ด ์ด๋ป๊ฒ ๋์ํ๋์ง์ ๋ํด ๋ ์์๋ณด๊ธฐ ์ํด์๋ ๋ค์์ ํ๋์ ์ปจํ ์ด๋ ๊ฐ ํ๋ก์ธ์ค ๋ค์์คํ์ด์ค ๊ณต์ ๋ฅผ ์ฐธ๊ณ ํ๋ผ.
์ฌ์ฉ์ด ๋ชจ๋ ๋๋๋ฉด, ๋๋ฒ๊น ์ ์ฌ์ฉ๋ ํ๋๋ฅผ ์์ง ๋ง๊ณ ์ ๋ฆฌํ๋ค.
kubectl delete pod myapp myapp-debug
๋ช ๋ น์ด๋ฅผ ๋ณ๊ฒฝํ๋ฉฐ ํ๋์ ๋ณต์ ๋ณธ ์์ฑํ๊ธฐ
๋๋๋ก ์ปจํ ์ด๋์ ๋ช ๋ น์ด๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์ ์ฉํ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ, ์๋ฅผ ๋ค๋ฉด ๋๋ฒ๊ทธ ํ๋๊ทธ๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ํฌ๋์ ๋๋ ๊ฒฝ์ฐ์ด๋ค.
๋ค์์ kubectl run
๋ช
๋ น์ ํตํด ์ฆ๊ฐ์ ์ผ๋ก ํฌ๋์๊ฐ ๋ฐ์ํ๋ ์ ํ๋ฆฌ์ผ์ด์
์
์ฌ๋ก๋ฅผ ์๋ฎฌ๋ ์ด์
ํด ๋ณผ ์ ์๋ค.
kubectl run --image=busybox myapp -- false
kubectl describe pod myapp
๋ช
๋ น์ ํตํด ์ด ์ปจํ
์ด๋์ ํฌ๋์๊ฐ ๋ฐ์ํ๊ณ ์์์ ํ์ธํ ์ ์๋ค.
Containers:
myapp:
Image: busybox
...
Args:
false
State: Waiting
Reason: CrashLoopBackOff
Last State: Terminated
Reason: Error
Exit Code: 1
์ด๋ฌํ ๊ฒฝ์ฐ์ kubectl debug
์ ํตํด ๋ช
๋ น์ด๋ฅผ ์ง์ ํจ์ผ๋ก์จ ํด๋น ํ๋์
๋ณต์ ๋ณธ์ ์ธํฐ๋ํฐ๋ธ ์๋ก ์์ฑํ ์ ์๋ค.
kubectl debug myapp -it --copy-to=myapp-debug --container=myapp -- sh
If you don't see a command prompt, try pressing enter.
/ #
์ด์ ์ธํฐ๋ํฐ๋ธ ์์ ์ ๊ทผํ ์ ์์ผ๋ ํ์ผ ์์คํ ๊ฒฝ๋ก๋ฅผ ํ์ธํ๊ฑฐ๋ ๋์ ์ค์ธ ์ปจํ ์ด๋์ ๋ช ๋ น์ด๋ฅผ ์ง์ ํ์ธํ๋ ๋ฑ์ ์์ ์ด ๊ฐ๋ฅํ๋ค.
์ฐธ๊ณ :
- ํน์ ์ปจํ
์ด๋์ ๋ช
๋ น์ด๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ํด์๋
--container
์ต์ ์ ํตํด ํด๋น ์ปจํ ์ด๋์ ์ด๋ฆ์ ์ง์ ํด์ผ๋ง ํ๋ค. ์ด๋ฆ์ ์ง์ ํ์ง ์๋๋ค๋ฉดkubectl debug
์ ์ด์ ์ ์ง์ ํ ๋ช ๋ น์ด๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํด์ ์ปจํ ์ด๋๋ฅผ ์์ฑํ ๊ฒ์ด๋ค. - ๊ธฐ๋ณธ์ ์ผ๋ก
-i
ํ๋๊ทธ๋kubectl debug
๋ช ๋ น์ด ์ปจํ ์ด๋์ ๋ฐ๋ก ์ฐ๊ฒฐ๋๋๋ก ํ๋ค. ์ด๋ฌํ ๋์์ ๋ฐฉ์งํ๊ธฐ ์ํด์๋--attach=false
์ต์ ์ ์ง์ ํ ์ ์๋ค. ๋ง์ฝ ์ฌ๋ฌ๋ถ์ด ์ธ์ ์ด ์ข ๋ฃ๋๋ค๋ฉดkubectl attach
๋ช ๋ น์ ํตํด ๋ค์ ์ฐ๊ฒฐํ ์ ์๋ค.
์ฌ์ฉ์ด ๋ชจ๋ ๋๋๋ฉด, ๋๋ฒ๊น ์ ์ฌ์ฉ๋ ํ๋๋ค์ ์์ง ๋ง๊ณ ์ ๋ฆฌํ๋ค.
kubectl delete pod myapp myapp-debug
์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ๋ณ๊ฒฝํ๋ฉฐ ํ๋์ ๋ณต์ ๋ณธ ์์ฑํ๊ธฐ
ํน์ ํ ๊ฒฝ์ฐ์ ์ฌ๋ฌ๋ถ์ ์ ๋๋ก ๋์ํ์ง ์๋ ํ๋์ ์ด๋ฏธ์ง๋ฅผ ๊ธฐ์กด ํ๋ก๋์ ์ปจํ ์ด๋ ์ด๋ฏธ์ง์์ ๋๋ฒ๊น ๋น๋๋ ์ถ๊ฐ์ ์ธ ๋๊ตฌ๋ฅผ ํฌํจํ ์ด๋ฏธ์ง๋ก ๋ณ๊ฒฝํ๊ณ ์ถ์ ์ ์๋ค.
์ด ์ฌ๋ก๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด kubectl run
๋ช
๋ น์ ํตํด ํ๋๋ฅผ ์์ฑํ์๋ค.
kubectl run myapp --image=busybox --restart=Never -- sleep 1d
์ฌ๊ธฐ์๋ kubectl debug
๋ช
๋ น์ ํตํด ํด๋น ์ปจํ
์ด๋ ์ด๋ฏธ์ง๋ฅผ ubuntu
๋ก ๋ณ๊ฒฝํ๋ฉฐ
๋ณต์ ๋ณธ์ ์์ฑํ์๋ค.
kubectl debug myapp --copy-to=myapp-debug --set-image=*=ubuntu
--set-image
์ ๋ฌธ๋ฒ์ kubectl set image
์ ๋์ผํ๊ฒ container_name=image
ํ์์ ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ค. *=ubuntu
๋ผ๋ ์๋ฏธ๋ ๋ชจ๋ ์ปจํ
์ด๋์ ์ด๋ฏธ์ง๋ฅผ ubuntu
๋ก
๋ณ๊ฒฝํ๊ฒ ๋ค๋ ์๋ฏธ์ด๋ค.
์ฌ์ฉ์ด ๋ชจ๋ ๋๋๋ฉด, ๋๋ฒ๊น ์ ์ฌ์ฉ๋ ํ๋๋ฅผ ์์ง ๋ง๊ณ ์ ๋ฆฌํ๋ค.
kubectl delete pod myapp myapp-debug
๋ ธ๋์ ์์ ์ฌ์ฉํด์ ๋๋ฒ๊น ํ๊ธฐ
๋ง์ฝ ์์ ์ด๋ ํ ๋ฐฉ๋ฒ๋ ์ฌ์ฉํ ์ ์๋ค๋ฉด, ํ๋๊ฐ ํ์ฌ ๋์ ์ค์ธ ๋
ธ๋๋ฅผ ์ฐพ์
ํด๋น ๋
ธ๋์์ ์คํ๋๋ ํ๋๋ฅผ ์์ฑํ ์ ์๋ค.
๋ค์ kubectl debug
๋ช
๋ น์ ํตํด ํด๋น ๋
ธ๋์์ ์ธํฐ๋ํฐ๋ธํ ์์ ์์ฑํ ์ ์๋ค.
kubectl debug node/mynode -it --image=ubuntu
Creating debugging pod node-debugger-mynode-pdx84 with container debugger on node mynode.
If you don't see a command prompt, try pressing enter.
root@ek8s:/#
๋ ธ๋์์ ๋๋ฒ๊น ์ธ์ ์ ์์ฑํ ๋ ์ ์ํด์ผ ํ ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
kubectl debug
๋ ๋ ธ๋์ ์ด๋ฆ์ ๊ธฐ๋ฐํด ์๋ก์ด ํ๋์ ์ด๋ฆ์ ์๋์ผ๋ก ์์ฑํ๋ค.- ๋
ธ๋์ ๋ฃจํธ ํ์ผ์์คํ
์
/host
์ ๋ง์ดํธ๋๋ค. - ํ๋๊ฐ ํน๊ถ์ ๊ฐ์ง๊ณ ์์ง ์๋๋ผ๋, ์ปจํ
์ด๋๋ ํธ์คํธ ๋ค์์คํ์ด์ค(IPC, ๋คํธ์ํฌ, PID ๋ค์์คํ์ด์ค)์์ ๋์ํ๋ค. ๋ฐ๋ผ์ ๋ช๋ช ํ๋ก์ธ์ค ์ ๋ณด๋ฅผ ์ฝ์ด์ค๊ฑฐ๋,
chroot /host
๋ฑ์ ์์ ์ ์ํ๋ ์ ์๋ค. - ํน๊ถ์ ๊ฐ์ง ํ๋๊ฐ ํ์ํ ๊ฒฝ์ฐ์๋ ์ง์ ์์ฑํ๋ค.
์ฌ์ฉ์ด ๋ชจ๋ ๋๋๋ฉด, ๋๋ฒ๊น ์ ์ฌ์ฉ๋ ํ๋๋ฅผ ์์ง ๋ง๊ณ ์ ๋ฆฌํ๋ค.
kubectl delete pod node-debugger-mynode-pdx84