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}

์˜ˆ๋ฅผ ๋“ค์–ด, ๋™์ž‘ ์ค‘์ธ ์นด์‚ฐ๋“œ๋ผ ํŒŒ๋“œ์˜ ๋กœ๊ทธ๋ฅผ ์‚ดํŽด๋ณด๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

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์ด ์ƒ์„ฑํ•˜๋Š” ํŒŒ๋“œ์— ๋Œ€ํ•ด ํ”„๋กœ์„ธ์Šค ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ณต์œ ๋ฅผ ํ™œ์„ฑํ™”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

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:/#

์‚ฌ์šฉ์ด ๋ชจ๋‘ ๋๋‚˜๋ฉด, ๋””๋ฒ„๊น…์— ์‚ฌ์šฉ๋œ ํŒŒ๋“œ๋ฅผ ์žŠ์ง€ ๋ง๊ณ  ์ •๋ฆฌํ•œ๋‹ค.

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.
/ #

์ด์ œ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ์‰˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ฒฝ๋กœ๋ฅผ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ๋™์ž‘ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ์˜ ๋ช…๋ น์–ด๋ฅผ ์ง์ ‘ ํ™•์ธํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์‚ฌ์šฉ์ด ๋ชจ๋‘ ๋๋‚˜๋ฉด, ๋””๋ฒ„๊น…์— ์‚ฌ์šฉ๋œ ํŒŒ๋“œ๋“ค์„ ์žŠ์ง€ ๋ง๊ณ  ์ •๋ฆฌํ•œ๋‹ค.

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
์ตœ์ข… ์ˆ˜์ • September 23, 2022 at 11:12 AM PST: [ko] Update outdate files in dev-1.25-ko.1 (M74-M89) (2aafb85f6d)