コンテナの故障?慌てないでください。デバッグが機能しない場合は、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 バージョンが必要です。

推薦する

クラウドネイティブ アプリケーションのセキュリティにかかるコスト

現在、60% を超える組織が、新しいアプリケーションの大部分がクラウドで構築されていると報告していま...

検索エンジンのリンクとドメインクエリ命令の違いについて説明します

このトピックは SEO 入門のカテゴリで書きましたが、インターネットで見つけた情報によると、リンクと...

成功した「クリックベイト」になりたいなら、一目で顧客の注意を引く必要があります。

オンライン マーケティングを行っている場合でも、オンライン ビジネスを開始している場合でも、オンライ...

メッセージ: Hosteons は別のサーバールームに移動する予定で、5 ~ 6 時間ダウンする可能性があります。

hosteons からの公式ニュース: Psychz データ センターでホストされているすべての公式...

SEO開発のトレンドに関する洞察

近年、SEOがますます普及するにつれて、何千人もの友人がこの業界に流れ込み、競争はますます激しくなっ...

クラスタの平均CPU使用率は45%に達し、Xiaohongshuの大規模コロケーション技術の実践が明らかになった。

ガートナーの予測データによると、世界のIT支出は2024年に5.1兆米ドルに達し、2023年から8%...

ウィークリーニュースレビュー: マイクロソフトが XP を不本意ながら廃止、OpenSSL の重大な脆弱性の詳細

1. ビットコイン価格が1ヶ月で40%近く下落、仮想通貨熱がリスクを生むビットコイン、ライトコイン、...

災害復旧について話すとき、私たちは何について話すのでしょうか?

災害復旧というと、多くの学生は「同じ都市でのデュアルアクティブ」、「2 つの場所に 3 つのセンター...

数百万人が参加するオンラインライブインタラクティブプラットフォーム向けのDockerベースのマイクロサービスアーキテクチャプラクティス

[51CTO.com からのオリジナル記事] この記事では、特定のプロジェクト例から始まり、迅速にス...

100元のプロモーション予算をどう使うか?

ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービス市場にある企業の 95%...

2021 年のクラウド コンピューティングに関する 10 の質問

[[380612]]過ぎ去った2020年は特別な年でした。今年、新型コロナウイルス感染症が世界を襲う...

shockhosting: シンガポールの VPS、1Gbps の帯域幅、月額 4.99 ドルから、2G メモリ/1 コア/30g SSD/1T トラフィック

shockhosting(~)は、シンガポールに新しいデータセンターを追加すると発表しました。現在、...

世界の .NET ドメイン名登録統計: 2 月のドメイン名の純減数は 8,053 件

IDC Review Network (idcps.com) は 3 月 20 日に次のように報告し...

#格安サーバー# reprisehosting-29 USD/シアトル/L5640/16g メモリ/1T ハードドライブ/10T トラフィック/4IP

reprisehosting をお勧めします。2 台の超安価なサーバー、本当に特別価格、IPMI 付...

蘇寧は物流発展のため速達免許を申請、企業の負担増も

国家郵政局の最新の公開情報によると、蘇寧電器は速達業務の運営許可を申請した。蘇寧電器は、JD.com...