Skip to content

Commit d82193b

Browse files
ptuxnasa9084
andauthored
[ja] Translate tasks/debug-application-cluster/debug-running-pod into Japanese (#31023)
* first commit on 12/19 * done * Update content/ja/docs/tasks/debug-application-cluster/debug-running-pod.md Co-authored-by: nasa9084 <[email protected]> * Update content/ja/docs/tasks/debug-application-cluster/debug-running-pod.md Co-authored-by: nasa9084 <[email protected]> * Update content/ja/docs/tasks/debug-application-cluster/debug-running-pod.md Co-authored-by: nasa9084 <[email protected]> * fix * minior change Co-authored-by: nasa9084 <[email protected]>
1 parent 476e068 commit d82193b

File tree

1 file changed

+279
-0
lines changed

1 file changed

+279
-0
lines changed
Lines changed: 279 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,279 @@
1+
---
2+
title: 実行中のPodのデバッグ
3+
content_type: task
4+
---
5+
6+
<!-- overview -->
7+
8+
このページでは、ノード上で動作している(またはクラッシュしている)Podをデバッグする方法について説明します。
9+
10+
11+
## {{% heading "prerequisites" %}}
12+
13+
14+
* あなたの{{< glossary_tooltip text="Pod" term_id="pod" >}}は既にスケジュールされ、実行されているはずです。Pod がまだ実行されていない場合は、[Troubleshoot Applications](/docs/tasks/debug-application-cluster/debug-application/) から始めてください。
15+
16+
* いくつかの高度なデバッグ手順では、Podがどのノードで動作しているかを知り、そのノードでコマンドを実行するためのシェルアクセス権を持っていることが必要です。`kubectl` を使用する標準的なデバッグ手順の実行には、そのようなアクセスは必要ではありません。
17+
18+
19+
20+
<!-- steps -->
21+
22+
## Podログを調べます {#examine-pod-logs}
23+
24+
まず、影響を受けるコンテナのログを見ます。
25+
26+
```shell
27+
kubectl logs ${POD_NAME} ${CONTAINER_NAME}
28+
```
29+
30+
コンテナが以前にクラッシュしたことがある場合、以前のコンテナのクラッシュログにアクセスすることができます。
31+
32+
```shell
33+
kubectl logs --previous ${POD_NAME} ${CONTAINER_NAME}
34+
```
35+
36+
## container execによるデバッグ {#container-exec}
37+
38+
もし{{< glossary_tooltip text="container image" term_id="image" >}}がデバッグユーティリティを含んでいれば、LinuxやWindows OSのベースイメージからビルドしたイメージのように、`kubectl exec` で特定のコンテナ内でコマンドを実行することが可能です。
39+
40+
```shell
41+
kubectl exec ${POD_NAME} -c ${CONTAINER_NAME} -- ${CMD} ${ARG1} ${ARG2} ... ${ARGN}
42+
```
43+
44+
{{< note >}}
45+
`-c ${CONTAINER_NAME}`は省略可能です。コンテナを1つだけ含むPodの場合は省略できます。
46+
{{< /note >}}
47+
48+
例として、実行中のCassandra Podからログを見るには、次のように実行します。
49+
50+
```shell
51+
kubectl exec cassandra -- cat /var/log/cassandra/system.log
52+
```
53+
54+
例えば`kubectl exec``-i``-t`引数を使って、端末に接続されたシェルを実行することができます。
55+
56+
```shell
57+
kubectl exec -it cassandra -- sh
58+
```
59+
60+
詳しくは、[実行中のコンテナのシェルを取得する](/docs/tasks/debug-application-cluster/get-shell-running-container/)を参照してください。
61+
62+
## エフェメラルコンテナによるデバッグ {#ephemeral-container}
63+
64+
{{< feature-state state="beta" for_k8s_version="v1.23" >}}
65+
66+
{{< glossary_tooltip text="エフェメラルコンテナ" term_id="ephemeral-container" >}}は、コンテナがクラッシュしたり、コンテナイメージにデバッグユーティリティが含まれていないなどの理由で`kubectl exec`が不十分な場合に、対話的にトラブルシューティングを行うのに便利です([ディストロ・イメージ](
67+
https://github.com/GoogleContainerTools/distroless)の場合など)。
68+
69+
### エフェメラルコンテナを使用したデバッグ例 {#ephemeral-container-example}
70+
71+
実行中のPodにエフェメラルコンテナを追加するには、`kubectl debug`コマンドを使用することができます。
72+
まず、サンプル用のPodを作成します。
73+
74+
```shell
75+
kubectl run ephemeral-demo --image=k8s.gcr.io/pause:3.1 --restart=Never
76+
```
77+
78+
このセクションの例では、デバッグユーティリティが含まれていない`pause`コンテナイメージを使用していますが、この方法はすべてのコンテナイメージで動作します。
79+
80+
もし、`kubectl exec`を使用してシェルを作成しようとすると、このコンテナイメージにはシェルが存在しないため、エラーが表示されます。
81+
82+
```shell
83+
kubectl exec -it ephemeral-demo -- sh
84+
```
85+
86+
```
87+
OCI runtime exec failed: exec failed: container_linux.go:346: starting container process caused "exec: \"sh\": executable file not found in $PATH": unknown
88+
```
89+
90+
代わりに、`kubectl debug` を使ってデバッグ用のコンテナを追加することができます。
91+
引数に`-i`/`--interactive`を指定すると、`kubectl`は自動的にエフェメラルコンテナのコンソールにアタッチされます。
92+
93+
```shell
94+
kubectl debug -it ephemeral-demo --image=busybox --target=ephemeral-demo
95+
```
96+
97+
```
98+
Defaulting debug container name to debugger-8xzrl.
99+
If you don't see a command prompt, try pressing enter.
100+
/ #
101+
```
102+
103+
このコマンドは新しいbusyboxコンテナを追加し、それにアタッチします。`target`パラメーターは、他のコンテナのプロセス名前空間をターゲットにします。これは`kubectl run`が作成するPodで[process namespace sharing](/docs/tasks/configure-pod-container/share-process-namespace/)を有効にしないため、指定する必要があります。
104+
105+
{{< note >}}
106+
`target` パラメーターは {{< glossary_tooltip text="Container Runtime" term_id="container-runtime" >}} でサポートされている必要があります。サポートされていない場合、エフェメラルコンテナは起動されないか、`ps`が他のコンテナ内のプロセスを表示しないように孤立したプロセス名前空間を使用して起動されます。
107+
{{< /note >}}
108+
109+
新しく作成されたエフェメラルコンテナの状態は`kubectl describe`を使って見ることができます。
110+
111+
```shell
112+
kubectl describe pod ephemeral-demo
113+
```
114+
115+
```
116+
...
117+
Ephemeral Containers:
118+
debugger-8xzrl:
119+
Container ID: docker://b888f9adfd15bd5739fefaa39e1df4dd3c617b9902082b1cfdc29c4028ffb2eb
120+
Image: busybox
121+
Image ID: docker-pullable://busybox@sha256:1828edd60c5efd34b2bf5dd3282ec0cc04d47b2ff9caa0b6d4f07a21d1c08084
122+
Port: <none>
123+
Host Port: <none>
124+
State: Running
125+
Started: Wed, 12 Feb 2020 14:25:42 +0100
126+
Ready: False
127+
Restart Count: 0
128+
Environment: <none>
129+
Mounts: <none>
130+
...
131+
```
132+
133+
終了したら`kubectl delete`を使ってPodを削除してください。
134+
135+
```shell
136+
kubectl delete pod ephemeral-demo
137+
```
138+
139+
## Podのコピーを使ったデバッグ
140+
141+
Podの設定オプションによって、特定の状況でのトラブルシューティングが困難になることがあります。
142+
例えば、コンテナイメージにシェルが含まれていない場合、またはアプリケーションが起動時にクラッシュした場合は、`kubectl exec`を実行してトラブルシューティングを行うことができません。
143+
このような状況では、`kubectl debug` を使用してデバッグを支援するために設定値を変更したPodのコピーです。
144+
145+
### 新しいコンテナを追加しながらPodをコピーします
146+
147+
新しいコンテナを追加することは、アプリケーションが動作しているが期待通りの動作をせず、トラブルシューティングユーティリティをPodに追加したい場合に便利な場合があります。
148+
例えば、アプリケーションのコンテナイメージは`busybox`上にビルドされているが、`busybox`に含まれていないデバッグユーティリティが必要な場合があります。このシナリオは `kubectl run` を使ってシミュレーションすることができます。
149+
150+
```shell
151+
kubectl run myapp --image=busybox --restart=Never -- sleep 1d
152+
```
153+
154+
このコマンドを実行すると、`myapp`のコピーに`myapp-debug`という名前が付き、デバッグ用の新しいUbuntuコンテナが追加されます。
155+
156+
```shell
157+
kubectl debug myapp -it --image=ubuntu --share-processes --copy-to=myapp-debug
158+
```
159+
160+
```
161+
Defaulting debug container name to debugger-w7xmf.
162+
If you don't see a command prompt, try pressing enter.
163+
root@myapp-debug:/#
164+
```
165+
166+
{{< note >}}
167+
* `kubectl debug``--container`フラグでコンテナ名を選択しない場合、自動的にコンテナ名を生成します。
168+
169+
* `i`フラグを指定すると、デフォルトで`kubectl debug`が新しいコンテナにアタッチされます。これを防ぐには、`--attach=false`を指定します。セッションが切断された場合は、`kubectl attach`を使用して再接続することができます。
170+
171+
* `share-processes` を指定すると、Pod 内のコンテナからプロセスを参照することができます。この仕組みについて詳しくは、[Share Process Namespace between Containers in a Pod](/docs/tasks/configure-pod-container/share-process-namespace/)を参照してください。
172+
{{< /note >}}
173+
174+
デバッグが終わったら、Podの後始末をするのを忘れないでください。
175+
176+
```shell
177+
kubectl delete pod myapp myapp-debug
178+
```
179+
180+
### Podのコマンドを変更しながらコピーします
181+
182+
デバッグフラグを追加するためや、アプリケーションがクラッシュするためなど、コンテナのコマンドを変更すると便利な場合があります。
183+
アプリケーションのクラッシュをシミュレートするには、`kubectl run`を使用して、すぐに終了するコンテナを作成します。
184+
185+
```
186+
kubectl run --image=busybox myapp -- false
187+
```
188+
189+
`kubectl describe pod myapp` を使用すると、このコンテナがクラッシュしていることがわかります。
190+
191+
```
192+
Containers:
193+
myapp:
194+
Image: busybox
195+
...
196+
Args:
197+
false
198+
State: Waiting
199+
Reason: CrashLoopBackOff
200+
Last State: Terminated
201+
Reason: Error
202+
Exit Code: 1
203+
```
204+
205+
`kubectl debug`を使うと、コマンドをインタラクティブシェルに変更したこのPodのコピーを作成することができます。
206+
207+
```
208+
kubectl debug myapp -it --copy-to=myapp-debug --container=myapp -- sh
209+
```
210+
211+
```
212+
If you don't see a command prompt, try pressing enter.
213+
/ #
214+
```
215+
216+
これで、ファイルシステムのパスのチェックやコンテナコマンドの手動実行などのタスクを実行するために使用できる対話型シェルが完成しました。
217+
218+
{{< note >}}
219+
* 特定のコンテナのコマンドを変更するには、そのコンテナ名を`--container`で指定する必要があり、そうしないと`kubectl debug`が代わりに指定したコマンドを実行する新しいコンテナを作成します。
220+
221+
* ` i` フラグは、デフォルトで `kubectl debug` がコンテナにアタッチされるようにします。これを防ぐには、`--attach=false`を指定します。セッションが切断された場合は、`kubectl attach` を使用して再接続することができます。
222+
{{< /note >}}
223+
224+
デバッグが終わったら、Podの後始末をするのを忘れないでください。
225+
226+
```shell
227+
kubectl delete pod myapp myapp-debug
228+
```
229+
230+
### コンテナイメージを変更してPodをコピーします
231+
232+
状況によっては、動作不良のPodを通常のプロダクション用のイメージから、デバッグ・ビルドや追加ユーティリティを含むイメージに変更したい場合があります。
233+
234+
例として、`kubectl run`を使用してPodを作成します。
235+
236+
```
237+
kubectl run myapp --image=busybox --restart=Never -- sleep 1d
238+
```
239+
240+
ここで、`kubectl debug`を使用してコピーを作成し、そのコンテナイメージを`ubuntu`に変更します。
241+
242+
```
243+
kubectl debug myapp --copy-to=myapp-debug --set-image=*=ubuntu
244+
```
245+
246+
`set-image`の構文は、`kubectl set image`と同じ`container_name=image`の構文を使用します。`*=ubuntu`は、全てのコンテナのイメージを`ubuntu`に変更することを意味します。
247+
248+
デバッグが終わったら、Podの後始末をするのを忘れないでください。
249+
250+
```shell
251+
kubectl delete pod myapp myapp-debug
252+
```
253+
254+
## ノード上のシェルによるデバッグ {#node-shell-session}
255+
256+
いずれの方法でもうまくいかない場合は、Podが動作しているノードを探し出し、ホストの名前空間で動作する特権Podを作成します。
257+
ノード上で `kubectl debug` を使って対話型のシェルを作成するには、以下を実行します。
258+
259+
```shell
260+
kubectl debug node/mynode -it --image=ubuntu
261+
```
262+
263+
```
264+
Creating debugging pod node-debugger-mynode-pdx84 with container debugger on node mynode.
265+
If you don't see a command prompt, try pressing enter.
266+
root@ek8s:/#
267+
```
268+
269+
ノードでデバッグセッションを作成する場合、以下の点に注意してください:
270+
271+
* `kubectl debug`はノードの名前に基づいて新しい Pod の名前を自動的に生成します。
272+
* コンテナはホストのIPC、Network、PIDネームスペースで実行されます。
273+
* ノードのルートファイルシステムは`/host`にマウントされます。
274+
275+
デバッグが終わったら、Podの後始末をするのを忘れないでください。
276+
277+
```shell
278+
kubectl delete pod node-debugger-mynode-pdx84
279+
```

0 commit comments

Comments
 (0)