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

推薦する

コンテンツ危機に直面しているSEOブログの苦境から抜け出す方法

最近、SEO ブロガーのほとんどが、書けば書くほどトピックに心を動かされなくなり、書けば書くほど情熱...

hosteons: 生涯割引コード 20% オフ、米国での無制限トラフィック VPS、Windows 対応、Alipay

シンガポールの商人であるHosteensは、3月に新しいプロモーションを実施します。以前の1回限りの...

ローカルポータルに関する分析レポート(III):ローカルポータルの活路はどこにあるのか?

前回の「ローカルポータル分析レポート(I):ローカルポータルの市場はまだあるのか?」と「ローカルポー...

山東省泰安市の授業でFacebookグループマーケティングの商業的応用について議論

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

海外ネイティブ IP VPS サーバー、ネイティブ IP サーバー、複数のストリーミング メディアのロックを解除します。

多くのビジネスでは、対外貿易促進ビジネスやTikTokでのマーケティングなど、IP、特にネイティブI...

魅力的なクラウドイノベーション16選

パブリック クラウドについて考えるとき、最初に思い浮かぶのはたいてい財務的なことです。ワークロードを...

パブリック IP アドレスがなくてもリモート開発とデバッグが可能です。 VMware 仮想マシンのポート マッピングは 3 つのステップで実現できます。

多くのプロジェクトでは、開発プロセス中にさまざまなデモ環境やオペレーティング システムで実行およびデ...

dreamhost-VPS 50% オフ、1000M ポート無制限

Dreamhostは長い間私のブログに登場していませんでした。主な理由は、費用対効果が高くないことと...

#BlackFriday# alphavps: 5 つのオプション データ センター、VPS は年間 9.99 ユーロから、AMD+NVMe シリーズ、専用サーバーは月額 30 ドルから

Alphavps はブルガリアでは本当に古いブランドであり、2018 年のブラック フライデーには ...

ネット有名人「秦火火」が名誉毀損と騒乱罪で懲役3年の判決を受ける

被告は法廷に出廷した 【秦火火は一審で懲役3年の判決を受けた】ネット有名人の秦志輝(愛称「秦火火」)...

クラウド移行はまだ成功していないが、「クラウド移行トレンド」はひっそりと到来している?

クラウド コンピューティングは常に、企業のデジタル変革の基盤として考えられてきました。多くの企業は、...

Baidu のアルゴリズムは頻繁に調整されていますが、検索結果は説得力があるのでしょうか?

最近、百度のアルゴリズムが調整され、多くの関連ポリシーが相次いで導入されました。最新のものは、リンク...

ブランドマーケティング:ブランドロゴとシンボルデザイン

ブランドを識別したい場合、最も早い方法はブランドロゴを見ることです。では、ブランドアイデンティティに...

Krypt データセンター VPS ブランド イオンクラウド: ロサンゼルス データセンター VPS 簡単評価

クリプト電脳室直系のVPSブランドであるイオンクラウドのVPSについて、その速度や効果などについて知...

#11.11# 三友クラウド、VPS年間支払いは98元から、米国CN2回線は35%割引、日本CN2と香港CMI回線は20%割引

Sanyouyunの11.11プロモーションも開催中:(1)米国西海岸サンノゼの双方向CN2が生涯3...