コンテナの故障?慌てないでください。デバッグが機能しない場合は、superdebugがあります。

コンテナの故障?慌てないでください。デバッグが機能しない場合は、superdebugがあります。

この記事はWeChatの公開アカウント「Cloud Native Treasure Box」から転載したものです。

この記事では主にKubernetesのデバッグ機能について説明し、kubectl debugとkubectl superdebugを紹介します。コンテナのマウントをサポートし、トラブルシューティングが必要な Pod をデバッグできます。この記事では、Kubernetes で kubectl exec コマンドを使用する際の制限を指摘し、実行中のコンテナをデバッグするための新しいコンテナを作成し、同じ Pod 内でシステム リソースを共有できる kubectl debug の役割を紹介しています。さらに、エフェメラルコンテナについても言及されています。デバッグ中に既存の Pod で一時的に実行して、トラブルシューティング操作をサポートできます。最後に、この記事では、Docker Engine や Linux 名前空間ベースのツールの使用など、Kubernetes 以外のローカル デバッグ コンテナー方法についてもいくつか説明しています。

kubectl execを使用してコマンドを実行する

Kubernetes 上でソフトウェアを実行する場合、デプロイされたアプリケーションをデバッグしたい場合があります。 VM の使用に慣れている人にとって、デバッグの簡単な方法は、実行中の Pod に接続して共有することです。

 kubectl exec -it podname -c containername -- bash

これは通常機能し、非常に便利です。ただし、現実の世界では exec の有用性を制限する Kubernetes の「ベスト プラクティス」が少なくとも 2 つあります。

• root として実行しないでください。コンテナは可能な限り最小限の権限で実行され、ランダムな UID で実行することもできます。

• 最小限のミラーリング。画像はできるだけ小さくする必要があります。極端な場合には、バイナリ ファイルを distroless イメージにインストールする必要があります。 [1]

これらのベスト プラクティスを適用すると、kubectl exec を使用してコンテナーに接続することができなくなるか、デバッグに適さない不毛の荒野に陥ってしまいます。

コンテナのデバッグ

実行中のコンテナをデバッグするための Kubernetes ネイティブの答えは、kubectl debug を使用することです。

デバッグ コマンドは、実行中のポッドに新しいコンテナを接続します。この新しいコンテナは、別のユーザーとして任意のイメージから実行できます。デバッグ コンテナはターゲット コンテナと同じ Pod (つまり同じノード) で実行されるため、2 つのコンテナ間の分離は絶対的である必要はありません。デバッグ コンテナは、同じ Pod で実行されている他のコンテナとシステム リソースを共有できます。

ポッド コンテナで実行されている PostgreSQL データベースの CPU 使用率を確認するとします。 Pod は root として実行されず、Postgres イメージには top や htop などのツールがインストールされていません。つまり、kubectl exec コマンドは役に立ちません。次のコマンドを実行できます。

 kubectl debug -it \ --container=debug-container \ --image=alpine \ --target=postcont \ postpod

root としてログインし (これは Alpine イメージのデフォルトです)、お気に入りの対話型プロセス ビューアー htop ( apt add htop ) を簡単にインストールできます。コンテナ postcont と同じプロセス名前空間を共有し、そこで実行されているすべてのプロセスを表示し、強制終了することもできます。プロセスを終了すると、一時コンテナは存在しなくなります。

注: 一時コンテナ/bash セッションを終了せずに切断するには、CTRL+P または CTRL+D を押します。その後、 kubectl attach を使用して再接続できます。

注: kubectl debug は、変更された起動コマンドを使用して Pod を複製したり、ノード ファイル システムにアクセスできる "node" Pod を起動したりするなど、ここで概説した以上の機能を提供します。

一時コンテナ

上記のkubectl debugコマンドは、一時コンテナ[2]と呼ばれるものを作成することで機能します。これらのコンテナは、トラブルシューティングなどの操作をサポートするために、既存の Pod 内で一時的に実行する必要があります。

「通常の」コンテナと一時コンテナの違いは微妙です。一時的なコンテナが長期間実行されるのを妨げるものは実際にはありません。エフェメラル コンテナが存在する理由は、Kubernetes が最初に行ったインフラストラクチャの選択を見ればよく理解できると思います。

• ポッドは使い捨てで交換可能であり、これをサポートする必要がある。

• ポッドの仕様は不変です。

これは、Kubernetes が主にステートレス ワークロードのデプロイに使用されていた場合 (Pod 自体が一時的なものと見なされる場合) には非常に理にかなっています。 Kubernetes があらゆることを実行できるこの新しい世界では、制限がある場合があります。 Pod の仕様は同じままですが、Kubernetes は一時的なコンテナを Pod のサブリソースとしてモデル化します。 「通常の」コンテナとは異なり、一時コンテナはポッドの一部であるにもかかわらず、ポッド仕様の一部ではありません。この微妙な違いがみんなを幸せにします🥳!

仮設コンテナはまだ比較的新しいものです。

これらは、Kubernetes v1.25 (2022 年 8 月) 以降は安定状態、v1.23 (2021 年 12 月) 以降はベータ状態、v1.22 (2021 年 8 月) 以降はアルファ状態です。

ボリュームのマウント

組み込みコマンド kubectl debug は非常に便利です。実行中の Pod に一時的なコンテナを追加し、オプションでそのプロセス名前空間を実行中のコンテナと共有することができます。ただし、 kubectl debug を使用して実行中のコンテナのファイルシステムの一部を検査または変更したい場合は、残念ながらできません。デバッグ Pod のファイルシステムは、接続しているコンテナのファイルシステムから切断されています。

幸いなことに、私たちはもっと良い方法を見つけられるはずです。アイデアはシンプルです:

• 実行中のターゲット コンテナの仕様を取得します。

• 一時的なコンテナをポッドにパッチ適用する。ターゲット コンテナーと同じプロセス名前空間を共有し、さらに同じボリューム マウントを含めるように構成します。

一時コンテナを作成するための kubectl コマンドはないので、作成するには K8s API に PATCH リクエストを送信する必要があります。 kubectl proxy コマンドを使用すると、K8s API にアクセスできます。

このプロセスはユーザーフレンドリーとは言えないので、プロセスをスクリプトまたは kubectl プラグインにラップするのが理にかなっています。このようなスクリプトの実装例は、次の場所にあります。

 https://github.com/JonMerlevede/kubectl-superdebug

kubectl デバッグ拡張機能は、ターゲット コンテナのボリューム仕様を一時的なデバッグ ポッドに接続します...

kubectl スーパーデバッグ

このメソッドとスクリプトは、ターゲット コンテナーから環境変数の仕様をコピーするように簡単に拡張できることに注意してください。

このスクリプトを kubectl-superdebug として保存し、パスで使用できるようにすると、次のようにどこからでも kubectl superdebug を使用して実行できます。

 kubectl superdebug \ --container=debug-container \ --image=alpine \ --target=postcont \ postpod

このスクリプトを拡張して、環境変数への参照など、ターゲット コンテナーの他の側面をデバッグ コンテナーにコピーすることもできます。

これで、実行中のコンテナをデバッグするための Kubernetes ネイティブ メソッドの概要は完了です。これでほとんどの人のニーズが満たされるはずです。

Kubernetes 以外のネイティブメソッド

Kubernetes では、実行中のコンテナに root として接続する方法 (マスター プロセスが root として実行されている場合を除く) や、別のコンテナからコンテナのルート ファイル システムにアクセスする方法は提供されていません。これは、これらのことが実行できないという意味ではありません。結局のところ、Kubernetes はコンテナ化エンジンの上に位置するコンテナ オーケストレーターにすぎません。何らかの理由で本当に必要な場合は、通常、抽象化レイヤーを削除することで、必要なことはすべて実行できます。必ず確認してください...

Docker Engine を使用しており、ノードから直接、またはノード上で実行されている特権コンテナを通じてエンジンにアクセスできる場合は、docker exec --user を使用して、任意のユーザーとしてプロセスを実行できます。

kubectl ssh や kubectl exec-user などのプラグインはこのアプローチを実装します。残念ながら、containerd[3]やCRI-O[4]などの最新のエンジンでは、--userフラグ機能が提供されなくなりました。つまり、これらのプラグインは最新のKubernetesインストールでは動作しません。

ただし、これらの最新のエンジンでも、通常は Linux 名前空間とのみ対話します。適切な Linux 名前空間セットを入力することで、任意の「コンテナ」でコマンドを実行できます。 kpexec[5]ツールはこのアプローチを実装しています。ターゲット コンテナと同じノードで特権 Pod を起動し、ターゲットとする (Linux) 名前空間を決定し、それらの (Linux) 名前空間でコマンドを実行し、最後にその出力をターミナルにストリーミングします。追加の利点として、ターゲット コンテナのファイル システムの上にデバッグに使用できるツール セットがオーバーレイされます。

kubectl exec とは異なり、kpexec はコンテナのメイン プロセスとして、異なる uid/gid または異なる機能を持つコマンドを実行できます。 containerd および cri-o と互換性があります。 kpexec は、クラスターのセキュリティ構成と互換性がない可能性のある、やや重くて脆弱なアプローチを使用します。 kubectl (super)debug がニーズを満たさない場合は検討する価値があります。

kpexec は nsenter コマンドを使用して名前空間内で直接実行することに注意してください。これはユビキタスコンテナランタイムruncと互換性がありますが、Kata Containers[6]などのランタイムとは互換性がありません。

この記事では、実行中のコンテナをデバッグするための Kubernetes ネイティブの 2 つの方法、kubectl exec と kubectl debug について説明しました。私たちは kubectl debug がどのように動作するかを調査し、ターゲット コンテナと同じボリュームと同じプロセス名前空間を共有する一時コンテナを起動する kubectl superdebug のバリアントを提案しました。最後に、コンテナをデバッグするための Kubernetes ネイティブではないアプローチをいくつか確認しました。

参考リンク

[1] ディストリビューションなしのイメージの場合。 : https://github.com/GoogleContainerTools/distroless

[2] エフェメラルコンテナ: https://kubernetes.io/docs/concepts/workloads/pods/ephemeral-containers/

[3] コンテナド: https://containerd.io/

[4] CRI-O: https://cri-o.io/

[5] kpexec: https://github.com/ssup2/kpexec[6] Kata コンテナ: https://katacontainers.io/

オリジナルリンク: https://mp.weixin.qq.com/s/cVvcX_tg_3Vehad6GBc5KQ

<<:  5Gとエッジコンピューティングがオンライン小売業者のゲームをどう変えるのか

>>:  アップグレード時にクラッシュします。K8s には LTS バージョンが必要です。

推薦する

jollyworkshosting - Phoenix VPS が 50% オフ

Jollyworkshosting は、2009 年に VPS 事業を開始したフィリピンのインターネ...

ソーシャル ネットワーキング サイトで生き残る方法: 興味が王様

みなさんの大学生は卒業しましたか? Tianya Forum のモデレーターは全員、レンガを動かす仕...

音楽レビューからブランドビデオまで、NetEase Cloud Music のマーケティングの秘密は何でしょうか?

広告業界には「NetEase は広告会社である」という専門用語があります。そう言う理由は、NetEa...

AIGCシステムの導入により、企業のクラウドアーキテクチャが変化する可能性がある

クラウド アーキテクチャを構築し、高性能 AI システムも設計している場合、何を変える必要があります...

医療業界のウェブサイトのコンテンツ管理のアイデア

編集責任やオンライン記事の書き方に関するコンテンツは、インターネット上でたくさん見かけます。各社の要...

Baidu サイトの構文検索結果ページの再設計: ウェブマスターが要求するより多くのコンテンツを表示

先ほど、Baidu のサイト構文を使用して自分の Web サイトを検索したところ、Baidu のサイ...

ipxcore-classic openvzVPS 推奨/ニューヨーク/ロサンゼルス

ipxcore は、ニューヨークとロサンゼルスで同時に VZ プロモーションをリリースしました。簡単...

OpenCL標準のリリースによるGPU高性能コンピューティングの支援

OpenCL は、マルチコア CPU、GPU など、ホストのすべてのコンピューティング リソースを統...

中国ゲームの展望:ゲーム大手を攻撃するのは誰か?

木曜日は元旦後の最初の営業日だった。2日前に武漢で原因不明の肺炎が発見されたにもかかわらず、スノーボ...

写真、テキスト、ビデオに加えて、企業のコンテンツマーケティングにはどのようなコンテンツ形式がありますか?

コンテンツマーケティング = コンテンツ(メディア会社)+マーケティング(広告会社)出典: ストロベ...

モデレーターが運営を革新し、フォーラムの結束を高める方法について話し合う

フォーラム運営の成否を決める重要な要素は、フォーラムの結束力と古い会員数です。これは、フォーラムがウ...

李開復氏と蔡文勝氏の厦門でのスピーチ:起業経験の共有に関する約1万語

この記事は、厦門アイテコーヒーでのイノベーションワークスの李開復氏とエンジェル投資家の蔡文生氏のスピ...

コンセプトから実装の成功まで、テクノロジーの専門家がクラウドインフラストラクチャの最先端のテクノロジーを共有します

[51CTO.com からのオリジナル記事] クラウドコンピューティングの 3 大サービスモデルのひ...

地元の旅行代理店が旅行ウェブサイトを構築し最適化するための 6 つのヒント

季節の移り変わりが早いので、観光シーズンもピークを迎えます。多くの観光客は、この夏、特に人気の観光都...