@@ -22,7 +22,10 @@ Initコンテナは下記の項目をのぞいて、通常のコンテナと全
22
22
23
23
もしあるPodの単一のInitコンテナが失敗した場合、Kubeletは成功するまで何度もそのInitコンテナを再起動します。しかし、もしそのPodの` restartPolicy ` がNeverで、そのPodの起動時にInitコンテナが失敗した場合、KubernetesはそのPod全体を失敗として扱います。
24
24
25
- PodにInitコンテナを指定するためには、Podの仕様にそのアプリケーションの` containers ` 配列と並べて、` initContainers ` フィールドを[ Container] (/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#container-v1-core)型のオブジェクトの配列として指定してください。
25
+ PodにInitコンテナを指定するためには、[ Podの仕様] ( /docs/reference/kubernetes-api/workload-resources/pod-v1/#PodSpec ) に` initContainers ` フィールドを` container ` アイテムの配列として追加してください(アプリケーションの` containers ` フィールドとそのコンテンツに似ています)。
26
+ 詳細については、APIリファレンスの[ Container] ( /docs/reference/kubernetes-api/workload-resources/pod-v1/#Container ) を参照してください。
27
+
28
+
26
29
Initコンテナのステータスは、` .status.initContainerStatuses ` フィールドにコンテナのステータスの配列として返されます(` .status.containerStatuses ` と同様)。
27
30
28
31
### 通常のコンテナとの違い {#differences-from-regular-containers}
@@ -77,7 +80,7 @@ kind: Pod
77
80
metadata :
78
81
name : myapp-pod
79
82
labels :
80
- app : myapp
83
+ app.kubernetes.io/name : MyApp
81
84
spec :
82
85
containers :
83
86
- name : myapp-container
97
100
` ` ` shell
98
101
kubectl apply -f myapp.yaml
99
102
```
103
+ 実行結果は下記のようになります。
100
104
```
101
105
pod/myapp-pod created
102
106
```
@@ -105,6 +109,7 @@ pod/myapp-pod created
105
109
``` shell
106
110
kubectl get -f myapp.yaml
107
111
```
112
+ 実行結果は下記のようになります。
108
113
```
109
114
NAME READY STATUS RESTARTS AGE
110
115
myapp-pod 0/1 Init:0/2 0 6m
@@ -114,11 +119,12 @@ myapp-pod 0/1 Init:0/2 0 6m
114
119
``` shell
115
120
kubectl describe -f myapp.yaml
116
121
```
122
+ 実行結果は下記のようになります。
117
123
```
118
124
Name: myapp-pod
119
125
Namespace: default
120
126
[...]
121
- Labels: app=myapp
127
+ Labels: app.kubernetes.io/name=MyApp
122
128
Status: Pending
123
129
[...]
124
130
Init Containers:
@@ -187,6 +193,7 @@ spec:
187
193
` ` ` shell
188
194
kubectl apply -f services.yaml
189
195
` ` `
196
+ 実行結果は下記のようになります。
190
197
```
191
198
service/myservice created
192
199
service/mydb created
@@ -196,36 +203,42 @@ Initコンテナが完了し、`myapp-pod`というPodがRunning状態に移行
196
203
197
204
```shell
198
205
kubectl get -f myapp.yaml
206
+ ```
207
+ 実行結果は下記のようになります。
208
+ ```
199
209
NAME READY STATUS RESTARTS AGE
200
210
myapp-pod 1/1 Running 0 9m
201
211
```
202
212
203
- このシンプルな例を独自のInitコンテナを作成する際の参考にしてください。[ 次の項目] ( #whats -next ) にさらに詳細な使用例に関するリンクがあります。
213
+ このシンプルな例を独自のInitコンテナを作成する際の参考にしてください。[ 次の項目] ( #what-s -next ) にさらに詳細な使用例に関するリンクがあります。
204
214
205
215
## Initコンテナのふるまいに関する詳細 {#detailed-behavior}
206
216
207
- Podの起動時は各Initコンテナが起動状態となるまで、kubeletはネットワーキングおよびストレージを利用可能な状態にしません。また、kubeletはPodのspecに定義された順番に従ってPodのInitコンテナを起動します。各Initコンテナは次のInitコンテナが起動する前に正常に終了しなくてはなりません。もしあるInitコンテナがランタイムもしくはエラーにより起動失敗した場合、そのPodの` restartPolicy ` の値に従ってリトライされます。しかし、もしPodの` restartPolicy ` が` Always ` に設定されていた場合、Initコンテナの` restartPolicy ` は` OnFailure ` が適用されます。
217
+ Podの起動時に、kubeletはネットワークおよびストレージの準備が整うまで、Initコンテナを実行可能な状態にしません。また、kubeletはPodのspecに定義された順番に従ってPodのInitコンテナを起動します。
218
+
219
+ 各Initコンテナは次のInitコンテナが起動する前に正常に終了しなくてはなりません。もしあるInitコンテナがランタイムにより起動失敗した場合、もしくはエラーで終了した場合、そのPodの` restartPolicy ` の値に従ってリトライされます。しかし、もしPodの` restartPolicy ` が` Always ` に設定されていた場合、Initコンテナの` restartPolicy ` は` OnFailure ` が適用されます。
208
220
209
221
Podは全てのInitコンテナが完了するまで` Ready ` 状態となりません。Initコンテナ上のポートはServiceによって集約されません。初期化中のPodのステータスは` Pending ` となりますが、` Initialized ` という値はtrueとなります。
210
222
211
- もしそのPodが [ 再起動] ( #pod-restart-reasons ) されたとき 、全てのInitコンテナは必ず再度実行されます。
223
+ もしそのPodを [ 再起動] ( #pod-restart-reasons ) するとき、または再起動されたとき 、全てのInitコンテナは必ず再度実行されます。
212
224
213
225
Initコンテナの仕様の変更は、コンテナイメージのフィールドのみに制限されています。
214
226
Initコンテナのイメージフィールド値を変更すると、そのPodは再起動されます。
215
227
216
- Initコンテナは何度も再起動およびリトライ可能なため 、べき等(Idempotent)である必要があります。特に、` EmptyDirs ` にファイルを書き込むコードは、書き込み先のファイルがすでに存在している可能性を考慮に入れる必要があります。
228
+ Initコンテナは何度も再起動、リトライおよび再実行可能なため 、べき等(Idempotent)である必要があります。特に、` EmptyDirs ` にファイルを書き込むコードは、書き込み先のファイルがすでに存在している可能性を考慮に入れる必要があります。
217
229
218
230
Initコンテナはアプリケーションコンテナの全てのフィールドを持っています。しかしKubernetesは、Initコンテナが完了と異なる状態を定義できないため` readinessProbe ` が使用されることを禁止しています。これはバリデーションの際に適用されます。
219
231
220
- Initコンテナがずっと失敗し続けたままの状態を防ぐために、Podに` activeDeadlineSeconds ` を、コンテナに` livenessProbe ` をそれぞれ設定してください。` activeDeadlineSeconds ` の設定はInitコンテナが実行中の時間にも適用されます。
232
+ Initコンテナがずっと失敗し続けたままの状態を防ぐために、Podに` activeDeadlineSeconds ` を設定してください。` activeDeadlineSeconds ` の設定はInitコンテナが実行中の時間にも適用されます。しかし` activeDeadlineSeconds ` はInitコンテナが終了した後でも効果があるため、チームがアプリケーションをJobとしてデプロイする場合にのみ使用することが推奨されています。
233
+ すでに正しく動作しているPodは` activeDeadlineSeconds ` を設定すると強制終了されます。
221
234
222
235
Pod内の各アプリケーションコンテナとInitコンテナの名前はユニークである必要があります。他のコンテナと同じ名前を共有していた場合、バリデーションエラーが返されます。
223
236
224
237
### リソース {#resources}
225
238
226
239
Initコンテナの順序と実行を考えるとき、リソースの使用に関して下記のルールが適用されます。
227
240
228
- * 全てのInitコンテナの中で定義された最も高いリソースリクエストとリソースリミットが、* 有効なinitリクエスト/リミット* になります。
241
+ * 全てのInitコンテナの中で定義された最も高いリソースリクエストとリソースリミットが、* 有効なinitリクエスト/リミット* になります。いずれかのリソースでリミットが設定されていない場合、これが最上級のリミットとみなされます。
229
242
* Podのリソースの* 有効なリクエスト/リミット* は、下記の2つの中のどちらか高い方となります。
230
243
* リソースに対する全てのアプリケーションコンテナのリクエスト/リミットの合計
231
244
* リソースに対する有効なinitリクエスト/リミット
@@ -240,12 +253,12 @@ Podレベルのコントロールグループ(cgroups)は、スケジューラ
240
253
241
254
以下の理由によりPodは再起動し、Initコンテナの再実行も引き起こす可能性があります。
242
255
243
- * ユーザーが、そのPodのInitコンテナのイメージを変更するようにPodの仕様を更新する場合。アプリケーションコンテナのイメージの変更はそのアプリケーションコンテナの再起動のみ行われます。
244
256
* そのPodのインフラストラクチャーコンテナが再起動された場合。これはあまり起きるものでなく、Nodeに対するルート権限を持ったユーザーにより行われることがあります。
245
- * ` restartPolicy ` が` Always ` と設定されているPod内の全てのコンテナが停止され、再起動が行われた場合。およびガーベージコレクションによりInitコンテナの完了記録が失われた場合 。
257
+ * ` restartPolicy ` が` Always ` と設定されているPod内の全てのコンテナが停止され、強制的に再起動が行われたことで、ガベージコレクションによりInitコンテナの完了記録が失われた場合 。
246
258
259
+ Kubernetes v1.20以降では、initコンテナのイメージが変更されたり、ガベージコレクションによってinitコンテナの完了記録が失われたりした場合でも、Podは再起動されません。以前のバージョンを使用している場合は、対応バージョンのドキュメントを参照してください。
247
260
248
- ## {{% heading "whatsnext" %}}
261
+ ## {{% heading "whatsnext" %}} {#what-s-next}
249
262
250
263
* [ Initコンテナを含むPodの作成] ( /docs/tasks/configure-pod-container/configure-pod-initialization/#creating-a-pod-that-has-an-init-container ) 方法について学ぶ。
251
264
* [ Initコンテナのデバッグ] ( /ja/docs/tasks/debug-application-cluster/debug-init-containers/ ) を行う方法について学ぶ。
0 commit comments