外部TLS終端のRancher構築におけるリダイレクト問題の解決法

はじめに

こんにちはサイオステクノロジーの小野です。今回はRancherを構築後にWebUIにアクセスしたらリダイレクトが繰り返されるエラーが発生して解決に時間がかかったので、その解決方法を共有します。

今回の構成

前提条件

  • OS:Ubuntu 24.04.2 LTS
  • Rancher:v2.11.1
  • RKE2:v1.32.3+rke2r1
  • HAProxy:2.8.5-1ubuntu3.3

構成

今回構築したRancherの構成は以下になります。

今回構築した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にアクセスするとリダイレクトし続けて、アクセスできません。

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"

問題の原因

問題が発生する流れは以下になります。

  1. ユーザーがLBにHTTPSアクセスする
  2. LBでTLS終端する
  3. LBからRancherにHTTPアクセスする
  4. RancherがHTTPアクセスを安全でないと判断して、HTTPSアクセスするようにLBにリダイレクトする
  5. LBはRancherからのリダイレクトをユーザーに転送する
  6. 1に戻る

このような処理が繰り返されることでリダイレクトの無限ループが発生します。

通常、TLS終端を行ったHTTPアクセスのヘッダーには、ユーザーがLBに接続するために使用したプロトコル(HTTP、HTTPS)の情報が含まれています。Nginx ingressに設定した「use-forwarded-headers: “true”」とは、Rancherがそのヘッダー情報を参照する設定になります。

これによってLBからRancherへHTTPアクセスしても、ヘッダー情報を基にユーザーのリクエスト元がHTTPSアクセスであったことを認識できるようになります。その結果、Rancherはリダイレクトを行わなくなり、無限ループが解消されます。

終わりに

コンテナプラットフォームを構築する際に、外部サーバーでLBを設定して、TLS終端することはごく一般的な構成になります。しかし、今回構築を行って、細かい部分でたくさんのエラーに遭遇してとても苦労しました。公式ドキュメントはしっかりと読むことを心掛けたいと思います。

参考

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です