cloudflared tunnel をモニターする
はじめに
cloudflared の監視について。
devdoc には 3 種類の記載があります。
Logs
用途
cloudflared ログのおもなユースケースは、接続エラーなどのトラブルシュートになると思います。
実装
ローカルファイルへの出力
起動ファイルやコマンド引数に設定を書いておくと
$ grep log config.yaml
loglevel: info
transport-loglevel: info
logfile: /home/ubuntu/log/cloudflared.log
ログがファイルに出力されます。
{"level":"info","time":"2024-04-25T08:57:24Z","message":"Initial protocol quic"}
リモートでストリーム出力
リモートからストリームでログを観察できます。
パフォーマンス面で注意点あり
~ $ cloudflared tunnel list
You can obtain more detailed information for each tunnel with `cloudflared tunnel info <name/uuid>`
ID NAME CREATED CONNECTIONS
<Tunnel_Uuid> Tun1 2023-09-03T10:27:29Z 2xnrt05, 1xnrt07, 1xnrt08
~ $ cloudflared tail --output=json <Tunnel_Uuid>
{"time":"2024-04-25T09:38:10Z","message":"tcp proxy stream ...
{"time":"2024-04-25T09:38:10Z","message":"downstream-\u003eupstream ...
Notifications
用途
トンネルの突発的な状況変化イベントを管理者に知らせます。
実装
ダッシュボードから Notification を設定します。
Email や Webhook で送信されます。
Metrics
用途
トンネル稼働状況の継続的な把握、負荷などの傾向予測に利用します。
外部ツールとの連携で、トンネルが複数ある場合も、一元で可視化することができます。
実装
Metrics サーバーの公開
cloudflared を起動すると、その状況をさらす Metrics サーバーが立ち上がります。
それに外からアクセスするようにします。
-
--metrics <Listen_IP:Port>
で NIC の IP を指定し起動
$ cloudflared tunnel --config config.yaml --metrics 172.16.0.147:60123 run oc1
- メトリックが取れるか確認
## TCP と UDP のアクティブセッションを確認(cloudflared が仲介する TCP/UDP セッション)
$ curl 172.16.0.147:60123/metrics -s | egrep '^cloudflared_(udp|tcp)_active_sessions'
cloudflared_tcp_active_sessions 0
cloudflared_udp_active_sessions 0
## cloudflared 経由で UDP 接続する
## cloudflared_udp_active_sessions が上がる
@server
$ nc -lku 1234
@remote
$ nc -u 172.16.0.253 1234
$ curl 172.16.0.147:60123/metrics -s | egrep '^cloudflared_(udp|tcp)_active_sessions'
cloudflared_tcp_active_sessions 0
cloudflared_udp_active_sessions 1
## cloudflared 経由で TCP 接続する
## cloudflared_udp_active_sessions が上がる
@server
$ nc -lk 1234
@remote
$ nc 172.16.0.253 1234
$ curl 172.16.0.147:60123/metrics -s | egrep '^cloudflared_(udp|tcp)_active_sessions'
cloudflared_tcp_active_sessions 1
cloudflared_udp_active_sessions 0
Metrics 値の可視化
devdoc の手順にそえば、Grafana で見れるようなります。
ただ今回は一部追加した部分があります。
1. 監視用サーバーに Prometheus と Grafana のダウンロードとインストール
2. prometheus.yml
の編集
- job_name: "cloudflared"
static_configs:
- targets: ["172.16.0.147:60123"] ## cloudflared server IP and the --metrics port configured for the tunnel
- job_name: "cfd_nodes"
static_configs:
- targets: ["172.16.0.147:9100"] ## cloudflared server IP and node exproler
cfd_nodes の方は、devdoc の例に記載がありません。
cloudflared のメトリック採取自体には不要な設定です。
ただ、cloudflared が動くサーバーの sysctl の設定が推奨値を設定しているかも一緒に取りたかったので、OS のメトリック採取目的で追加しました(↓3)。
3. cloudflared サーバーに Prometheus Node Exporter をインストール(オプション)
cloudflared の推奨環境の一つに、仲介時に利用できる送信元ポートの数に余力を持たせておくこととあり、net.ipv4.ip_local_port_range = 11000 60999
5 万ほど確保している例が示されています。
稼働サーバーでその値が何になっているか、を取るために Node Exporter を導入します。
Ubuntu 22.04 の apt で導入すると、sysctl を読むオプションがないバージョン(1.3.1)のようで、ソースから Latest 1.8.0 をインストールしました。
sysctl はデフォルトで読むリストから除外されていたので、sysctl を追加し、起動します。
$ ./node_exporter --collector.sysctl --collector.sysctl.include=net.ipv4.ip_local_port_range
4. 観測
下記あたりを観測してみました。
cloudflared のキャパシティを設計するツール で使うためのパラメータを cloudflared から採取。
- cloudflared_tcp_total_sessions
- cloudflared_udp_total_sessions
OS の利用可能ポート数を確認する項目を Node Exporter から採取。
- sysctl.net.ipv4.ip_local_port_range
空きポートは推奨より 2 万ほど少ないのがわかります。
5. 通知
Cloudflare の通知機能は今のところトンネルの状態変化(Up, Down など)に限られますが、Grafana のアラート機能も併用すると、トンネルの負荷状況についても、しきい値で監視ができそうです。
下記は TCP 同時接続数がしきい値(1)を超えて(5)でアラートが発射された例になります。
その他
よくあるエラー
最後に
日々の運用のなかで、これも監視すると効果的、こんな方法がある、などの情報をお持ちでしたら、ぜひ共有していただければと思います。
全国の cloudflared 友の会のみなさまにとってハッピートンネルライフが訪れますように。
Discussion