Rancher 2.5 と Prometheusで 高度なモニタリング機能を提供

Rancher 2.5 と Prometheusで 高度なモニタリング機能を提供

Gaurav Mehta
Gaurav Mehta
Published: November 10, 2020
Updated: November 16, 2020

ブログの中で、モニタリングについて多く取りあげます。Kubernetes クラスタを管理していると、物事はすぐに変化するためです。クラスタの健全性とリソースのメトリクスを監視するツールを保持することが重要です。

Rancher2.5では、Prometheusと関連するモニタリングコンポーネントのKubernetesネイティブなデプロイと管理を提供するPrometheus Operatorをベースにしたモニタリングの新バージョンを導入しました。Prometheus Operatorを使用すると、クラスタノード、Kubernetesコンポーネント、アプリケーションのワークロードの状態やプロセスを監視することができます。また、Prometheus経由で収集したメトリクスに基づいてアラートを定義し、カスタムダッシュボードを作成して、収集したメトリクスをGrafana経由で簡単に可視化することができます。新しいモニタリングコンポーネントの詳細については こちらをご覧ください。

新しいモニタリングでは、開発者がカスタムメトリクスやHorizontal Pod Autoscalar(HPA)に基づいてワークロードをスケーリングするために活用できるprometheus-adapterも公開されています。

本ブログでは、Prometheus Operatorを利用してカスタムメトリクスをスクレイピングし、高度なワークロード管理に活用する方法を深堀します。

Install Prometheus

Rancher 2.5 から Prometheus をインストールするのは簡単です。 Cluster Explorer -> Appsにアクセスし、 rancher-monitoringをインストールするだけです。

install image 1

デフォルトにおける注意点:

  • prometheus-adapter はチャートのインストールの一部として有効です。
  • ServiceMonitorNamespaceSelector は空のままにしておくと、Prometheusがすべてのネームスペースの ServiceMonitor をスクレイプできるようになります。

install image 2

インストールが完了すると、Cluster Explorerから監視コンポーネントにアクセスできます。

install image 3

ワークロードのデプロイ

それでは、アプリケーション層からカスタムメトリクスを公開するサンプルワークロードをデプロイしてみましょう。このワークロードは、Prometheus client_golangライブラリを使って計測したシンプルなアプリケーションを公開し、/metric エンドポイントでカスタムメトリクスを提供しています。

2つのメトリクスを提供しています:

  • http_requests_total
  • http_request_duration_seconds

以下のマニフェストは、このワークロードにアクセスするためのワークロード、関連するサービス、およびingressをデプロイします。

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/name: prometheus-example-app
  name: prometheus-example-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: prometheus-example-app
  template:
    metadata:
      labels:
        app.kubernetes.io/name: prometheus-example-app
    spec:
      containers:
      - name: prometheus-example-app
        image: gmehta3/demo-app:metrics
        ports:
        - name: web
          containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: prometheus-example-app
  labels:
    app.kubernetes.io/name: prometheus-example-app
spec:
  selector:
    app.kubernetes.io/name: prometheus-example-app
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080
      name: web
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
    name: prometheus-example-app
spec:
    rules:
    - host: hpa.demo
      http:
        paths:
        - path: /
          backend:
            serviceName: prometheus-example-app
            servicePort: 8080

ServiceMonitorのデプロイ

ServiceMonitorはカスタムリソース定義(CRD)で、動的なサービスのセットをどのように監視すべきかを宣言的に定義することができます。

ServiceMonitorのフルスペックは こちらで確認できます。

では、ServiceMonitorをデプロイしてみましょう。これは、Prometheusがprometheus-example-app Kubernetesサービスを構成するポッドをスクレイプするために使用します。

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: prometheus-example-app
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: prometheus-example-app
  endpoints:
  - port: web

ご覧のように、ユーザーは Rancher Monitoringで ServiceMonitorを閲覧できるようになりました。

install image 4

しばらくすると、サービスに関連付けられた新しいサービスモニタとポッドがPrometheusのサービスディスカバリーに反映されます。

install image 4-2

また、プロメテウスのメトリクスを見ることもできます。

install image 5

Grafana Dashboardのデプロイ

Rancher 2.5 のモニタリングでは、GrafanaダッシュボードをConfigMapsとして cattle-dashboards ネームスペースに保存することができます。

ユーザー/クラスタ管理者は、このネームスペースにダッシュボードを追加して、Grafanaを拡張してカスタムダッシュボードを持つことができるようになりました。

Dashboard ConfigMap Example

apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-example-app-dashboard
  namespace: cattle-dashboards
  labels:
    grafana_dashboard: "1"
data:
  prometheus-example-app.json: |
    {
    "annotations": {
        "list": [
        {
            "builtIn": 1,
            "datasource": "-- Grafana --",
            "enable": true,
            "hide": true,
            "iconColor": "rgba(0, 211, 255, 1)",
            "name": "Annotations & Alerts",
            "type": "dashboard"
        }
        ]
    },
    "editable": true,
    "gnetId": null,
    "graphTooltip": 0,
    "links": [],
    "panels": [
        {
        "aliasColors": {},
        "bars": false,
        "dashLength": 10,
        "dashes": false,
        "datasource": null,
        "fieldConfig": {
            "defaults": {
            "custom": {}
            },
            "overrides": []
        },
        "fill": 1,
        "fillGradient": 0,
        "gridPos": {
            "h": 9,
            "w": 12,
            "x": 0,
            "y": 0
        },
        "hiddenSeries": false,
        "id": 2,
        "legend": {
            "avg": false,
            "current": false,
            "max": false,
            "min": false,
            "show": true,
            "total": false,
            "values": false
        },
        "lines": true,
        "linewidth": 1,
        "nullPointMode": "null",
        "percentage": false,
        "pluginVersion": "7.1.5",
        "pointradius": 2,
        "points": false,
        "renderer": "flot",
        "seriesOverrides": [],
        "spaceLength": 10,
        "stack": false,
        "steppedLine": false,
        "targets": [
            {
            "expr": "rate(http_requests_total{code=\"200\",service=\"prometheus-example-app\"}[5m])",
            "instant": false,
            "interval": "",
            "legendFormat": "",
            "refId": "A"
            }
        ],
        "thresholds": [],
        "timeFrom": null,
        "timeRegions": [],
        "timeShift": null,
        "title": "http_requests_total_200",
        "tooltip": {
            "shared": true,
            "sort": 0,
            "value_type": "individual"
        },
        "type": "graph",
        "xaxis": {
            "buckets": null,
            "mode": "time",
            "name": null,
            "show": true,
            "values": []
        },
        "yaxes": [
            {
            "format": "short",
            "label": null,
            "logBase": 1,
            "max": null,
            "min": null,
            "show": true
            },
            {
            "format": "short",
            "label": null,
            "logBase": 1,
            "max": null,
            "min": null,
            "show": true
            }
        ],
        "yaxis": {
            "align": false,
            "alignLevel": null
        }
        },
        {
        "aliasColors": {},
        "bars": false,
        "dashLength": 10,
        "dashes": false,
        "datasource": null,
        "description": "",
        "fieldConfig": {
            "defaults": {
            "custom": {}
            },
            "overrides": []
        },
        "fill": 1,
        "fillGradient": 0,
        "gridPos": {
            "h": 8,
            "w": 12,
            "x": 0,
            "y": 9
        },
        "hiddenSeries": false,
        "id": 4,
        "legend": {
            "avg": false,
            "current": false,
            "max": false,
            "min": false,
            "show": true,
            "total": false,
            "values": false
        },
        "lines": true,
        "linewidth": 1,
        "nullPointMode": "null",
        "percentage": false,
        "pluginVersion": "7.1.5",
        "pointradius": 2,
        "points": false,
        "renderer": "flot",
        "seriesOverrides": [],
        "spaceLength": 10,
        "stack": false,
        "steppedLine": false,
        "targets": [
            {
            "expr": "rate(http_requests_total{code!=\"200\",service=\"prometheus-example-app\"}[5m])",
            "interval": "",
            "legendFormat": "",
            "refId": "A"
            }
        ],
        "thresholds": [],
        "timeFrom": null,
        "timeRegions": [],
        "timeShift": null,
        "title": "http_requests_total_not_200",
        "tooltip": {
            "shared": true,
            "sort": 0,
            "value_type": "individual"
        },
        "type": "graph",
        "xaxis": {
            "buckets": null,
            "mode": "time",
            "name": null,
            "show": true,
            "values": []
        },
        "yaxes": [
            {
            "format": "short",
            "label": null,
            "logBase": 1,
            "max": null,
            "min": null,
            "show": true
            },
            {
            "format": "short",
            "label": null,
            "logBase": 1,
            "max": null,
            "min": null,
            "show": true
            }
        ],
        "yaxis": {
            "align": false,
            "alignLevel": null
        }
        }
    ],
    "schemaVersion": 26,
    "style": "dark",
    "tags": [],
    "templating": {
        "list": []
    },
    "time": {
        "from": "now-15m",
        "to": "now"
    },
    "timepicker": {
        "refresh_intervals": [
        "5s",
        "10s",
        "30s",
        "1m",
        "5m",
        "15m",
        "30m",
        "1h",
        "2h",
        "1d"
        ]
    },
    "timezone": "",
    "title": "prometheus example app",
    "version": 1
    }

ユーザーはGrafanaのダッシュボード「prometheus example app」にアクセスできるようになりました。

install image 6

カスタムメトリクスによるHPA

このセクションではモニタリングのインストールの一部として prometheus-adapter がインストールされたと仮定します。

デフォルトでは、モニタリングは prometheus-adapterをインストールします。

ユーザーは以下のようにHPA仕様を作成できるようになりました:

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: prometheus-example-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: prometheus-example-app
  minReplicas: 1
  maxReplicas: 5
  metrics:
  - type: Object
    object:
        describedObject:
            kind: Service
            name: prometheus-example-app
        metric:
            name: http_requests
        target:
            averageValue: "5"
            type: AverageValue

HPAについての詳細は こちらをご覧ください。

カスタムの http_requests_total メトリクスを使い、ポッドのオートスケールを行います。

install image 7-1

これで、HPAの動作を見るためのサンプルロードを生成することができるようになりました。同様にheyを使うことができます。

hey -c 10 -n 5000 http://hpa.demo

install image 7

まとめ

本ブログでは、Rancher 2.5の新しいモニタリングの柔軟性を深堀しました。開発者やクラスタ管理者は、スタックを活用してワークロードを監視したり、可視化をデプロイしたり、Kubernetes内で利用できる高度なワークロード管理機能を活用することができます。

Gaurav Mehta
Gaurav Mehta
Field Engineer, Rancher
Gaurav MehtaはRancher Labs. フィールドエンジニアです。
Rancherを始めましょう