BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Kubernetes 1.23のデバッグを支援するエフェメラルコンテナ

Kubernetes 1.23のデバッグを支援するエフェメラルコンテナ

原文(投稿日:2022/02/05)へのリンク

Kubernetes 1.23のエフェメラルコンテナ(ephemerl container)は、実行中のポッドのプロセスネームスペースに一時的なコンテナをアタッチして、デバッグユーティリティを実行するための手段を提供するものだ。kubectlコマンドのデバッグオプションを使用すれば、このようなコンテナを、ユーザの選択したイメージで実行することができる。

この機能は、Kubernetes独特のトラブルシューティングに関する問題を解決するためのものだ。トラブルシュートでは、多くの場合、実行中のコンテナ内部に対してターミナルを開く必要があるが、任意のLinuxディストリビューションで使用可能な、標準的なトラブルシューティングユーティリティセットの存在がなければ、コンテナにログインしても解決にはならない。コンテナイメージの大半は、Alpineのようなミニマルディストリビューションをベースにしたものや、distroless上に構築されたものであるため、この種のユーティリティは用意されていないのだ。この制限は、脆弱性に対する攻撃領域を削減するためのものだが、同時にデバッグも難しくしている。

Kubernetesでは、コンテナは、より大きなユニットであるポッドの一部である。ポッドは複数のコンテナを持つことが可能で、その一部をinitコンテナにすることができる。エフェメラルコンテナは、kubectlデバッグコマンドを使って実行中のポッドに追加することの可能な、一時的なコンテナである。

kubectl -n myns debug my-pod -it my-ephemeral-container image=ubuntu target=target-container

上記の"target-container"が、デバッグ対象のコンテナ(my-podの一部)である。このコマンドは、ターゲットコンテナのプロセスネームスペース内で、対話形式のターミナルをローンチする。"-image"パラメータで、エフェメラルコンテナのイメージを選択することができる。これにより、デバッガイメージを選択して、必要なツールを含めておくことが可能になる。

Kubernetesはこれらのコンテナ用のリソースを確保せず、終了時の再起動も行わない。また、"ports"や"livenessProbe"やリソース要求などの一般的なコンテナ属性の一部やリソース要求は、エフェメラルコンテナではサポートされていない。

GoogleのサイトリライアビリティエンジニアであるLee Verberne氏 — 初期から実装に関わってきた — が、Google社内で運用されているオーケストレータのBorgでデバッグの問題を解決した方法について説明している

Borgでは、プロセスに共通のユーザランドを提供する方法を採用しています。アプリケーションバイナリにシステムユーティリティやデバッグユーティリティを同梱するのではなく、アプリケーションが実行環境で使用可能なユーザランドユーティリティの基本セットを、Borgが提供するのです。

BorgはKubernetesの前身である。

デバッグツールをコンテナにコピーするというのもソリューションのひとつだが、Verberne氏は、"Kubernetesはコンテナを使ってバイナリをデプロイするのですから、トラブルシューティングにもコンテナを使うのがより自然な方法"だ、と指摘する。

1.23以降のkubectl debugコマンドがサポートするオプションは他にもあるが、その中に、エフェメラルコンテナを実行中のポッドのコピーにアタッチする、というものがある。コピーされたポッドは、ポッドのコンテナを実行した元々のコマンドでも、異なるコマンドでも実行するこどができる。さらにkubectl debugでは、ノードのホストIPC、ネットワーク、PIDネームスペースで動作し、ノードのファイルシステムにアクセス可能なポッドを新たに生成することも可能だ。ホストのファイルシステムやプロセスにアクセスする必要がある場合には、この方法が役に立つ。GKEも同じように、ホストファイルシステムにアクセス可能なユーティリティを備えた独自のツールボックスコンテナをクラスタ内に提供しているが、kubectl debugのその他の機能は用意されていない。

注意しなけばならないのは、エフェメラルコンテナを使用するためには、クラスタレベルとデバッグ対象ポッドの両方で、プロセスネームスペース共有を有効にしておく必要がある、という点だ。クラスタレベルに関しては、Kubernetes 1.17以降はデフォルトで有効になっているが、デバッグ対象ポッドで有効でない場合は、そのポッドのコピーをオプションを有効にした状態でローンチした上で、エフェメラルコンテナをアタッチするという方法もある。ただし、コピーしたポッドで問題を再現できない状況では、この手段は利用できない。

エフェメラルコンテナは、kubectl debugコマンドをサポートする複数リリース計画の一部である。Kubernetesリリース1.16で最初に導入され、1.23リリースからベータ版となった。エフェメラルコンテナは、Kubernetes 1.23からはデフォルトで有効になっている。

 

作者について

この記事に星をつける

おすすめ度
スタイル

特集コンテンツ一覧

BT