はじめに
サイオステクノロジーの塚田です。Rancher入門ブログシリーズとして、前回はRancherの概要について説明しました。今回はAWS上にRancherを構築する方法について解説します。この記事では、Terraform、RKE2、Helmといったツールを使用して、AWS環境にRancherを簡単に構築する方法をステップバイステップで紹介します。
構築する環境のアーキテクチャは以下の通りです:
構成要素
- リージョン: us-east-1
- VPC:
- CIDR範囲: 10.0.0.0/16
- Public Subnet:
- 10.0.0.0/24
- 10.0.1.0/24
- 10.0.2.0/24
- Network Load Balancer (NLB):
- Rancherへの外部アクセスを負荷分散します。
- EC2インスタンス:
- Control Planeノードとして3台を構成し、それぞれRKE2を使用したKubernetesとRancherをホストします。
- OS: Ubuntu 24.04 LTS
- インスタンスタイプ: t3.xlarge※1
- セキュリティグループ:
- ノード間通信が行えるよう必要なポートを開放します。
※1: 最低要件はt3.medium相当ですが、本記事では余裕を持たせて最低要件から2倍程度のインスタンスタイプを採用しています。
本記事のゴール
- AWS環境の準備:
- Terraformを用いて、AWS上に必要なリソース(VPC、サブネット、NLB、EC2インスタンスなど)を自動的に構築します。
- Kubernetesクラスターの構築:
- RKE2※2を使用して、高可用性を備えたKubernetesクラスターをセットアップします。
- 今回構築するのは検証用なので、Control PlaneとWorker Nodeを兼用します。
- Rancherのインストール:
- Helmを利用してRancherをデプロイし、Kubernetesクラスター管理用のダッシュボードを利用できるようにします。
※2 RKE2とは:
Rancher Labsが開発したKubernetesディストリビューション
https://docs.rke2.io/
事前準備
構築を始める前に、以下の要件を満たしていることを確認してください:
- AWSアカウント:
- 適切な権限を持つIAMユーザーを用意してください。
- 本記事ではAdministratorAccessを利用しています。
- ローカル環境にインストールが必要なツール:
- Terraform: v1.5.0以上
前提条件
KubernetesおよびRancherのバージョン
本記事で使用するソフトウェアのバージョンは以下の通りです:
- Kubernetes (RKE2): v1.30.6+rke2r1
- Rancher Server: v2.10※3
- cert-manager: v1.16.1(SSL証明書管理用)※4
※3: 本記事執筆時点での最新バージョン
※4: RancherはHTTPSを使用して動作するため、SSL証明書を管理するツールとしてcert-managerが必要です。
ハードウェア要件
EC2インスタンス最低スペック:
- CPU: 2コア以上
- メモリ: 4GB以上
- ストレージ: 20GB以上の空き容量
構築手順
AWSリソースの作成
まずはterraformを利用して、Kubernetesクラスター構築に必要なリソースをAWS環境上に作成します。
- デモ用リポジトリからterraformのコードをクローンします。
$ git clone git@github.com:Eiji-Tsukada-sti/rancher_demo.git $ cd rancher_demo
- terraformを実行します。
# terraformを初期化 $ terraform init # terraformで作成するリソースを確認 $ terraform plan # AWSにデプロイ $ terraform apply
terraformのoutputより、以下の情報を確認してください。
- initial_server_public_ip: 初回構築用インスタンスのIPアドレス
- instance_public_ips: 全インスタンスのIPアドレスリスト
- nlb_dns_name: NLBのDNS名
Kubernetesクラスターの構築(RKE2)
上記の手順で作成した各インスタンスにログインし、RKE2を利用してKubernetesクラスターを構築していきます。
初期サーバーの構築
RKE2公式ドキュメントの「High Avalilability」の内容に基づき、Control Plane3台構成で冗長化した構築を行います。設定ファイルの内容が1台目と2台目以降で異なるため、分けて記載します。
- EC2インスタンスにSSH接続します。
秘密鍵はterraform実行時にterraformのコードと同じ階層に作成されます。
また、接続先のIPアドレスはterraformデプロイ完了時に出力されるinitial_server_public_ipの値を使用してください。$ ssh -i rancher_demo_instance_key.pem ubuntu@<INITIAL_SERVER_PUBLIC_IP>
- 冗長構成用の設定ファイルを作成します。
$ sudo mkdir -p /etc/rancher/rke2 $ sudo vi /etc/rancher/rke2/config.yaml
config.yamlに以下の内容を記載します。
YOUR_TOKENは任意の文字列を使用可能です。/etc/rancher/rke2/config.yaml
token: <YOUR_TOKEN> tls-san: - <INITIAL_SERVER_PUBLIC_IP>
- RKE2をインストールします。
$ curl -sfL https://get.rke2.io | sudo sh -
- RKE2のサービスを起動します。
$ sudo systemctl enable rke2-server.service $ sudo systemctl start rke2-server.service
- RKE2のサービスの状態がActiveになっていることを確認します。
$ sudo systemctl status rke2-server.service
- インスタンス内でkubectlコマンドを実行できるよう設定します。kubectl自体はRKE2のインストール内容に含まれています。
$ sudo chown ubuntu:ubuntu /etc/rancher/rke2/rke2.yaml $ sudo chmod 644 /etc/rancher/rke2/rke2.yaml $ sudo ln -s /var/lib/rancher/rke2/bin/kubectl /usr/local/bin/ $ sudo mkdir ~/.kube $ sudo ln -s /etc/rancher/rke2/rke2.yaml ~/.kube/config
- kubectlコマンドでノード情報を取得し、ノードのステータスがReadyになっていることを確認します。
$ kubectl get nodes
残りのサーバーの構築
EC2インスタンスにSSH接続します。
秘密鍵はterraform実行時にterraformのコードと同じ階層上に生成されます。
接続先のIPアドレスはterraformデプロイ完了時に出力されるisntance_public_ipsの値のうち、残りの2つを使用してください。$ ssh -i rancher_demo_instance_key.pem ubuntu@<INSTANCE_PUBLIC_IP>
冗長構成用の設定ファイルを作成します。
$ sudo mkdir -p /etc/rancher/rke2 $ sudo vi /etc/rancher/rke2/config.yaml config.yamlに以下の内容を記述します。2台目以降は”server”を追加します。 server: https://<INITIAL_SERVER_PUBLIC_IP>:9345 token: <YOUR_TOKEN> tls-san: - <INITIAL_SERVER_PUBLIC_IP>
- 初期サーバーと同じ手順でRKE2をインストール・設定します。
- すべてのNodeのステータスがReadyで、RoleがControl Planeになっていることを確認します。
$ kubectl get nodes
3台のノードがControl Planeとして起動していることを確認したら、クラスターの構築は完了です。
config.yaml について
config.yaml は、RKE2の動作を設定するためのファイルです。このファイルには、ノード間の通信や認証に必要な情報、クラスターの冗長構成を実現するための設定が含まれます。
具体的には以下の内容を設定します:
- server:クラスターに参加するために使用される接続先サーバー。
- token:クラスター内でノードを認証するためのトークン。全てのノードで共通。
- tls-san:サーバーのTLS証明書に追加のホスト名またはIPv4/IPv6アドレスをSubject Alternative Namesとして追加する。
Rancherのインストール
構築したクラスターにRancherをデプロイします。インストールする方法は様々な手段がありますが、本記事ではもっとも簡単なHelmを利用してインストールする方法を採用しています。なお、この手順は3台のインスタンスの内、いずれか1つに実施すれば問題ありませんが、本記事では最初の1台目で実施します。
cert-managerのインストール
Rancherは、クラスターへのセキュアなアクセスを確保するためHTTPSが必須です。そのため、SSL証明書を簡単に管理できるcert-managerを事前にインストールします。
- EC2インスタンスにSSH接続します。
$ ssh -i rancher_demo_instance_key.pem ubuntu@<INITIAL_SERVER_PUBLIC_IP>
- Helmをインストールします。
$ sudo curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
- cert-managerのHelmリポジトリを追加します。
$ helm repo add jetstack https://charts.jetstack.io $ helm repo update
- cert-managerをインストールします。
$ helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --set crds.enabled=true --version v1.16.1
- cert-managerのPodが正常に起動しているか確認します。
$ kubectl get pod -n cert-manager
Rancherのインストール
cert-managerの準備が完了したら、Rancherをインストールします。
RancherのHelmリポジトリを追加 $ helm repo add rancher-latest https://releases.rancher.com/server-charts/latest $ helm repo update
- Rancherをインストールします。
$ helm install rancher rancher-latest/rancher \ --namespace cattle-system \ --create-namespace \ --set hostname=<NLB_DNS_NAME> \ --set replicas=3 \ --set bootstrapPassword=<YOUR_INITIAL_PASSWORD> \ --set ingress.tls.source=letsEncrypt \ --set letsEncrypt.email=<YOUR_EMAIL>
- RancherのPodが起動していることを確認します。起動が完了するまで数分程度かかります。
$ kubectl get pod -n cattle-system
- ブラウザにNLBのドメインを入力してアクセスします。もし、アクセスできない場合はrancherのPodの起動が完了していない可能性があるので、Podのステータスを確認してください。
- RancherのUIに初回アクセスすると、初回パスワードの入力を要求されます。Helmのvalueとして設定したbootstrapPasswordの値を入力します。2回目以降のログインではRancherが自動生成した「New Password」を使うので、控えておいてください。
初回ログイン時はユーザーネームを要求されませんが、2回目以降のログイン時はユーザーネームの入力が必要です。デフォルトのユーザーネームは「admin」です。
- 利用規約に同意する(By checking the box~…の箇所)にチェックを入れて、「Continue」を押下します。
- Rancherのホーム画面に遷移したことを確認します。構築が正常に完了していると、Rancherが稼働しているクラスター自身(画面内のlocalという名称のクラスター)が管理対象として登録されています。
- サイドバーからlocalクラスターを選択すると、クラスターの詳細情報を見ることができます。
これでRancherの構築は完了です。RancherのUI画面から、クラスターや各種リソースの管理を開始できます。
構築時のトラブルシューティング
RKE2のサービスが起動しない
RKE2のサービス (rke2-server.service) が正常に起動しない場合、以下の点を確認してください。
必要なポートが開放されていない
RKE2クラスターが正常に稼働するには、必要なポートが開放されている必要があります。ポートが開放されていない場合、サービスの起動が失敗します。
例:サービス起動失敗時のログ
Nov 18 02:45:11 ip-10-1-2-193 rke2[66864]: time=”2024-11-18T02:45:11Z” level=fatal msg=”etcd cluster join failed: duplicate node name found, please use a unique name for this node”
Nov 18 02:45:11 ip-10-1-2-193 systemd[1]: rke2-server.service: Main process exited, code=exited, status=1/FAILURE
対処方法:
- セキュリティグループの設定を見直し、RKE2の稼働に必要なポートが開放されているか確認してください。
- Rancherの稼働に必要なポート要件については、公式ドキュメントPort RequirementsページのPorts for Rancher Server Nodes on RKE2を参照してください。
※RKE2だけではなく、Rancherの起動時にも利用するポート開放の設定は影響します。また、RKE2以外のディストリビューションでRancher用のKubernetesクラスターを構築した場合は、必要なポートが異なります。詳しくは、公式ドキュメント「Port Requirements」のRancher Nodesの項目を参照してください。
config.yamlの設定ミス
/etc/rancher/rke2/config.yaml の設定に誤りがあると、RKE2が正常に接続できず、サービスの起動に失敗する場合があります。特に、server パラメーターの設定ミスが原因で接続に失敗するケースがよく見られます。
対処方法:
- config.yaml に記載されている server パラメーターの記述が正しいか確認してください。特に、初期サーバーのIPアドレスやポート番号(9345)を間違えないように注意してください。
- token がクラスター全体で一致していることを確認してください。
まとめ
今回の記事では、公式ドキュメントを参考に、AWS環境上にRKE2を利用してKubernetesクラスターを構築し、その上にRancher Serverを導入する手順を解説しました。Rancherを活用することで、クラスターの管理や運用を効率的に行える基盤を構築することができます。また、RancherはRKE2だけではなく、EKSなどのマネージドKubernetesサービスを含む他のKubernetesクラスターにも導入が可能なので、多様な運用要件に柔軟に対応することができます。
次回の記事では、今回構築したRancher Serverを活用して、マルチクラスターを管理する方法について解説します。複数のKubernetesクラスターを一元管理し、より高度な運用を行うための手法をご紹介しますので、ぜひご期待ください。