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

推薦する

Shumai Technology: 香港の物理サーバー、最低350元、30M CMIまたは10M cn2、無制限のトラフィック

Shumai Technology は 5 月に、香港の自社データセンターにある香港サーバーを超低価...

お金を優先する戦略が必ずしもウェブサイト運営の成功につながるわけではないという事実を簡単に分析する

多くの人が「お金は悪魔を働かせる」と聞いたことがあり、中には「お金は悪魔を働かせる」と聞いたことがあ...

GDSとチェックポイントが協力して安全なハイブリッドクラウドアーキテクチャを実現

[51CTO.comよりオリジナル記事] クラウドコンピューティング、モノのインターネット、人工知能...

Google ペンギンアップデートに打ち勝つための 5 つのコンテンツ

GoogleペンギンアルゴリズムのアップデートはSEO業界に大きな波紋を巻き起こしました。アルゴリズ...

オンライン収入の業種と特徴を明らかにする

いわゆる怠惰なオンライン収入とは、インターネット ケーブルとコンピューターだけでお金を稼ぐことができ...

Kubernetes、Docker Swarm、Amazon ECS 間のコンテナ戦争

[51CTO.com クイック翻訳] コンテナ技術の原型は 1970 年代後半に始まりましたが、コン...

resellerclub - 格安ドメイン名を購入、.com 36元/me 15元/xyz 7元

ご存知のとおり、Resellerclub の主要事業はドメイン名です。 Resellerclub の...

Baidu 音声検索はエコシステムの欠点を克服できるか?

インターネットが生み出す経済規模が拡大し続けるにつれ、業界内の競争は熾烈になってきています。国内の検...

ウェブサイトの古さはウェブサイト運営の鍵です。ウェブサイトの古さをうまく活用することが鍵です。

「サイト年齢」という用語は、ほとんどのウェブマスターにとって比較的馴染みのある用語であるはずです。す...

cloudiplc: 泉州 CN2、HK/TW/JP/SG およびその他の ntt、pccw リンクに直接接続

cloudiplcが提供するKVMシリーズVPSは、福建省泉州のデータセンターで利用可能です。CN2...

第1四半期のアプリ海外動向

4月21日、data.aiは最新レポート「2018年第1四半期の市場指数ランキング」を発表しました。...

外部リンクを送信しなくてもウェブサイトを宣伝できます

ウェブマスターやウェブサイト運営者なら誰でも、できるだけ早く自分のウェブサイトをインターネットの隅々...

IBMは、数百億のパラメータを持つモデルを柔軟に展開およびトレーニングするためのクラウドネイティブAIスーパーコンピューターVelaを開発しました。

ChatGPTはインターネット上で人気を博しており、その背後にあるAIモデルのトレーニングも広く注目...

ウェブサイトのSEO最適化: 顧客第一

現在、ウェブサイトの最適化を行う人員は絶えず変化しており、Baiduアルゴリズムはどのような方向に進...

素晴らしいロゴを作るにはどうすればいいでしょうか? もちろん、ロゴ デザイン ウェブサイトです!

月給5,000~50,000のこれらのプロジェクトはあなたの将来ですロゴが企業に与える影響は目に見え...