EKS Auto ModeにデプロイしたKong GatewayをGrafanaで観測する

EKS Auto ModeにデプロイしたKong GatewayをGrafanaで観測する

Clock Icon2025.02.27

ゲームソリューション部の えがわ です。

前回構築したKong GatewayをGrafanaで監視してみたいと思います。

環境

  • Ubuntu 22.04.4 LTS(WSL2)
  • kubectl: v1.31.0
  • eksctl: 0.204.0

やってみる

前回構築したKong Gatewayをそのまま使用します。
構築の手順につきましては以下をご確認ください。

https://dev.classmethod.jp/articles/kong-gateway-eks-auto-mode-konnect/

StorageClassを作成

PrometheusやGrafanaのデータ永続化のためのStorageClassを作成します。

ebs-sc.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: eks-auto-ebs-csi-sc
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"
provisioner: ebs.csi.eks.amazonaws.com
volumeBindingMode: WaitForFirstConsumer
parameters:
  type: gp3
kubectl apply -f ebs-sc.yaml
実行例
egawa@HL01559:kong-o11y$ avp kubectl apply -f ebs-sc.yaml
storageclass.storage.k8s.io/eks-auto-ebs-csi-sc created

※コマンドのavpはaws-vaultのエイリアスです。

Prometheus Stackをインストール

Prometheus Stack(kube-prometheus-stack)は、Prometheus、Grafana、Alertmanager などの主要なモニタリングコンポーネントをまとめてデプロイできる Helm チャートです。

https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

Helmチャート用のvaluesを作成します。
今回は検証環境のため、SSL証明書は設定せずALBのDNS経由で接続します。
Ingressも同時に設定することができますが、同一のALBでパスルーティングしたいため、ここでは設定していません。

prometheus-stack-values.yaml
# ----------------------
# Alertmanager 設定
# ----------------------
alertmanager:
  ingress:
    enabled: false

  alertmanagerSpec:
    storage:
      volumeClaimTemplate:
        spec:
          storageClassName: eks-auto-ebs-csi-sc
          accessModes: ["ReadWriteOnce"]
          resources:
            requests:
              storage: 5Gi
    retention: 120h
    routePrefix: /alertmanager

# ----------------------
# Grafana 設定
# ----------------------
grafana:
  adminPassword: "admin"
  ingress:
    enabled: false

  persistence:
    enabled: true
    type: statefulset
    storageClassName: eks-auto-ebs-csi-sc
    accessModes:
      - ReadWriteOnce
    size: 10Gi
    finalizers:
      - kubernetes.io/pvc-protection

  grafana.ini:
    server:
      root_url: "%(protocol)s://%(domain)s/grafana"
      serve_from_sub_path: true

# ----------------------
# Prometheus Operator / Admission Webhooks
# ----------------------
prometheusOperator:
  admissionWebhooks:
    certManager:
      enabled: false

# ----------------------
# Prometheus 設定
# ----------------------
prometheus:
  prometheusSpec:
    storageSpec:
      volumeClaimTemplate:
        spec:
          storageClassName: eks-auto-ebs-csi-sc
          accessModes:
            - ReadWriteOnce
          resources:
            requests:
              storage: 10Gi
    retention: 7d
    scrapeInterval: 30s
    routePrefix: /prometheus
    externalUrl: /prometheus

  ingress:
    enabled: false
helm upgrade -i -f prometheus-stack-values.yaml prometheus-stack prometheus-community/kube-prometheus-stack -n prometheus-stack --create-namespace --wait
実行例
egawa@HL01559:kong-o11y$ avp helm upgrade -i -f prometheus-stack-values.yaml prometheus-stack prometheus-community/kube-prometheus-stack -n prometheus-stack --create-namespace --wait
Release "prometheus-stack" has been upgraded. Happy Helming!
NAME: prometheus-stack
LAST DEPLOYED: Thu Feb 27 13:52:31 2025
NAMESPACE: prometheus-stack
STATUS: deployed
REVISION: 1
NOTES:
kube-prometheus-stack has been installed. Check its status by running:
  kubectl --namespace prometheus-stack get pods -l "release=prometheus-stack"

Get Grafana 'admin' user password by running:

  kubectl --namespace prometheus-stack get secrets prometheus-stack-grafana -o jsonpath="{.data.admin-password}" | base64 -d ; echo

Access Grafana local instance:

  export POD_NAME=$(kubectl --namespace prometheus-stack get pod -l "app.kubernetes.io/name=grafana,app.kubernetes.io/instance=prometheus-stack" -oname)
  kubectl --namespace prometheus-stack port-forward $POD_NAME 3000

Visit https://github.com/prometheus-operator/kube-prometheus for instructions on how to create & configure Alertmanager and Prometheus instances using the Operator.

Prometheus StackのIngress設定

単一のALBでパスルーティングしたいので、別途設定ファイルを設けてデプロイします。

prometheus-stack-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: prometheus-stack-mono-ingress
  namespace: prometheus-stack
  annotations:
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP":80}]'
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/group.name: "prometheus-stack-monitoring"
spec:
  ingressClassName: eks-auto-alb
  rules:
  - http:
      paths:
      - path: /grafana
        pathType: Prefix
        backend:
          service:
            name: prometheus-stack-grafana
            port:
              number: 80
      - path: /alertmanager
        pathType: Prefix
        backend:
          service:
            name: prometheus-stack-kube-prom-alertmanager
            port:
              number: 9093
      - path: /prometheus
        pathType: Prefix
        backend:
          service:
            name: prometheus-stack-kube-prom-prometheus
            port:
              number: 9090
kubectl apply -f prometheus-stack-ingress.yaml
実行例
egawa@HL01559:kong-o11y$ avp kubectl apply -f prometheus-stack-ingress.yaml
ingress.networking.k8s.io/prometheus-stack-mono-ingress created

いったん確認

ALBのDNSを確認します。

egawa@HL01559:kong-o11y$ avp kubectl get ingress -n prometheus-stack
NAME                            CLASS          HOSTS   ADDRESS                                                                   PORTS   AGE
prometheus-stack-mono-ingress   eks-auto-alb   *       k8s-promethe-promethe-xxxxxxx.us-east-1.elb.amazonaws.com   80      50m

Prometheusのダッシュボードを確認します。

http://{ALBのDNS}/prometheus

kong_eks_auto_mode_grafana_08.png

Grafanaのダッシュボードを確認します。

http://{ALBのDNS}/grafana

kong_eks_auto_mode_grafana_09.png

問題なさそうです。

Kong Gatewayプラグインの設定

PrometheusとGrafanaの起動が完了したので、Kong GatewayのPrometheusプラグインを有効にします。

今回はユーザーサービス全体を有効にしてみます。

プラグイン画面に遷移し、Prometheusを選択します。
kong_eks_auto_mode_grafana_01.png

任意のMetricsを選択します。
kong_eks_auto_mode_grafana_02.png

設定することでPrometheusプラグインが有効になります。
kong_eks_auto_mode_grafana_03.png

Kongの設定はこれだけです。

Prometheusのスクレイプ設定

Prometheusからのスクレイプを有効にするため、ServiceMonitorをデプロイします。
Prometheusプラグインを有効にすると/metricsが公開されます。
どのポートを指定すればいいのか分からなかったのですが、ヘルスチェック用ポート(status)を指定することでスクレイピングできました。

service-monitor-kong.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: kong-gateway-monitor
  namespace: prometheus-stack
  labels:
    release: prometheus-stack
spec:
  selector:
    matchLabels:
      app: kong-gateway
  namespaceSelector:
    matchNames:
      - kong
  endpoints:
    - port: status
      path: /metrics
      interval: 15s
kubectl apply -f service-monitor-kong.yaml
実行例
egawa@HL01559:kong-o11y$ avp kubectl apply -f service-monitor-kong.yaml
servicemonitor.monitoring.coreos.com/kong-gateway-monitor created

PrometheusのTargetsを確認します。

kong_eks_auto_mode_grafana_04.png

問題なくスクレイプを行えているようです。

Grafanaのダッシュボードを作成

Grafanaのダッシュボードを作成していきます。
Kong公式がテンプレートを提供しているので、こちらをそのまま使用します。

ダッシュボード画面に遷移し、New dashboardを選択します。

kong_eks_auto_mode_grafana_05.png

Import Dashboardを選択します。

kong_eks_auto_mode_grafana_06.png

IDに7424を指定し
kong_eks_auto_mode_grafana_12.png

Importを押下するとダッシュボードを作成できます。
kong_eks_auto_mode_grafana_07.png

ダッシュボードを確認

作成したダッシュボードを確認するとリクエスト数やレイテンシーを確認することができます。

kong_eks_auto_mode_grafana_10.png

kong_eks_auto_mode_grafana_11.png

さいごに

EKS Auto ModeにデプロイしたKong GatewayをGrafanaで可視化してみました。
EKS Auto Modeを活用することで、複雑な設定作業を最小限に抑えながら、効果的な可観測性基盤を構築できます。
今回は検証のためセキュリティの対策は行っていませんが、本番環境などで使用する場合は必ず考慮してください。
この記事がどなたかの参考になれば幸いです。

参考

https://qiita.com/ipppppei/items/95acda57b8ed223cbc52

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.