初歩的なところなのに時間を食ってしまったのでメモ化。
KonnectだとAnalyticsというメトリクスの分析ツールが提供されるが、自前で既にPrometheus/Grafana環境を持っている人はKonnectの分析ツールを使わずに自前の環境にメトリクスを集約したいということも多いと思う。
今回はKonnect利用時にアプリへのトラフィックのメトリクスをPrometheus/Grafanaで可視化する方法をメモ化する。
前提
以下の環境で検証する。
- Kubernetes環境
- Prometheus/Grafanaは同一クラスタ内に展開済み
- スクレイプの設定はPrometheus OperatorのCRDの
ServiceMonitor
を利用
Prometheus/Grafanaは「cert-managerとPrometheus OperatorでTLS化したPrometheus/Grafanaを立てる」の手順で構築したものを使う。
Data Planeの構築
Data Planeに設定を施す必要があるのでData Planeの構築から行う。
KonnectのUIからData Plane Nodes
->Configure data plane
を選択する。
選択後の画面でPlatformにKubernetesを選択するとKubernetes向けのセットアップ手順が表示されるので、これに従ってvalues.yaml
を作るところまで進める。
values.yaml
作成時、以下を追記する。
serviceMonitor:
enabled: true
labels:
release: prometheus-stack
status:
enabled: true
http:
enabled: true
containerPort: 8100
メトリクスの取得にはStatus APIを利用する。
Kong Gatewayのメトリクス取得はAdmin APIの/metrics
かStatus APIの/metrics
を使って取得するが、Admin API経由は以下のようなデメリットがある。
- RBAC利用時に使えない(Prometheusにスクレイプさせるのが難しい)
- Control Planeにアクセス出来る必要あり(=Konnect環境では利用不可)
Status APIだと上記のデメリットを回避でき、Konnectの場合だと選択肢はこれのみとなる。
Status APIを使うためにstatus:
を記載してDeploymentにStatus API用の設定が埋め込む。
なお、コードを見る感じ、StatusAPIのためのServiceリソースは作られない模様。
あと、Prometheusが自動で/metrics
を見つけてスクレイプするためのServiceMonitor
リソースを作成するためにserviceMonitor:
の設定を入れている。
ラベルを指定しているのはPrometheus OperatorのServiceMonitor検知ルールに従うため。
詳細は以前書いたこちらの記事を参照して欲しいが、環境によって違う場合があるので各自のものを確認の上設定して貰った方がよい。
上記設定でデプロイする。
helm upgrade -i -n kong my-kong kong/kong -f ./values.yaml --debug --wait
デプロイ後、StatusAPI用のServiceを作成する。
kubectl expose deploy my-kong-kong --port 8100 --name my-kong-kong-status --type ClusterIP -n kong -l enable-metrics="true"
なおラベルはServiceMonitor
が検知するためのもので、ServiceMonitor
のspec.selector.matchLabels
でスクレイプ対象が定義されている。
上手く行けばPrometheusのTargetsに以下のようにDPのエンドポイントが追加される。
PromQLでKong関連のメトリクスが見れることも確認する。
動作確認
適当にService、Routeを作成し、Prometheus Pluginを適用する。
今回は以下のものを作成した。(作成手順は割愛)
- Service
- Service名はhttpbin-service
- https://httpbin.org
- Route
- /httpbin
- Plugin
- Prometheus PluginをRouteに設定
- Pluginのメトリクスのチェックは全てON
作成後、DP経由でアクセスする。
watch curl dp.my.domain/httpbin/anything
アクセス後、Prometheusを見ると以下の様な感じでexported_service
のタグに作成したサービス名が設定されたメトリクスが確認できる。
kong_http_requests_total{code="200", container="proxy", endpoint="status", exported_service="httpbin-service", instance="192.168.28.183:8100", job="my-kong-kong-proxy", namespace="kong", pod="my-kong-kong-69474c4b-mhr6t", route="d3f0119f-bfe4-480d-a681-4a7d4592e214", service="my-kong-kong-proxy", source="service", workspace="default"}
ここでは割愛するが、Grafanaのダッシュボードからもメトリクスが確認できる。