K3s 入門ガイド - Docker で K3s を実行するための詳細なチュートリアル

K3s 入門ガイド - Docker で K3s を実行するための詳細なチュートリアル

k3dとは何ですか?

k3d は、Docker で K3s クラスターを実行するための小さなプログラムです。 K3s は、CNCF によって認定された軽量の Kubernetes ディストリビューションおよびサンドボックス プロジェクトです。これはリソースが制限された環境向けに設計されており、512 MB 未満の RAM を必要とする単一のバイナリ ファイルとしてパッケージ化されています。 K3s について詳しくは、Bilibili の以前の記事とビデオをご覧ください。

k3d は、K3s リポジトリから構築された Docker イメージを使用して、Docker がインストールされている任意のマシン上の Docker コンテナー内に複数の K3s ノードを起動します。 このようにして、物理 (または仮想) マシン (Docker ホストと呼ばれる) は、それぞれ複数のサーバー ノードとエージェント ノードを持つ複数の K3s クラスターを実行できます。

k3d は何ができますか?

2021 年 1 月に、次の機能を含む k3dv4.0.0 がリリースされました。

  • K3s クラスター (および個々のノード) の作成/停止/開始/削除/スケールアップ/スケールダウン
  • コマンドラインフラグ経由
  • 設定ファイル経由
  • クラスターで使用できるコンテナイメージレジストリを管理および操作する
  • クラスターの Kubeconfigs の管理
  • ローカルDockerデーモンからクラスターで実行されているコンテナランタイムにイメージをインポートする

当然ながら、プロセスの詳細を調整する方法は他にもたくさんあります。

k3d の用途は何ですか?

k3d の主な適用シナリオは、Kubernetes でのローカル開発です。k3d の軽量でシンプルな機能により、このシナリオではトラブルやリソース使用の問題はほとんどありません。 k3d を開発する当初の目的は、開発者に開発マシン上で軽量の Kubernetes クラスターを実行できるシンプルなツールを提供し、本番環境のような環境での反復時間を短縮できるようにすることでした (本番環境で Kubernetes を使用してローカルで docker-compose を実行するよりもはるかに高速です)。

時間の経過とともに、k3d は、隔離された環境で特定の Kubernetes (具体的には K3s) 機能をテストするための運用ツールにも進化しました。 たとえば、k3d を使用すると、マルチノード クラスターを簡単に作成し、その上にいくつかのアプリケーションをデプロイし、ノードを簡単に停止して Kubernetes の反応を確認したり、アプリケーションを他のノードに再スケジュールしたりすることができます。

さらに、継続的インテグレーション システムで k3d を使用して、クラスターをすばやく起動し、その上にテスト スタックをデプロイし、統合テストを実行することもできます。完了したら、クラスター全体を簡単に非アクティブ化できます。適切な清掃や残留物の可能性について心配する必要はありません。

また、k3d-dind イメージも提供しています (映画「インセプション」の夢の中の夢のように、コンテナの中にコンテナの中にコンテナがあります)。これを使用すると、k3d を実行する docker-in-docker 環境を作成し、Docker で K3s クラスターを生成できます。つまり、Docker ホスト上では 1 つのコンテナー (k3d-dind) のみが実行され、その中で K3s/Kubernetes クラスター全体が実行されることになります。

k3dの使い方は?

1. k3d をインストールします (必要に応じて kubectl もインストールできます)

注意: この記事にはバージョン要件があります。少なくともk3d v4.1.1以上を使用してください。

2. 以下の例のいずれかを試すか、ドキュメントまたはCLIヘルプテキストを使用して独自の方法を見つけます(k3d [コマンド] --help)

「シンプルな」方法

k3d クラスター作成

このコマンドは、Kubernetes コントロール プレーン ノード (server) とその前にあるロード バランサー (serverlb) の 2 つのコンテナーを持つ K3s クラスターを作成します。 これらすべてを専用の Docker ネットワークに配置し、Docker ホスト上のランダムに選択された空きポートで Kubernetes API を公開します。 また、イメージのインポートに備えて、バックグラウンドで Docker という名前のボリュームも作成します。

デフォルトでは、名前パラメータを指定しない場合、クラスターの名前はk3s-defaultになり、コンテナはk3d-として表示されます。 - -<#>、この例では2つのコンテナはk3d-k3s-default-serverlbとk3d-k3s-default-server-0として表示されます。

k3d はすべての準備が整うまで待機し、クラスターから Kubeconfig を取得して、それをデフォルトの Kubeconfig (通常は $HOME/.kube/config または KUBECONFIG 環境変数が指すパスにあります) とマージします。
心配しないでください。その動作も調整できます。

kubectlを使用して、作成したノードを表示します: kubectl get nodes
k3d には、作成したものを一覧表示するコマンドもいくつかあります: k3d cluster | node | registry list

「シンプルだが洗練された」アプローチ

k3d クラスターは mycluster を作成します --api-port 127.0.0.1:6445 --servers 3 --agents 2 --volume '/home/me/mycode:/code@agent[*]' --port '8080:80@loadbalancer'

このコマンドは、6 つのコンテナを持つ K3s クラスターを生成します: * 1 つのロードバランサー * 3 つのサーバー (コントロール プレーン ノード) * 2 つのエージェント (以前のワーカー ノード)

--api-port 127.0.0.1:6445 を使用すると、k3d を使用して Kubernetes API ポート (内部的には 6443) を 127.0.0.1/localhost のポート 6445 にマッピングできます。つまり、このクラスターに接続するには、Kubeconfig に次の接続文字列を含めることになります: server: https://127.0.0.1:6445。
このポートはロード バランサーからホスト システムにマップされます。そこから、リクエストはサーバー ノードにプロキシされ、サーバー ノードに障害が発生して別のサーバーにフェイルオーバーする必要がある実稼働環境の設定を効果的にシミュレートします。

--volume /home/me/mycode:/code@agent[ ] bind は、ローカル ディレクトリ /home/me/mycode をすべての ([ ] エージェント ノード内のパス /code にマウントします。 1 つのノードのみにマウントするには、* をインデックス (0 または 1) に置き換えます。
ボリュームをどのノードにマウントするかを k3d に指示する仕様は「ノード フィルター」と呼ばれ、ポート マッピングの --port フラグなどの他のフラグにも使用されます。

つまり、--port '8080:80@loadbalancer' は、ローカル ホストのポート 8080 をロード バランサー (serverlb) のポート 80 にマッピングし、これを使用して HTTP 入力トラフィックをクラスターに転送できます。 たとえば、Web アプリケーションは、myapp.k3d.localhost などの Ingress を介して外部に公開 (サービス) されるクラスター (デプロイメント) にデプロイできます。

次に (そのドメインをローカルホスト IP に解決するようにすべて設定されている場合)、ブラウザーで http://myapp.k3d.localhost:8080 を指定してアプリにアクセスできます。 その後、トラフィックは Docker ブリッジ インターフェースを介してホストからロード バランサーに流れます。 そこから、クラスターにプロキシされ、Ingress と Service を介してアプリケーション ポッドに配信されます。

注意: myapp.k3d.localhost をローカルホスト IP (127.0.0.1) にルーティングするための何らかのメカニズムを設定する必要があります。
最も一般的な方法は、/etc/hostsファイルで127.0.0.1を使用することです。
myapp.k3d.localhost (C:\Windows\System32\drivers\etc/hosts) のエントリ。 。
ただし、ワイルドカード( .localhost)は使用できないため、しばらくすると少し面倒になる可能性があるので、dnsmasq(MacOS /
負担を軽減するために、Acrylic (UNIX) または Acrylic (Windows) を使用します。 ヒント:
Linux および openSUSE では、.localhost ドメインを 127.0.0.1 に自動的に解決するようになった
ため、手動で解決する必要がなくなりました。たとえば、Ingress 経由でテストする場合は、そこでドメインを設定する必要があります。

ここで注意すべき点は、複数のサーバー ノードを作成すると、K3s に --cluster-init フラグが割り当てられ、K3s のデフォルトの内部データベース (デフォルトでは SQLite) が etcd に変更されることです。

「コードとして構成」アプローチ

k3d v4.0.0 (2021 年 1 月リリース) 以降では、以前はコマンドライン フラグを使用して行っていたすべての設定を、設定ファイルを使用して設定することをサポートしています (近いうちにさらに多くの設定がサポートされる可能性があります)。執筆時点では、構成ファイルを検証するための JSON スキーマはリポジトリにあります。
出典: github.com/rancher/k3d/blob/092f26a4e27eaf9d3a5bc32b249f897f448bc1ce/pkg/config/v1alpha2/schema.json

設定ファイルの例:

# k3d 構成ファイル (例: /home/me/myk3dcluster.yaml として保存)
apiVersion: k3d.io/v1alpha2 # 今後、すべてがより安定するようになると、この値は変更されます
kind: Simple # 内部的にはクラスタ構成もありますが、外部ではまだ利用できません
name: mycluster # クラスターに付けたい名前 (先頭に `k3d-` が付きます)
servers: 1 # `--servers 1` と同じ
エージェント: 2 # `--agents 2` と同じ
kubeAPI: # `--api-port 127.0.0.1:6445` と同じ
  ホストIP: "127.0.0.1"
  ホストポート: "6445"
ポート:
  - port: 8080:80 # `--port 8080:80@loadbalancer と同じ
    ノードフィルター:
      - ロードバランサー
オプション:
  k3d: # k3d ランタイム設定
    wait: true # 戻る前にクラスターが使用可能になるまで待機します。`--wait` と同じです (デフォルト: true)
    timeout: "60s" # 中止する前にタイムアウトを待ちます。`--timeout 60s` と同じです
  k3s: # K3s 自体に渡されるオプション
    extraServerArgs: # `k3s server` コマンドに渡される追加の引数
      - --tls-san=my.host.domain
    extraAgentArgs: [] # `k3s agent` コマンドに渡される追加の引数
  kubeconfig:
    updateDefaultKubeconfig: true # デフォルトの Kubeconfig に新しいクラスターを追加します。`--kubeconfig-update-default` と同じです (デフォルト: true)
switchCurrentContext: true # 現在のコンテキストを新しいクラスターのコンテキストに設定します。`--kubeconfig-switch-context` と同じです (デフォルト: true)

これを/home/me/myk3dcluster.yamlとして保存すると、これを使用して新しいクラスターを構成できます。
k3d クラスターの作成 --config /home/me/myk3dcluster.yaml

注: 追加のパラメータまたはフラグを設定することもできます。これらは、構成ファイルで定義したパラメータよりも優先されます (または、それらのパラメータとマージされます)。

k3d は他に何ができるのでしょうか?

k3d はさまざまなシナリオで使用できます。たとえば、次のようになります。

  • k3d ホストのコンテナ レジストリを使用してクラスターを作成する
  • クラスターを使用したホットコードリロードによる迅速な開発
  • k3dをTiltやSkaffoldなどの他の開発ツールと組み合わせて使用​​する
  • どちらもk3dイメージインポートを介してイメージインポート機能を使用することができます
  • どちらもk3dがホストするリポジトリを使用して開発サイクルをスピードアップできます。
  • CI システムで k3d を使用します (このための PoC を提供しています: https://github.com/iwilltry42/k3d-demo/blob/main/.drone.yml)
  • コミュニティが管理するvscode拡張機能(https://github.com/inercia/vscode-k3d)を使用して、
  • K3s の高可用性を設定するために、vscode ワークフローで使用します。

このデモ リポジトリに用意されているスクリプトを使用して、これらすべてを自分で試すことができます。
https://github.com/iwilltry42/k3d-demo.

トルステン・クライン
trivago の DevOps エンジニア、SUSE のフリーランス ソフトウェア エンジニア、k3d のメンテナー。

上記は、Docker で K3s を実行するための k3d 入門ガイドの詳細チュートリアルの詳細な内容です。Docker で K3s を実行する方法の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • dockerでPostgreSQLを実行する方法
  • docker-compose を使用して MySQL を実行する方法
  • Dockerを使用してサーバー上で複数のPHPバージョンを実行する
  • 実行中の Docker コンテナにボリュームを動的に追加する方法

<<:  js メモリ リークのシナリオ、それらを詳細に監視および分析する方法

>>:  自分のブログを構築しながら学んだこと

推薦する

ウェブページにプレーヤーを埋め込む埋め込み要素の自動開始が false 無効

最近、仕事でサウンド ファイルを再生するために Web ページにプレーヤーを埋め込む必要に迫られまし...

Window.nameはクロスドメインデータ転送の問題を解決します

<br />原文: http://research.microsoft.com/~hel...

JavaScriptはオブジェクトの不要なプロパティを削除します

目次例方法1: 削除方法2: 分解補充する要約するThinking シリーズは、10 分で実用的なプ...

MySQL ロック制御同時実行方法

目次序文1. 楽観的ロックバージョンフィールドを追加する2. 悲観的ロック読み取りロック完全なテーブ...

InnoDB の主な機能 - 挿入キャッシュ、2 度書き込み、適応ハッシュ インデックスの詳細

InnoDB ストレージ エンジンの主な機能には、挿入バッファ、二重書き込み、適応ハッシュインデック...

CSS 疑似要素と疑似クラスの魔法のような使い方についての簡単な説明

CSS は Web ページで非常に重要な役割を果たします。近年の CSS の発展に伴い、疑似要素/疑...

MySQL でパーティション分割後にクエリを実装するために MRG_MyISAM (MERGE) を使用する例

大量のデータベース データを最適化することは非常に高度な科学であり、開発者が習得する必要がある専門的...

Firefox で英語の文字が折り返されない問題の解決方法

テキストのレイアウトには、言語に応じていくつかの書式設定要件があります。たとえば、簡体字中国語では、...

iviewは動的なフォームとカスタム検証期間の重複を実装します

フォーム項目を動的に追加するiview の動的なフォーム追加は非常に簡単です。フォーム項目を配列に設...

実用的な情報が満載のJavaScript Webフォーム機能通信

1. はじめに先ほど、フロントエンドの表示の問題について説明しました。では、前のコンテンツに戻って、...

vue.js ベースの QQ チャット ルーム

目次導入効果のデモンストレーションは次のとおりです。 MChat コンポーネントのレンダリング: I...

MySQL ロック(テーブルロック、行ロック、共有ロック、排他ロック、ギャップロック)の詳細な説明

現実世界では、鍵は外の世界から身を隠したいときに使用するツールです。コンピュータでは、複数のプロセス...

Vueはパーセンテージバー効果を実現します

この記事では、パーセンテージバーを実現するためのVueの具体的なコードを参考までに共有します。具体的...

ウェブ開発者やデザイナーにとって欠かせないオンラインウェブツールとアプリケーション

これまでの記事で、フロントエンド開発者にとって必須のツール、スクリプト、リソースのコレクションを紹介...

Vueの学習手順

目次1. v-text (v-instruction name = "variable&q...