564 Views
August 25, 24
スライド概要
長野県から湧いたITエンジニアのようなもの。生水。このアカウントで展開される主義主張は全て個人の見解です。SR400/ZD11S乗り。科甲'12/ISUCON6 1st student/ICTSC6 3rd/ISUCON13 132nd ActivityPub: @[email protected]
nginx-proxy + acme-companion から Traefik proxy への移行 ふぉの: @[email protected] 2024 年 8 月 25 日 FediLUG 勉強会 1
自己紹介 ● 「ふぉの」と呼ばれています ● @[email protected] ● 趣味 ○ 旅(バイク, 鉄道, 自動車) ○ 自宅サーバ/インフラ ○ アニメの一気見 ● 長野県出身, 茨城県在住 ● Web系(UGCサービス)会社員 ● 仕事(開発環境)ではDebian ● 趣味ではUbuntu(WSL含む) 2
ふぉの鯖 ● ● ● とは何か のノード構成 のネットワーク構成 nginx-proxy + acme-companion 今日話すこと ● ● ● とは何か をどのように使ってきたか でなにが起きたか Traefik proxy ● ● ● ● とは何か でこれから登場する概念を一気に図示する へどのように移行したか のmastodonのプロキシ設定例 今後の課題 感想 3
ふぉの鯖とはなにか 広義: 私が運用する計算機資源 狭義: ma.fono.jp 知人友人間で適当に貸したり私が遊んだりし ている。 左の計算機資源で動く、 mastodonサーバーのこと。 2009年ぐらいからずっと自宅サーバーをやっ ていて、なかなかやめられない趣味になって いる。 惰性で6年目に入ろうとしている。 登録は可能なはずだが、特に人気だと か流入に困った試しがない。 FederationRelayがなくなったら 多分やめる、限界個人サーバー。 4
ふぉの鯖のノード構成 Ubuntu + Docker DockerSwarm 各ノードはネイティブの Ubuntuマシンで、いわゆる「仮想 マシン」は一部のノードを除き使っていない。 composeファイルを書くだけで、複数拠点・ 複数台構成と計算機資源の融通を実現す るために導入 環境を汚さないために、ワークロードはコンテナに隔離 が原則。 「動作する docker-compose.ymlを書いて、追加の設定を 書けばグローバル公開できる」が基本。 例: 友人「Minecraftサーバーを立てたい」 (dockerグループ権限のついたユーザーを発行 ) 私「こう書けばいける」 3拠点4ノード。個別にDockerComposeで 使うのは流石に無理。 リソースを使えるようにするために、一旦 DockerSwarmを採用した。 基本、DockerComposeにoverlayとか deploymentを書き足すだけで動く。 5
ふぉの鯖のネットワーク構成 3拠点4ノードの構成 IPv4 over IPv6/IPsec with OSPF でローカルのセグメントを拠点間で疎通 できるようにしている。 (コンテナ仮想化のoverlayはまた別) これらのノードにMastodonのコンテナを ばら撒き、分散処理している。 6
nginx-proxy + acme-companionとはなにか nginx-proxy acme-companion ● ● ● ● ● ● nginx-proxy/nginx-proxyのこと Dockerコンテナに設定された環境変数 を読んでnginxのプロキシ設定を生成す る 裏では nginx-proxy/docker-gen がコン テナ状態の変化を検知し、golangの Templateに値を流し込んで設定を生成 してリロードしている ● nginx-proxy/acme-companion のこと nginx-proxy と一緒に使われる 雑に言うと証明書発行してLet’s Encrypt を通してくれるやつ 名前の通り、ACME Challenge をやっ てくれるというのが正確 7
nginx-proxy + acme-companionをどのように使ってきたか とりあえず変数を設定すればリ バースプロキシしてくれる君 ● ● ● 右はリバースプロキシ背後に配置する 場合の設定例 (environmentがカギ) nginx-proxyのプロキシ内側networkを overlayしておくと超絶便利 (物理ノードを跨いでどのプロキシにぶら 下がるかを自由に選べる) 勿論自動でTLS終端してくれる 8
nginx-proxy + acme-companionでなにが起きたか 証明書発行周りの辛さ ● ● ● ● 複数の証明書を発行するときにキャッ シュ的なのが賢くない 停電とか設定ミスで再起動回数が嵩ん で発行できないと復旧に手間取る RateLimit回避のためにZeroSSLを利 用して証明書発行を始めたが多重発行 や、発行待機の不具合が多発 証明書が発行されていない状態が長引 き、右の事故を誘発 複雑な設定による事故 ● ● DockerSwarm未対応 Docker(Compose)としての機能で一部 運用はできるが事故率が高い 自前のnginx設定で証明書を指定するこ とがあるが、発行中で消えている場合、 立ち上がらない状態になる 要するに [emerg] cannot load certificate "/path/to/cert" をログに延々と吐いて止まる 最大の問題 : これでTLS終端するので「一緒に全部落ちる」 9
Traefik proxyとはなにか Traefik LabsのOSS リバースプロキシ (当然) ● traefik/traefik のこと ついでに下記の機能がある ● ● ● ● ● ● Traefik LabsでTraefik冠の製品群 があるが、Traefik proxyと名乗って いる Gopherがマーシャラーを しているマスコット ● TLS終端(ACME Challenge) Web管理画面 環境に応じたサービスディスカバリ Docker(Swarm含む), k8s, などのイン フラに対応 k8sのIngressとして使える 10
Traefik proxyでこれから登場する概念を一気に図示する ● 公式資料が最王手 ● Entrypoint で待ち受ける 具体は特定 PortへのListenか パケット転送ルールになる ● Ruleで振り分ける SNIとかパスとかで分ける ● Middleware で弄る HTTPSのリダイレクト、 プロキシ元 IPのヘッダ追加等 ● Service の定義に従って移譲する 単一アドレスへプロキシしたり 分散ミドルウェアの仮想 IPにプロキシし たり https://doc.traefik.io/traefik/routing/overview/#overview より 11
Traefik proxyへどのように移行したか(1 / 4) ダウンタイムレスは諦めた ● ● ● ● デーモンとしては無停止で、 Swarmのロー リングアップデートで移行 (だがアクセスは止まるので無意味 ) nginx-proxyを使っている時点で、 中小規模。やる気はなかった 物理ノードでnginx-proxyに80, 443ポート を掴まれてしまっている時点で、 単一ノードでのダウンタイムレス移行は不 可能 別の物理ノードでサービスを展開しなおし て、アクセスを完全に別の場所で受ける必 要がある 手順 1. 2. 3. 4. 一部のサービスを別ホストへ退避させる nginx-proxyを終了 Traefik proxyをセットアップ Traefik proxyを使う側の設定 ● ● ● 主に3,4を説明する 1は様々なやり方がある 2は単なるdocker compose down 12
Traefik proxyへどのように移行したか(2 / 4) Traefik proxyをセットアップ ● ● ● providersでDockerやSwarmなど環境 に応じた機能が提供される ○ watch=trueで常時監視・追従 ○ exposedbydefault=false で立ち上げたやつ全部にとりあえず リバースプロキシしなくなる entryPoints.[name].address=[a ddress]でlistenするやつに命名 あとはZeroSSL対応設定 ○ certificatieresolvers.[cu stom_name]で指定してセットアッ プしている ○ 気になる人は聞いて下さい 13
Traefik proxyへどのように移行したか(3 / 4) Traefik proxyを使う側の設定 ● ● ● ● ● docker-compose.ymlを書き換えるだけ nginx-proxy用のenvironmentを消す traefik.enable この設定はexposedbydefault=falseの時 に必要 traefik.http.routers サービス名とプロキシ設定 ○ rule: ルーティングルール ○ tls: TLS終端設定を有効化して 証明書の紐づけ方を名前で指定 ○ entrypointsで待ち受け指定 services.[service_name].loadbalanc er.server.port プロキシされるポートを指定 14
Traefik proxyへどのように移行したか(4 / 4) 1. 既存構成をdocker-composeやnginxの設定から読み取る 2. Traefik proxy本体はコマンドライン引数で全部設定 3. 使う側はConfigurationDiscoveryの例に従って書く ⇒ コマンドライン引数でもラベルでも設定できるので便利 後述のDockerSwarmでmastodonの TLS終端&プロキシ設定する場合の例で解説するが 直截的、シンプルに設定できる 15
Traefik proxyのmastodonプロキシ設定例(1 / 2) web 16
Traefik proxyのmastodonプロキシ設定例(2 / 2) streaming 17
今後の課題 複数台構成 ● ● ● ● ● 実はDockerComposeで上げている DockerNetwork経由でSwarmへ Swarmで上げた場合 全Managerからアクセス可能になる 雑にやると入口ノードを制約できない ○ 可用性の面では歓迎できる ○ 制御性の面では歓迎できない entrypointを分けるとか やりかたを検討しないといけない k3s構成 ● ● ● canonical/multipass でVMを建てて試験中 一旦LBをCalicoとしてしまった ○ YAMAHAルータでiBGPピアリング ○ 滅茶苦茶シームレス ○ TLS終端はできない Multiple Ingressという沼 ○ 設定可能らしい ○ TLS終端はTreafik ○ それ以外はCalico 本音: 「未だ本番運用の目処も立ってないんだが?」 18
感想 ● ちゃんと刺さる選定が出来て楽になった この裏でk3s(CalicoやTraefik)の構成実験をしていた ついでにその過程で少しTraefikと仲良くなれていた ● 5年間使ったソフトウェアをやめた 「枯れて」いたが、Swarm採用と分散実行あたりから 要求とのミスマッチにより「腐って」しまっていた ● 趣味とはいえ慣れで感覚が麻痺していた これは反省。いわゆる「当たり前基準」が落ちていた 分散でディスカバリ出来ないものを使うのは「おかしい」 19
ご清聴ありがとうございました 20