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

推薦する

URL転送と301リダイレクトが体重に与える影響に関する研究

すべてのウェブマスターは、www 付きドメイン名と www なしドメイン名の違いと関連性を知っており...

マイクロサービスのための分散一貫性パターン

マイクロサービスの分割後に発生する問題の 1 つは、分散後の一貫性の問題です。モノリシック アーキテ...

もしあなたのウェブサイトが誤って Baidu から消えてしまったら、Baidu を責めるでしょうか?

6月22日から、Baiduは多くのサイトの格下げを開始しましたが、当時は現在ほど深刻ではありませんで...

Tujia.comの急速な資金調達の謎を解明:開発が最優先

Tujia.com の急速な発展から私たちが学んだのは、ウェブサイトがいかに飛躍するかではなく、ウェ...

Yuan Fangさん、SEO会社を選ぶことについてどう思いますか?

ネットワーク技術に精通していない、または不慣れな企業にとって、強力な SEO 会社を選択することは非...

ikihost: 米国無制限 VPS (ロサンゼルス) - 50% オフ、月額 4 ドル - 4G メモリ/2 コア (AMD EPYC)/40gNVMe/1Gbps 帯域幅無制限トラフィック

ikihost は 2011 年に設立されたマレーシアの企業です。cpanel パネル仮想ホスティン...

DMIT: 日本 cn2 gia vps (100M 帯域幅)、ハイエンド高速ネットワーク、50% 割引、年間 197 ドルから

DMIT は現在、日本の東京データセンターのプレミアム シリーズ VPS を 50% 割引で提供して...

韓度易社のトラフィック構造が明らかに、タオバオの顧客が売上の30%を牽引

6月25日、易邦電力網によると、漢都易社の2013年の予想売上高は10億を超える見通しだ。期待される...

Pythonで仮想環境を作成して使用する方法

[[431838]]数日前、会社から私のコンピューターに Anaconda プロセスが見つかったとい...

高品質な外部リンクについてどれくらいご存知ですか?

外部リンクの話題はSEO担当者の間では依然としてホットな話題ですが、私たちが日ごろ行っている外部リン...

分散ストレージシステムの理論的指針をCAPからPACELCに移行する時期が来ている

CAP 理論は、分散ストレージ システムの現在の設計に対する理論的ガイドラインであり、PACELC ...

北朝鮮のサイバー攻撃事件

2014年11月24日、ハッカー集団「Guardians of Peace」がソニー・ピクチャーズの...

プログラマーが人生を無駄にするいくつかの方法

プログラマーは自分の人生を大切にし、有用で有意義なことをするべきです。役に立つことをするには 2 つ...

ギャラクシー証券とテンセント、デジタル技術で証券サービスをアップグレードするために戦略的に協力

証券業界はデジタル化の推進を加速させている。 5月22日、2019年テンセントグローバルデジタルエコ...

高級品ウェブサイトはグループ購入の過ちを繰り返すのでしょうか?

2011年の共同購入市場は「急成長」を特徴とし、大手共同購入ウェブサイト間の熾烈な競争があり、「再編...