以前Kong Prometheus Pluginで非Promethus対応のサービスのメトリクスを取得するという記事でKong Gateway利用時にGatewayを通過する通信のメトリクスの取得方法を確認したが、RBAC化した場合上手く動かなくて少しハマったので対応策をメモに残す。
問題の背景
Kong GatewayでPrometheus用のメトリクスを取得しようと思った場合、Admin APIの/metrics
を叩くと公式のドキュメントには記載がある。
ただ、RBACを有効化した状態だと認証が通らず以下のようなエラーとなる。
$ curl https://kong.${MYHOST}/api/metrics -k
{"message":"Invalid credentials. Token or User credentials required"}
認証を突破するにはヘッダに"kong-admin-token:<AdminのPassword>"
を渡せば突破できる。
$ curl https://kong.${MYHOST}/api/metrics -k -H kong-admin-token:kong
- # TYPE kong_bandwidth_bytes counter
:(省略)
ただ、厄介なのがこのヘッダの形式は(おそらく)Prometheusに直接渡す事が出来ない。
少なくともPrometheus Operatorのkind: ScrapeConfig
では渡せる認証はBasic認証かAuthenticationヘッダの指定のみとなっている。
そのため、Admin APIが期待するヘッダ(kong-admin-token
)をPrometheus内に設定することが出来ない。
対応策
認証なしで/metrics
にアクセスする方法があるのでこれを使う。
Kong Gateway内にはStatus APIと呼ばれるヘルスチェック用のAPIが用意されている。
公式ドキュメントにはこの辺に記載がある。
これには/status
しか書いていないが、実は/metrics
でメトリクスも取得することが出来る。
なのでこれを使って取得してみる。
なお、Kong GatewayのHelmChartの説明には明確にService
やIngress
を提供しないと記載されているため、手動で作成する。
cat <<EOF > ./status-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: kong-status
namespace: kong
spec:
ports:
- name: status
port: 8100
protocol: TCP
selector:
app.kubernetes.io/component: app
app.kubernetes.io/name: kong
EOF
kubectl apply -f ./status-svc.yaml
次にPrometheusとKong Gatewayが異なるクラスタに存在するなどの場合はIngress
も作成する。(ここでは省略する)
Prometheus Operatorを使っている場合、ScrapeConfig
を作成してスクレイピングを行う。
cat <<EOF > ./scraping.yaml
apiVersion: monitoring.coreos.com/v1alpha1
kind: ScrapeConfig
metadata:
labels:
release: prometheus-stack
name: scraping-kong
namespace: kong
spec:
metricsPath: /metrics
scheme: HTTP
staticConfigs:
- labels:
job: kong-gateway
targets:
- kong-status.kong.svc:8100
EOF
kubectl apply -f ./scraping.yaml
変更適用後、ScrapeInterval(デフォルトで30秒)待つと以下のようにRBACが有効な環境でも無事メトリクスを見に行くことが出来た。
なお、今回作成したService
はHelmChartと別管理になるため、デプロイやアップグレード時の修正などライフサイクル管理を行う際は取りこぼさないよう気をつける必要がある。
※追記
公式の説明はここにある。
色々試行錯誤し、記事化した後に公式の説明があるのに気がついた。。。