ポッドを再起動する必要がある状況になる場合があります。たとえば、ポッドがエラー状態の場合。
再起動ポリシーに応じて、Kubernetes自体が再起動して修正しようとします。
ただし、それでも問題が解決せず、エラーの原因が見つからない場合は、Kubernetes Podを手動で再起動することが、アプリを再び機能させるための最速の方法です。
Kubernetesでポッドを再起動する方法
残念ながら、 kubectlrestartpodコマンドはありません この目的のために。ポッドを再起動する方法は次のとおりです。
- ロールアウトポッドが再起動します
- レプリカの数のスケーリング
両方の方法を詳しく説明します。
方法1:ロールアウトポッドが再起動します
Kubernetesバージョン1.15以降、デプロイのローリングリスタートを実行できます。
コントローラは一度に1つのポッドを強制終了し、ReplicaSetを使用して、すべてのポッドが再起動時間よりも新しくなるまで新しいポッドをスケールアップします。私の意見では、アプリケーションがダウンしないため、これがポッドを再起動するための最良の方法です。
注: 個々のポッドIPが変更されます。
例を見てみましょう。 2つのポッドで構成されるmy-depという名前のデプロイメントがあります(レプリカが2つに設定されているため)。
[email protected]:~# kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
my-dep 2/2 2 2 13s
ポッドの詳細を取得しましょう:
[email protected]:~# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-dep-6d9f78d6c4-8j5fq 1/1 Running 0 47s 172.16.213.255 kworker-rj2 <none> <none>
my-dep-6d9f78d6c4-rkhrz 1/1 Running 0 47s 172.16.213.35 kworker-rj1 <none> <none>
次に、次のようなコマンドを使用して、my-depデプロイメントの再起動をロールアウトしましょう。
kubectl rollout restart deployment name_of_deployment
前のコマンドからの展開の名前を覚えていますか?ここで使用してください:
[email protected]:~# kubectl rollout restart deployment my-dep
deployment.apps/my-dep restarted
kubectl get pod -w
を使用して、古いポッドが終了し、新しいポッドが作成されるプロセスを確認できます。 コマンド:
[email protected]:~# kubectl get pod -w
NAME READY STATUS RESTARTS AGE
my-dep-557548758d-kz6r7 1/1 Running 0 5s
my-dep-557548758d-svg7w 0/1 ContainerCreating 0 1s
my-dep-6d9f78d6c4-8j5fq 1/1 Running 0 69s
my-dep-6d9f78d6c4-rkhrz 1/1 Terminating 0 69s
my-dep-6d9f78d6c4-rkhrz 0/1 Terminating 0 69s
my-dep-557548758d-svg7w 0/1 ContainerCreating 0 1s
my-dep-557548758d-svg7w 1/1 Running 0 3s
my-dep-6d9f78d6c4-8j5fq 1/1 Terminating 0 71s
my-dep-6d9f78d6c4-8j5fq 0/1 Terminating 0 72s
my-dep-6d9f78d6c4-rkhrz 0/1 Terminating 0 74s
my-dep-6d9f78d6c4-rkhrz 0/1 Terminating 0 74s
my-dep-6d9f78d6c4-8j5fq 0/1 Terminating 0 76s
my-dep-6d9f78d6c4-8j5fq 0/1 Terminating 0 76s
ここでポッドを確認すると、詳細がここで変更されていることがわかります:
[email protected]:~# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-dep-557548758d-kz6r7 1/1 Running 0 42s 172.16.213.43 kworker-rj1 <none> <none>
my-dep-557548758d-svg7w 1/1 Running 0 38s 172.16.213.251 kworker-rj2 <none> <none>
CI / CD環境では、エラーが発生したときにポッドを再起動するプロセスは、ビルドプロセス全体を再度実行する必要があるため、長い時間がかかる可能性があります。
これを実現するためのより高速な方法は、kubectl scale
を使用することです。 レプリカ番号をゼロに変更するコマンド。ゼロより大きい数を設定すると、Kubernetesは新しいレプリカを作成します。
試してみよう。最初にポッドを確認してください:
[email protected]:~# kubectl get pod
NAME READY STATUS RESTARTS AGE
my-dep-557548758d-kz6r7 1/1 Running 0 11m
my-dep-557548758d-svg7w 1/1 Running 0 11m
展開情報を取得します:
[email protected]:~# kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
my-dep 2/2 2 2 12m
次に、レプリカ番号をゼロに設定します。
[email protected]:~# kubectl scale deployment --replicas=0 my-dep
deployment.apps/my-dep scaled
そして、それを2に戻します:
[email protected]:~# kubectscale deployment --replicas=2 my-dep
deployment.apps/my-dep scaled
今すぐポッドを確認してください:
[email protected]:~# kubectl get pod
NAME READY STATUS RESTARTS AGE
my-dep-557548758d-d2pmd 1/1 Running 0 10s
my-dep-557548758d-gprnr 1/1 Running 0 10s
Kubernetesポッドを正常に再起動しました。
上記の方法のいずれかを使用して、エンドユーザーに影響を与えることなくアプリをすばやく安全に動作させます。
この演習を行った後、コアの問題を見つけて修正してください。ポッドを再起動しても 根本的な問題を修正します。
このKubernetesのヒントが気に入っていただければ幸いです。もっと購読することを忘れないでください。
Rakesh Jain
DevOps Professional | RHCA |ジェンキンス| Git | Docker | Kubernetes | Ansible |プロメテウス| Grafana | AWSクラウド