Dockerは、アプリケーションをスタンドアロンコンテナーとしてパッケージ化できる、開発者向けのコンテナー化プラットフォームです。互換性のあるコンテナランタイムが利用可能な場所であればどこでも実行できます。
Dockerの人気により、コンテナとほぼ同義になっていますが、すべてのユースケースに最適なテクノロジーではありません。 Dockerをそのまま使用すると、CLIは個々のコンテナーを管理するためだけに装備されているため、本番環境での課題が発生します。
Kubernetesは、コンテナのスタックを管理し、複数のサーバーにまたがってスケーリングするオーケストレーションプラットフォームです。物理マシンのフリート全体に展開して、サービスの冗長性と復元力を向上させることができます。独自のクラスタを起動して「Docker」コンテナをスケーリングする方法は次のとおりです。
Kubernetesの基本
いくつかの重要なKubernetes用語を認識すると、Dockerとの違いを理解するのに役立ちます。 Kubernetesディクショナリには、クラスタに追加できる数十のリソースが記述されています。この記事に関連するのは、コンテナーのスケジューリングを制御するコンポーネントのみです。
大まかに言えば、Kubernetesインストールは「ノード」のクラスターです。ノードは、ワークロードをホストする独立した物理マシンです。単一の「マスター」ノードは、新しいコンテナーを最も適切なワーカーノードに「スケジュール」することにより、クラスターの操作を調整(「調整」)する役割を果たします。
重要な用語は次のとおりです。
- マスター –マスターノードはクラスターを操作します。これは、Kubernetesをインストールするマシンです。コントロールプレーンを実行し、コンテナ化されたアプリのホスティングをワーカーノードに委任します。
- コントロールプレーン –コントロールプレーンは、マスターノードのソフトウェアコンポーネントです。 APIサーバー、構成ストア、コンテナスケジューラなど、いくつかのサービスが組み込まれています。
- ノード –ノードは、コンテナーをホストするマシンです。各ワーカーは、Kubeletと呼ばれるKubernetesコンポーネントを実行します。これはコントロールプレーンとの接触を維持し、新しいコンテナをプロビジョニングするために動作するスケジューリング命令を受け取ります。
- ポッド –ポッドは、Kubernetesクラスター内の最小のコンピューティングユニットであり、コンテナーインスタンスのグループを表します。ポッドの抽象化により、実行中の複数のコンテナをまとめて操作できます。
- レプリカセット –レプリカセットは、指定された数のレプリカが使用可能であることを確認するためにポッドをスケーリングする役割を果たします。ポッドのレプリカを3つ要求すると、レプリカセットによって可用性の制約が満たされることが保証されます。ポッドは、障害が発生した場合に自動的に置き換えられるため、サーバー間でのコンテナーレプリケーションを自動化できます。
スケーラブルクラスターを作成するには、マスターノード、少なくとも2つのワーカーノード、および複数のレプリカをプロビジョニングするデプロイメントが必要です。 Kubernetesは、利用可能なすべてのノードにわたってポッドをスケジュールできるため、停止が発生した場合の復元力を提供します。
Kubernetesは、ほとんどの主要なクラウドプロバイダーからマネージドオファリングとして利用できます。これらは、コントロールプレーンを作成し、可変数のワーカーノードを追加するためのワンクリックの方法を提供します。
MicroK8sなどの自己完結型のKubernetesディストリビューションを使用して、独自のハードウェアでクラスターを実行できます。冗長なスケジューリングをサポートする場合は、少なくとも2台の分離された物理マシンまたは仮想マシンが必要です。
両方のマシンにMicroK8をインストールします。 1つのノードをマスターとして指定し、add-node
を使用します ノード登録プロセスを開始するコマンド:
microk8s add-node
これにより、microk8s join
が発行されます 指図。セカンダリノードに切り替えて、コマンドを実行します。新しいワーカーとして最初のクラスターに参加します。これで、両方のマシンでコンテナ化されたワークロードをホストする準備が整いました。
複数のサーバーで実行されるアプリケーションは、「水平方向にスケーリングされた」と表現されます。それはいくつかの異なる環境に広がっています。システムを垂直方向にスケーリングするには、既存の環境にリソースを追加する必要があります。
Kubernetesワークロードを定義する最も簡単な方法は、デプロイを使用することです。このリソースタイプは、コンテナイメージからポッドを作成し、サービスを介してパブリックネットワークルートを設定します。デプロイメントはデフォルトで単一のポッドインスタンスになりますが、複数のレプリカで構成できます。
簡単な導入マニフェストは次のとおりです。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80
Kubectlを使用してマニフェストをクラスターに適用します:
microk8s kubectl apply -f ./manifest.yaml
Kubernetesは3つのポッドを作成し、それぞれがnginx:latest
から作成されたNGINXWebサーバーをホストします。 画像。ポート80は、インバウンドトラフィックを有効にするためのコンテナポートとして公開されています。
ポッドは、クラスタのノード全体に自動的に分散されます。ノードが十分なリソースを提供できる場合、ノードはポッドをホストする資格があります。
レプリカの数はいつでも更新できます。 replicas
を変更します マニフェストのフィールドを作成し、クラスターに再適用します。 Kubernetesスケジューラは、必要に応じて新しいポッドをプロビジョニングするか、古いポッドを終了するためのアクションを実行します。 replicas
をスケーリングする場合 0まで下げると、デプロイメントまたはそれに関連するリソースを実際に削除せずに、アプリケーションをオフラインにすることができます。
レプリカ数を更新すると、クラスター内の既存のリソースを利用できます。最終的には、結合されたノード容量を完全に使い果たして、新しいポッドがスケジュールされなくなる可能性があります。 Kubernetesは、ノードを作成および破棄できるクラスタ自動スケーリング機能を提供します 、スケジュールできるポッドの数を効果的に変更します。
自動スケーリングの設定は比較的複雑です。正確なプロセスは、クラスターのホスティング環境によって異なります。需要の変化を検出するためにホストに接続できるクラスターオートスケーラーとの統合が必要です。 GoogleCloudの公式ドキュメントを利用できます。ソリューションは、AmazonEKSおよびMicrosoftAKSからも入手できます。
自動スケーリングは、クラスター容量が不十分なためにスケジュールできないポッドを常にチェックすることで機能します。また、正常にスケジュールされたポッドを実際にノード数を減らして同じ場所に配置できるかどうかも評価します。次に、自動スケーラーはクラウドプロバイダーのAPIを利用してコンピューティングインスタンスを追加および削除し、クラスターのリソースを動的に調整します。新しいインスタンスの作成は通常有料の操作であるため、これは請求に影響を与える可能性があります。
Kubernetesを使用すると、コンテナインスタンスを複数のサーバーに簡単に分散できます。マシンをノードとして登録するか、マネージドクラウドクラスターを使用してから、replicas
を持つデプロイメントを作成します フィールドセット。要求されたレプリカ数を更新することで、ワークロードを拡張できます。
需要の大幅な変化が予想される場合は、自動スケーリングを使用して容量を動的に拡張します。この機能を使用すると、新しいノードをその場で作成し、リソースを追加して、レプリカ数を増やし続けることができます。
ポッドをスケーリングするときは、何らかの形のインバウンドトラフィック分散も必要であることを覚えておく必要があります。ポート80を公開している場合、Kubernetesはリクエストを任意ののポート80にマッピングできる必要があります ノードの。これは、デプロイメントとサービスで自動的に機能します。 Kubernetesは、ポッドを継続的に監視してトラフィックを転送できる場所を特定するロードバランサーを作成します。