このブログ記事では、KubernetesにおけるKubeadmについて紹介します。

これまで、適切なセキュリティと監視機能を備えた本番環境対応のクラスターを正しくセットアップする方法について説明してきました。 しかし、常にMinikubeを使用してきましたが、これはシングルノードクラスターのローカルテストと開発用であり、 本番環境では、リモートサーバー上にマルチノードクラスターをセットアップしなければならないことが予想されます。 そのため、この記事では、最小限の実用的/本番環境対応のマルチノードKubernetesクラスターをセットアップするための kubeadmの基本について説明します。
Kubeadmのインストール
Kubernetesには互換性のあるホスト(多くのLinuxディストリビューションが互換性があります)、ノードあたり2GB以上のRAM、
およびコントロールプレーンマシンまたはマスターノード用に少なくとも2つのCPUが必要です。
すべてのノードは一意のMACアドレスと製品UUID(それぞれifconfig -a
と/sys/class/dmi/id/product_uuid
で確認可能)を持ち、
必要なポートが開いている必要があります(nc 127.0.0.1 6443 -zv -w 2
で確認可能)。
次に、すべてのマシンにポッド内でコンテナを実行するためのコンテナランタイムをインストールする必要があります。
これはDockerをインストールすることで実行できます(Dockerのインストール方法についてはリンクから確認できます)。
kubeadmでKubernetesクラスターをセットアップするには、すべてのマシンにkubeadm
、kubelet
、kubectl
をインストールする必要があります。
DebianとRed Hat系Linuxディストリビューション向けのインストール方法とその依存関係については、
こちらで確認できます。
クラスターのセットアップ
コントロールプレーンを初期化するには、kubeadm init <args>
コマンドを使用しますが、コンテナランタイムとCNIに応じて、
<args>
に対応する引数を提供する必要があります。例えば、ネットワークポリシーをセットアップするためのCNIとしてCalicoを使用する際には--pod-network-cidr
引数を192.168.0.0/16
に設定し、
その後kubectl apply
でインストールする必要があります。デフォルトでは、コントロールプレーンは1つのノードを使用することが想定され、
コントロールプレーンにポッドがスケジュールされないようにtaintが設定されています。
(高可用性のためにより多くのコントロールプレーンを導入することもできます。これはこちらの手順に従って実行できます。)
kubeadm init
を実行した後、kubeadm join
で始まるワーカーノードをコントロールプレーンに参加させるための出力が生成されるはずです。
これをワーカーノードにコピー&ペーストして実行することで、ワーカーノードをクラスターに参加させることができます。
すべてのノードが設定されたら(リモートサーバーの場合はSSH経由)、イメージをセットアップし、リソースを設定し、
Minikubeで行ってきたようにkubectl apply
で適用できます。
クラスターセットアップの例
kubeadmでマルチノードクラスターを初期化した後、これまで説明してきたセキュリティ、監視、CI/CDなどに関するすべてのリソースとツールを活用して、 安全でスケーラブルかつ保守可能な本番環境対応のクラスターをセットアップできます。 以下は、Helm、永続ボリューム、水平ポッドスケーリング、Prometheus、ArgoCD、Gateway APIを活用した本番環境対応クラスターの例の図です。

この図では、ポッド、デプロイメント、コントロールマネージャー、スケジューラー、その他のコンポーネント(サービスメッシュ用のEnvoyプロキシ、 認可ポリシー、仮想サービス、宛先ルール、Gateway API用のHTTPRoute、RBAC用のロール、ロールバインディング、クラスターロール、サービスアカウント、 ポッドスケジューリング用のtaint、toleration、ノードアフィニティ、リクエストと制限設定など)が省略されています。 また、サービスやステージに異なる名前空間を使用し、Helm、Kustomize、ArgoCDを使用してステージ間で設定を変更し、 バージョン管理するなど、より洗練されたアプローチを検討することもできます。
上記からわかるように、クラスターを適切にセットアップし管理するには複雑で、膨大な労力と専門知識が必要です。 これが、特に小規模なシステムでは、Docker Composeやモノリスを好む人がいる理由です。 しかし、大規模なシステムは本質的に複雑で開発・保守が困難であり、Kubernetesやその他の関連ツールは、 効果的に学習・適用された場合に、これらのシステムを適切に扱いやすくする実装と抽象化を提供するために設計されています。 したがって、初期の学習曲線は急峻かもしれませんが、だからこそ習得するために時間と労力を投資することは非常に価値がある可能性が高いです。
結論
この記事では、kubeadmを使用した本番環境マルチノードクラスターのセットアップ方法と、 これまで説明してきたリソースとツールを使用したクラスターセットアップの例について説明しました。 Kubernetesの基礎をほとんど説明したため、この記事でKubernetesシリーズを(少なくとも一時的に)締めくくりますが、 将来的に関連トピックを扱う可能性があります。それでも、練習のために様々な設定でKubernetesやその他の関連ツールを 可能な限り使用してみることをお勧めします。
リソース
- Kubernetes. n.d. Installing kubeadm. Kubernetes.
- Kubernetes. n.d. Creating a cluster with kubeadm. Kubernetes.
- Kubernetes. n.d. Adding Linux worker nodes. Kubernetes.