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

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

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

『Master Kubernetes Pods: Advanced Troubleshooting Strategies』 (著者なし) からの翻訳です。

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

  • イメージプルバックオフ
  • エラーイメージプル
  • 無効な画像名
  • クラッシュループバックオフ

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

前提条件

この記事は、読者が以下の要件を満たしていることを前提としています。

  • シナリオデモンストレーション用にインストールされた種類
  • Kubernetesアーキテクチャについて中級レベルの理解があること
  • Kubectl コマンドラインツール

Kubernetes ポッド エラー - ImagePullBackoff

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

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

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

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

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

 ➜ ~ 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 pod 正在运行,没有错误。

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 Pod 错误- 已拉取镜像但Pod 处于pending 状态。

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
尽管已成功创建部署,但没有Pod 存在:
 ➜ ~ kubectl get pods -n payments No resources found in payments namespace

デプロイメントは作成されましたが、準備中の状態の Pod はなく、更新中の Pod はなく、使用可能な Pod もありません。

 ➜ ~ 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 事件进行的进一步分析显示Pod 创建所需的内存不足。
 ➜ ~ kubectl get events --sort-by=/metadata.creationTimestamp

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

生存および準備の調査に失敗しました

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

トラブルシューティングを始めましょう!

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


<<:  クラウドテクノロジーの最も包括的な説明

>>:  ByteDance 第2回インタビュー: 分散ロックを使用したことはありますか?分散ロック実装ソリューションは何ですか?分散ロックを使用する利点と欠点は何ですか?

推薦する

Hostsolutions: 超大容量ハードディスク VPS 再入荷、14.6/半年、苦情防止/無制限コンテンツ

hostsolutionsは、新しいコンピュータルームを開設したことを正式に発表しました。ボスは比較...

ゲームの観点から、ユーザーの粘着性を高めるために習得できる「ルーチン」とは何でしょうか?

ゲームやゲーミフィケーション活動は、当然のことながら、ユーザーの粘着性とアクティビティが強くなります...

ブランドに合ったロゴをデザインするにはどうすればいいでしょうか? LOGO Design Networkはブランドロゴを簡単にデザインします

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています有名ブラン...

新たな統合と包括的な最適化! Parallels Desktop 14 メジャーアップグレード分析

[51CTO.com からのオリジナル記事] Parallels が昨年 9 月に Parallel...

ホスト評価はテーマを変更しています、変更がある可能性があります、Saoanにはライセンスがありません!

2、3日後にHost Catのテーマを修正して入れ替えます。ゆっくりと調整して最適化するのに時間がか...

強力なeコマースプラットフォームイベントを計画する方法

電子商取引プラットフォーム活動の力は誰の目にも明らかです。ほぼすべての休日に大規模なプロモーション活...

Pinduoduo は Taobao を転覆させることで勝利するかもしれない

2019年7月中旬から11月中旬にかけて、 Pinduoduoの株価は7月中旬の1株あたり約20米ド...

分類情報ウェブサイトの新しいビジネスモデル

誰もが機密情報ウェブサイトモデルの問題について議論しています。私にはアイデアがあります。どうか私に考...

vultr-新しいスナップショット機能は無料です

Vultr は、SSD VPS クラウドがスナップショット機能を正式にサポートすることを公式に発表し...

広告はゲームアプレットを「殺す」のか?

2年前、「Jump Jump」というミニゲームプログラムがWeChat Momentsで人気を博しま...

高級品サイト、商品の真贋判別困難で次々に閉鎖

数万元もする高級品が、一夜にして40%や50%も値引きされることもある。こうした値引きは間違いなく魅...

8つの視点から語る:ユーザージャーニーに基づいたチャネル配信方法

ユーザー ジャーニーとは、最初のコンタクトから支払いの完了、製品やサービスの享受に至るまで、ユーザー...

ウェブサイトでお金を稼ぐ私のユニークな方法を公開

ウェブサイトの収益性に関する私の考えは非常にシンプルです。つまり、優れたユーザー エクスペリエンスと...

さまざまな分散ロックの欠点を比較し、Redis分散ロックを実装するための鍵をつかむ

過去 2 年間で、マイクロサービスはますます普及し、分散環境に導入されるアプリケーションも増えていま...

ソーシャルメディアのシグナルが2014年のGoogleランキングに影響を与える

これら 5 つの注目の SEO トレンドを見ると、見落としがちなトレンドがいくつかあることに気づくか...