はじめに
こんにちはサイオステクノロジーの小野です。今回はRancherを構築後にWebUIにアクセスしたらリダイレクトが繰り返されるエラーが発生して解決に時間がかかったので、その解決方法を共有します。
今回の構成
前提条件
- OS:Ubuntu 24.04.2 LTS
- Rancher:v2.11.1
- RKE2:v1.32.3+rke2r1
- HAProxy:2.8.5-1ubuntu3.3
構成
今回構築したRancherの構成は以下になります。
RKE2クラスタを3台冗長構成で構築して、これをRancherのRMSクラスタとして利用します。
また、外部にLBサーバー(HAProxy)を置いて、それによってRMSクラスタをロードバランスします。その際にRancherへのアクセス時のTLS終端をHAProxyで行います。
TLS終端はopensslによって自己署名証明書を発行して、それを利用します。
HAProxyの設定ファイルは以下のように設定しました。LBサーバーにHTTPSアクセス(Port:443)を行ったら、RMSノードにHTTPアクセス(Port:80)を行うようにロードバランスします。
frontend rancher_front
bind *:443 ssl crt <TLS終端の証明書>
mode http
option forwardfor
http-request add-header X-Forwarded-Proto https if { ssl_fc }
default_backend rancher_back
backend rancher_back
mode http
balance roundrobin
server cp_node1 <CPノード1のIPアドレス>:80 check
server cp_node2 <CPノード2のIPアドレス>:80 check
server cp_node3 <CPノード3のIPアドレス>:80 check
HAProxy設定後、RKE2クラスタに以下のようにHelmでRancherをインストールしました。
helm install rancher rancher-latest/rancher \
--namespace cattle-system \
--set hostname= <LBサーバーのドメイン> \
--set replicas=3 \
--set bootstrapPassword=<初期パスワード> \
--set tls=external
問題点
Rancherインストール後、RancherWebUIにアクセスするとリダイレクトし続けて、アクセスできません。
RancherのGithubのIssusesでも関連した問題が報告されています:https://github.com/rancher/rancher/issues/35088
解決方法
公式ドキュメントに解決方法が載っていました。
Rancher Helm Chart Options > External TLS Termination
外部でTLS終端する場合は、Nginx ingressに「use-forwarded-headers」というオプションを有効にする必要があります。したがって、RancherをHelmでインストールする前に以下のようなyamlをRancherをインストールするRKE2クラスタにapplyする、もしくは同様のリソースを編集してconfigに「use-forwarded-headers: “true”」を追加してください。
apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
name: rke2-ingress-nginx
namespace: kube-system
spec:
valuesContent: |-
controller:
config:
use-forwarded-headers: "true"
問題の原因
問題が発生する流れは以下になります。
- ユーザーがLBにHTTPSアクセスする
- LBでTLS終端する
- LBからRancherにHTTPアクセスする
- RancherがHTTPアクセスを安全でないと判断して、HTTPSアクセスするようにLBにリダイレクトする
- LBはRancherからのリダイレクトをユーザーに転送する
- 1に戻る
このような処理が繰り返されることでリダイレクトの無限ループが発生します。
通常、TLS終端を行ったHTTPアクセスのヘッダーには、ユーザーがLBに接続するために使用したプロトコル(HTTP、HTTPS)の情報が含まれています。Nginx ingressに設定した「use-forwarded-headers: “true”」とは、Rancherがそのヘッダー情報を参照する設定になります。
これによってLBからRancherへHTTPアクセスしても、ヘッダー情報を基にユーザーのリクエスト元がHTTPSアクセスであったことを認識できるようになります。その結果、Rancherはリダイレクトを行わなくなり、無限ループが解消されます。
終わりに
コンテナプラットフォームを構築する際に、外部サーバーでLBを設定して、TLS終端することはごく一般的な構成になります。しかし、今回構築を行って、細かい部分でたくさんのエラーに遭遇してとても苦労しました。公式ドキュメントはしっかりと読むことを心掛けたいと思います。
参考
- Rancher公式ドキュメント:https://ranchermanager.docs.rancher.com/