KUBERNETES POD のトラブルシューティングをマスターする: 高度な戦略とシナリオ

Kubernetes (K8s) のデプロイメントでは、ポッド、サービス、イングレス、応答しないクラスター、コントロール プレーン、高可用性セットアップなど、さまざまな観点から課題が生じることがよくあります。 Kubernetesポッドは、Kubernetes エコシステム内でデプロイ可能な最小単位であり、リソースとネットワークを共有する 1 つ以上のコンテナをカプセル化します。ポッドは、アプリケーションまたはプロセスの単一インスタンスを実行するように設計されており、必要に応じて作成および破棄されます。ポッドは、K8s 環境でアプリケーションをスケーリング、更新、保守するために不可欠です。

「Master Kubernetes Pods: Advanced Troubleshooting Strategies 」 (著者なし)から翻訳

この記事では、Kubernetes ポッドが直面する課題と実行するトラブルシューティングの手順について説明します。 Kubernetes ポッドの実行時に発生するエラー メッセージには、次のようなものがあります。

  • 画像プルバックオフ
  • ErrImagePull
  • 無効な画像名
  • クラッシュループバックオフ

場合によっては、リストされているエラーさえ発生しないにもかかわらず、ポッドが失敗していることがわかります。まず、Kubernetes リソースをデバッグするときは、API リファレンスを理解する必要があることに注意することが重要です。さまざまな Kubernetes API がどのように定義されているか、およびポッド/デプロイメント内の複数のオブジェクトがどのように機能するかについて説明します。このドキュメントは、 Kubernetes Web サイトの API リファレンスで明確に定義されています。この場合、ポッドをデバッグするときに、API リファレンスからポッド オブジェクトを選択して、ポッドの動作の詳細を確認します。ポッドに入るフィールド、つまりバージョン、タイプ、メタデータ、仕様、ステータスを定義します。 Kubernetes には、必要なコマンドのガイドを記載したチートシートも提供されています。

前提条件

この記事は、読者が次のような状況にあることを前提としています。

  • シナリオデモ用にインストールされた種類
  • Kubernetes アーキテクチャの中級理解
  • Kubectlコマンドラインツール

Kubernetes ポッド エラー - ImagePullBackoff

このエラーは、次の 3 つの異なる理由で表示されます。

  • 無効な画像です
  • 無効なタグ
  • 無効な権限

このような状況は、画像に関する正しい情報がない場合に発生します。また、リポジトリ (プライベート リポジトリ) からイメージをプルする権限がない場合もあります。以下の例でこれを示すために、nginx デプロイメントを作成します。

➜ ~ kubectl create deploy nginx --image=nginxdeployment.apps/nginx created

ポッドが実行されたら、ポッド名を取得します。

➜ ~ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-8f458dc5b-hcrsh 1/1 Running 0 100s

実行中のポッドの名前をコピーし、それに関する詳細情報を取得します。

➜ ~ kubectl describe pod nginx-8f458dc5b-hcrsh
Name:             nginx-8f458dc5b-hcrsh
hable:NoExecute op=Exists for 300s
Events:
 Type    Reason     Age    From               Message
 ----    ------     ----   ----               -------
 Normal  Scheduled  2m43s  default-scheduler  Successfully assigned default/nginx-8f458dc5b-hcrsh to k8s-troubleshooting-control-plane
 Normal  Pulling    2m43s  kubelet            Pulling image "nginx"
 Normal  Pulled     100s   kubelet            Successfully pulled image "nginx" in 1m2.220189835s
 Normal  Created    100s   kubelet            Created container nginx
 Normal  Started    100s   kubelet            Started container nginx

イメージは正常に取得されました。 Kubernetes ポッドはエラーなしで実行されています。

ImagePullBackoff をデモンストレーションするには、デプロイメント YAML ファイルを編集し、存在しないイメージを指定します。

➜ kubectl edit deploy nginx
 containers:
 -image: nginxdoestexist
  imagePullPolicy: Always
  name: nginx

新しいポッドは正常にデプロイされませんでした

➜ ~ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-5b847fdb95-mx4pq 0/1 ErrImagePull 0 3m40s
nginx-8f458dc5b-hcrsh 1/1 Running 0 38m

ImagePullBackoff エラーが表示される

➜  ~ kubectl describe pod nginx-6f46cbfbcb-c92bl
Events:
 Type     Reason     Age                From               Message
 ----     ------     ----               ----               -------
 Normal   Scheduled  88s                default-scheduler  Successfully assigned default/nginx-6f46cbfbcb-c92bl to k8s-troubleshooting-control-plane
 Normal   Pulling    40s (x3 over 88s)  kubelet            Pulling image "nginxdoesntexist"
 Warning  Failed     37s (x3 over 85s)  kubelet            Failed to pull image "nginxdoesntexist": rpc error: code = Unknown desc = failed to pull and unpack image "docker.io/library/nginxdoesntexist:latest": failed to resolve reference "docker.io/library/nginxdoesntexist:latest": pull access denied, repository does not exist or may require authorization: server message: insufficient_scope: authorization failed
 Warning  Failed     37s (x3 over 85s)  kubelet            Error: ErrImagePull
 Normal   BackOff    11s (x4 over 85s)  kubelet            Back-off pulling image "nginxdoesntexist"
 Warning  Failed     11s (x4 over 85s)  kubelet            Error: ImagePullBackOff

Kubernetes ポッド エラー - イメージはプルされましたが、ポッドは保留中のステータスになっています。

K8s を運用環境で実行するときは常に、K8s 管理者は、クラスター内で実行されている名前空間の要件に基づいて、各名前空間にリソース クォータを割り当てます。ネームスペースは、クラスター内の論理的な分離に使用されます。

「イメージはプルされましたが、ポッドはまだ保留中です」エラーは、リソース クォータの仕様がポッド内のアプリケーションの最小要件を満たしていない場合にスローされます。次の例では、payments という名前空間を作成します。

➜ ~ kubectl create ns payments

namespace/payments created

関連する仕様を使用してリソース クォータを作成する

➜  ~ cat resourcequota.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
 name: compute-resources
spec:
 hard:
   requests.cpu: "1"
   requests.memory: 1Gi
   limits.cpu: "2"
   limits.memory: 4Gi

名前空間の支払いにリソース割り当てを割り当てる

➜ ~ kubectl apply -f resourcequota.yaml -n paymentsresourcequota/compute-resources created

作成されたリソース クォータ/コンピューティング リソース

リソース クォータ制限のある名前空間内に新しいデプロイメントを作成します。

kubectl create deploy nginx --image=nginx -n paymentsdeployment.apps/nginx created

デプロイメントは正常に作成されましたが、ポッドが存在しません。

➜ ~ kubectl get pods -n payments

No resources found in payments namespace

デプロイメントは作成されましたが、準備完了状態のポッド、更新するポッド、および使用可能なポッドがありません。

➜  ~ kubectl get deploy -n payments
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   0/1     0            0           7m4s

さらにデバッグするには、nginx のデプロイメントについて説明します。ポッドの作成に失敗しました:

➜  ~ kubectl describe deploy nginx -n payments
Name:                   nginx
Namespace:              payments
CreationTimestamp:      Wed, 24 May 2023 21:37:55 +0300
Labels:                 app=nginx
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               app=nginx
Replicas:               1 desired | 0 updated | 0 total | 0 available | 1 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
 Labels:  app=nginx
 Containers:
  nginx:
   Image:        nginx
   Port:         <none>
   Host Port:    <none>
   Environment:  <none>
   Mounts:       <none>
 Volumes:        <none>
Conditions:
 Type             Status  Reason
 ----             ------  ------
 Available        False   MinimumReplicasUnavailable
 ReplicaFailure   True    FailedCreate
 Progressing      False   ProgressDeadlineExceeded
OldReplicaSets:    <none>
NewReplicaSet:     nginx-8f458dc5b (0/1 replicas created)
Events:
 Type    Reason             Age   From                   Message
 ----    ------             ----  ----                   -------
 Normal  ScalingReplicaSet  10m   deployment-controller  Scaled up replica set nginx-8f458dc5b to 1

Kubernetes イベントからのさらなる分析により、ポッドの作成に必要なメモリが不十分であることが判明しました。

➜ ~ kubectl get events --sort-by=/metadata.creationTimestamp

このエラーは、イメージが正常にプルされ、コンテナーが作成されたものの、ランタイム構成が失敗した場合に発生します。たとえば、動作中の Python アプリケーションが存在しないフォルダーに書き込もうとしている場合、またはフォルダーへの書き込み権限がない場合です。最初にアプリケーションが実行され、その後エラーが発生します。アプリケーション ロジックでパニックが発生すると、コンテナーが停止します。コンテナは CrashLoopBackOff に入ります。最終的に、デプロイメントにポッドがないことがわかります。つまり、ポッドは存在しますが、実行されておらず、CrashLoopbackoff エラーがスローされます。

liveness プローブと readiness プローブが失敗しました

活性検出は、Pod が破損した状態になり、トラフィックを提供できなくなったかどうかを検出します。 Kubernetes がポッドを再起動します。 Readiness プローブは、アプリケーションがトラフィックを処理する準備ができているかどうかを確認します。 Readiness プローブは、アプリケーションが構成マップから必要な構成をすべてフェッチし、スレッドを開始することを保証します。このプロセスを完了した後でのみ、アプリケーションはトラフィックを受信できるようになります。このプロセス中にアプリケーションでエラーが発生した場合も、CrashLoopBackoff に入ります。

トラブルシューティングを開始してください!

この記事では、Kubernetes ポッドのトラブルシューティング手法の概要を説明します。ポッドのデプロイ時に発生する一般的なエラーに対処し、これらのエラーを解決するための実用的なソリューションを提供します。また、Kubernetes の仕組みを理解し、問題を効果的に特定して解決する際に重要なリファレンス ページとチート シートに関する洞察も提供します。この記事で提供されるガイダンスに従うことで、読者はトラブルシューティング スキルを向上させ、Kubernetes ポッドのデプロイと管理を簡素化できます。

この記事はYunyunzhongsheng ( https://yylives.cc/ ) で最初に公開されたもので、どなたでもご覧いただけます。

私はオープンソース紅蒙を諦めることにしました 、オープンソース紅蒙の父である王成露氏:オープンソース紅蒙は 中国の基本ソフトウェア分野における唯一の建築革新産業ソフトウェアイベントです - OGG 1.0がリリースされ、ファーウェイがすべてのソースコードを提供します。 Google Readerが「コードクソ山」に殺される Ubuntu 24.04 LTSが正式リリース Fedora Linux 40の正式リリースを前に、 Microsoft開発者ら:Windows 11のパフォーマンスは「ばかばかしいほど悪い」、 馬化騰氏と周宏毅氏が握手し「恨みを晴らす」 有名ゲーム会社が新たな規定を発行:従業員の結婚祝いは10万元を超えてはならない 拼多多は不正競争で有罪判決 賠償金500万元
{{名前}}
{{名前}}

おすすめ

転載: my.oschina.net/u/6919515/blog/11054466