Docker Desktop での Kubernetes 拡張機能の作成

このゲスト投稿は、Dockerキャプテンの1人の好意によるものです。 DiveIntoのDevOpsコンサルタント兼コース/コンテンツクリエーターであるJames Spurinは、Kubernetes拡張機能を作成した経験を思い出します。 Docker Desktop.もちろん、すべての旅には課題がありました。 しかし、loft.sh vcluster 拡張機能の強力なオープンソースの利点を活用できたことは、努力する価値がありました。

Docker kubernetes loft extension 900x600 1

Docker Desktop で独自の Kubernetes 拡張機能を作成するには何が必要か疑問に思ったことはありませんか? このブログでは、k9s Docker 拡張機能の作成中に学んだ手順と教訓、および重要なインフラストラクチャコンポーネントとして vcluster 拡張機能の信じられないほど loft.sh オープンソースの取り組みをどのように活用するかについて説明します。

k9s 拡張機能を実行している Docker デスクトップ。

なぜ Kubernetes Docker 拡張機能を構築するのですか?

私が最初にDocker拡張機能に遭遇したとき、私は疑問に思いました:

「Docker Extensions を使用して、Docker Desktop で提供される組み込みの Docker マネージド Kubernetes サーバーと通信できますか?」

Docker拡張機能は、[拡張機能]ペイン内の便利なフルスタックインターフェイスで多くの機会を開きます。

従来、Docker を使用する場合、UI または CLI を使用してコンテナーを実行していました。 次に、コンテナーのサービス ポート (8080 など) をホスト システムに公開します。 次に、http://localhost:8080 などの URL を使用して Web ブラウザー経由でユーザー インターフェイスにアクセスします。

ui / cloを介してDockerコンテナを実行し、サービスポートを公開するようにユーザーに指示する図。 次に、ユーザーはWebブラウザを介してサービスにアクセスする必要があります。

UI / CLIはこれを比較的シンプルにしますが、これには、異なるコンポーネント、つまりDockerデスクトップとWebブラウザー間の複数のステップが含まれます。 また、サービスを再起動するか、ブラウザを閉じるたびに、これらの手順を繰り返す必要がある場合があります。

Docker拡張機能は、Dockerダッシュボードを介してバックエンドサービスを視覚化できるようにすることで、この問題を解決します。

元の手順を繰り返す代わりに、ユーザーが docker 拡張機能へのアクセスを指示していることを示す図。

Docker Desktop、Docker Extensions、Kubernetesを組み合わせることで、さらに多くの機会が開かれます。 このツールセットを使用すると、開発の初期段階からコンテナーの作成、実行、テスト、Kubernetes を使用したコンテナー オーケストレーションに至るまで、Docker Desktop を生産的に活用できます。

コード開発とコンテナーのビルドから始まり、コンテナーのテストと kubernetes を使用したオーケストレーションで終わるフロー図。

k9s拡張機能の作成に関する課題

これを実際に確認したかったので、組み込みのKubernetesサーバーでDockerデスクトップを活用するさまざまな方法を試しました。 最終的に、私はギャップを埋め、KubernetesにDocker拡張機能へのアクセスを提供することができました。

当時、これには特権コンテナが必要であり、セキュリティ上のリスクがありました。 その結果、このアプローチは理想的ではなく、私が快適に共有できるものではありませんでした...

南京錠3錠
FLY:D による写真 on スプラッシュ解除

これをさらに詳しく見ていきましょう。

Docker Desktop は、非表示の仮想マシンを使用して Docker を実行します。 また、このインスタンス内には、kubeadm を介してデプロイされた Docker マネージド Kubernetes インスタンスもあります。

kubeadm を介してデプロイされた仮想マシン内の Docker マネージド kubernetes インスタンスを示す図。

Docker Desktop は、ユーザーのホーム領域内でローカルの事前構成された kubeconfig ファイルと kubectl コマンドをユーザーに便利に提供します。 これにより、Kubernetes へのアクセスの手間が軽減されます。 これは機能し、Dockerの便利さからKubernetesを活用しようとしている人にとってアクセスを迅速に追跡するための素晴らしい方法です。

ただし、この単純さは、拡張機能の観点からいくつかの課題をもたらします。 具体的には、組み込みの Kubernetes サービスにアクセスするための適切な kubeconfig ファイルを Docker 拡張機能に提供する方法を見つける必要があります。

loft.sh と仮想クラスターを使用したソリューションの検索

幸いなことに、loft.sh とvclusterのチームはこの課題に対処することができました。 彼らの努力は、Docker DesktopでKubernetesベースの拡張機能を作成しようとしている人々に強固な基盤を提供します。

通常の名前空間内で実行される仮想 kubernetes クラスターをアドバタイズするロフト Web サイトのホームページ。

仮想クラスターの Docker 拡張機能を起動すると、Docker Desktop が Kubernetes を実行していることを確認する制御ループが使用されていることがわかります。

オープンソースの観点からは、これはKubernetesを使用して独自のDocker拡張機能を作成する人にとって非常に再利用性があります。 進行状況インジケーターは、以下に示すように、実行中の Kubernetes サービスの仮想クラスターチェックを示します。

実行中の kubernetes サービスを検索するときにロード画面を表示する Docker デスクトップ仮想クラスター拡張機能ペイン。

サービスが実行されている場合は、それに応じて UI が読み込まれます。

実行中の kubernetes サービスの一覧を表示する Docker デスクトップ仮想クラスター拡張機能ペイン。

そうでない場合は、次のようにエラーが表示されます。

エラー メッセージが表示される Docker デスクトップ仮想クラスター拡張機能ペイン。

Kubernetesサーバーが実行中であることを内部で確認している間、ロフト.sh vcluster Extension は、Docker Desktop Kubernetes kubeconfig を巧みにキャプチャします。 vcluster 拡張機能は、拡張機能に含まれる kubectl バイナリを使用して javascript hostcli 呼び出しを使用してこれを行います (Windows、Mac、および Linux 間の互換性を提供するため)。

次に、キャプチャされた出力を拡張機能内で実行されているサービスにポストします。 次に、サービスは、仮想クラスター拡張機能で使用するローカル kubeconfig ファイルを書き込みます。 🚀

// Gets docker-desktop kubeconfig file from local and save it in container's /root/.kube/config file-system.
// We have to use the vm.service to call the post api to store the kubeconfig retrieved. Without post api in vm.service
// all the combinations of commands fail
export const updateDockerDesktopK8sKubeConfig = async (ddClient: v1.DockerDesktopClient) => {
    // kubectl config view --raw
    let kubeConfig = await hostCli(ddClient, "kubectl", ["config", "view", "--raw", "--minify", "--context", DockerDesktop]);
    if (kubeConfig?.stderr) {
        console.log("error", kubeConfig?.stderr);
        return false;
    }

    // call backend to store the kubeconfig retrieved
    try {
        await ddClient.extension.vm?.service?.post("/store-kube-config", {data: kubeConfig?.stdout})
    } catch (err) {
        console.log("error", JSON.stringify(err));
    }

Docker Desktop の k9 拡張機能の仕組み

ロフト付き.sh 「Docker Desktop Kubernetes Service is Running」制御ループとkubeconfigキャプチャロジックにより、KubernetesベースのDocker拡張機能を作成するための重要な要素が揃っています。

油と小麦粉の成分
アンス プラッシュの アンシュA による写真

Dockerデスクトップ用にリリースしたk9s拡張機能は、基本的にこれらのコンポーネントであり、k9sとttyd(Webターミナル用)のスプラッシュがあります。 これは loft.sh vcluster コードベースであり、k9s が追加された最小限のコンポーネントセットに削減されています。

ソースコードは https://github.com/spurin/k9s-dd-extensionで入手できます

レディム。 githubにあるMdファイルは、Dockerデスクトップのk9s拡張機能の詳細を説明しています。

loft.sh の vcluster は kubeconfig ファイルを特定のディレクトリに保存しますが、k9s 拡張機能はこのサービスを Docker ボリュームと組み合わせることでこれをさらに拡張します。 サービスが kubeconfig を使用して投稿要求を受信すると、期待どおりに保存されます。

kubeconfig ファイルは、次の例に示すように、他のコンテナーがアクセスできる共有ボリューム (k9s など) にあります。

他のコンテナーからアクセスできるように共有ボリュームに格納されている kubeconfig ファイルを示すコード スニペット。

k9s コンテナーが起動すると、環境変数 KUBECONFIG (コンテナー イメージで定義) が読み取られます。 次に、k9s が実行されているポート 35781 でターミナル Web ベースのサービスを公開します。

Kubernetes が Docker Desktop で期待どおりに実行されている場合は、ロフト.sh iframe をポート 35781 のサービスにレンダリングするための Kubernetes 制御ループ。

if (isDDK8sEnabled) {
            const myHTML = '<style>:root { --dd-spacing-unit: 0px; }</style><iframe src="http://localhost:35781" frameborder="0" style="overflow:hidden;height:99vh;width:100%" height="100%" width="100%"></iframe>';
            component = <React.Fragment>
            <div dangerouslySetInnerHTML={{ __html: myHTML }} />
            </React.Fragment>
        } else {
            component = <Box>
                <Alert iconMapping={{
                    error: <ErrorIcon fontSize="inherit"/>,
                }} severity="error" color="error">
                    Seems like Kubernetes is not enabled in your Docker Desktop. Please take a look at the <a
                    href="https://docs.docker.com/desktop/kubernetes/">docker
                    documentation</a> on how to enable the Kubernetes server.
                </Alert>
            </Box>
        }

これにより、k9s Docker 拡張機能にアクセスするときに、拡張機能ウィンドウ内に k9s がレンダリングされます。

ドッカーデスクトップで実行されているK9拡張機能

結論

それで、k9sDocker拡張機能を作成した私の経験を共有することがあなたに刺激を与えることを願っています。 Kubernetes k9s Docker Extension (loft.sh の肩の上に立つ) のソース コードを活用することで、 私たちは数え切れないほどの機会への扉を開きます。

Docker Desktop での Kubernetes 拡張機能の作成は、docker-compose.yaml (独自のコンテナー サービス用) とコントロール ループでの UI レンダリングの 2 つのファイルを変更するだけで、迅速に追跡できます。

もちろん、これらすべては、vclusterの背後にある心なしでは不可能です。 ロフト.shズに特別な感謝を捧げたいと思います クベコンで会って loft.sh/vcluster を紹介してくれたリアン・リー。また、vcluster拡張機能のソースコードとk9sのフォークバージョンの両方で参照されている開発チームにも感謝します。

読んでくれてありがとう– ジェームズ・スプリン

開始方法がわからない、またはこのようなDocker拡張機能について詳しく知りたいですか? 次の追加リソースを確認してください。

また、Jamesの詳細、Dockerを操作するための彼のヒントなどについては、 ドッカーキャプテンテイク5 級数。