grasys blog
grasysブログ

Google Cloud Managed Service for Prometheus がパブリックプレビューになったので試してみた

どうも泉水です。

1ヶ月ほど経ってしましいましたが、11月15日にGoogle Cloud Managed Service for Prometheusがパブリックプレビューになったので試してみました。

Google Cloud Managed Service for Prometheus(GMP)はPrometheusの指標の収集、保存、クエリに対応するフルマネージドなサービスです。これまでセルフマネージドで行ってきた構築・運用からの代替に期待大です!

今回の試してみたのは、基本的には公式ドキュメント通りですが、サンプルアプリケーションだと面白くないのでnginxコンテナにnginx-exporterサイドカーを配置してnginxの指標を取得してみました。

webコンソールからGMPを確認する場合はナビゲーションメニューからMonitoringを選択しメニュー「マネージド Prometheus」を開くことができます。

1. GKEクラスタの構築

GMPはGKEクラスタへデプロイする必要があるので、まずはGKEクラスタを作成します。

gcloud container clusters create gmp --machine-type n1-standard-2 --num-nodes=1 --region asia-northeast1  --project=プロジェクト名

2. マネージドコレクションのインストール

マネージドコレクションはアプリケーションをモニタリングし、収集された指標を保存するモジュールです。

$ kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/v0.1.1/examples/setup.yaml
customresourcedefinition.apiextensions.k8s.io/podmonitorings.monitoring.googleapis.com created
customresourcedefinition.apiextensions.k8s.io/rules.monitoring.googleapis.com created
customresourcedefinition.apiextensions.k8s.io/clusterrules.monitoring.googleapis.com created
customresourcedefinition.apiextensions.k8s.io/operatorconfigs.monitoring.googleapis.com created

$ kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/v0.1.1/examples/operator.yaml
namespace/gmp-system created
namespace/gmp-public created
priorityclass.scheduling.k8s.io/gmp-critical created
serviceaccount/operator created
serviceaccount/collector created
clusterrole.rbac.authorization.k8s.io/gmp-system:collector created
clusterrole.rbac.authorization.k8s.io/gmp-system:operator created
clusterrole.rbac.authorization.k8s.io/gmp-system:csr-approver created
clusterrolebinding.rbac.authorization.k8s.io/gmp-system:operator created
clusterrolebinding.rbac.authorization.k8s.io/gmp-system:operator-csr created
clusterrolebinding.rbac.authorization.k8s.io/gmp-system:collector created
deployment.apps/gmp-operator created
service/gmp-operator created
operatorconfig.monitoring.googleapis.com/config created

マネージドコレクションをapplyするとgmp-systemというネームスペースにDeploymentが作成されます。

$ kubectl get deployment -n gmp-system
NAME             READY   UP-TO-DATE   AVAILABLE   AGE
gmp-operator     1/1     1            1           137m
rule-evaluator   1/1     1            1           137m

3. サンプルアプリケーションのデプロイ

モニタリング対象のサンプルアプリケーションをデプロイします。 最初にも書いた通り今回はnginxをnginx-exporterを使ってモニタリングしてみたいと思います。

まずは、アプリケーションをデプロイするネームスペースを作成します。

$ kubectl create namespace nginx

次に、以下のnginxの設定ファイル、Deployment作成用のマニフェストを利用してサンプルアプリケーションをデプロイします。

  • default.conf
server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    location /metrics {
      stub_status on;
      access_log off;
    }
}
  • nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: nginx
  labels:
    app: nginx
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  strategy: {}
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:latest
        name: nginx
        volumeMounts:
        - mountPath: /etc/nginx/conf.d/
          name: nginx-default-conf
      - name: nginx-exporter
        image: nginx/nginx-prometheus-exporter:0.9.0
        ports:
        - name: metrics
          containerPort: 9113
          protocol: TCP
        args:
          - -nginx.scrape-uri=http://localhost:80/metrics
      volumes:
      - name: nginx-default-conf
        configMap:
          name: default.conf
          items:
          - key: default.conf
            path: default.conf
$ kubectl create configmap default.conf --from-file=/path/to/default.conf --namespace nginx

$ kubectl apply -f nginx.yaml

$ kubectl get pod -n nginx
NAME                    READY   STATUS    RESTARTS   AGE
nginx-cbc9ff44c-q8nht   2/2     Running   0          108m
nginx-cbc9ff44c-qwq2x   2/2     Running   0          108m
nginx-cbc9ff44c-rns8n   2/2     Running   0          108m

4. PodMonitoringリソースの作成

3でモニタリング対象のアプリケーションをデプロイしたので、次はそのサンプルアプリケーションの指標をスクレイピングし取得するリソースを作成します。 matchLabelsに先ほどデプロイしたnginxのDeploymentと同じ「app:nginx」を設定します。 また、PodMonitoringはサンプルアプリケーションと同じネームスペースに作成する必要があります。

  • pod-monitoring-nginx.yaml
apiVersion: monitoring.googleapis.com/v1alpha1
kind: PodMonitoring
metadata:
  name: prom-nginx
spec:
  selector:
    matchLabels:
      app: nginx
  endpoints:
  - port: metrics
    interval: 30s

$ kubectl apply -f pod-monitoring-nginx.yaml --namespace nginx

$ kubectl get podmonitoring --namespace nginx
NAME         STATUS
prom-nginx   ConfigurationCreateSuccess

PodMonitoringをデプロイして数分待っているとコンソールから指標を確認することができます。

5. Prometheus UIを作成する

4で取集できるようになった指標をUIで表示できるようにしたいと思います。 Prometheus UIやgrafanaを利用することが想定されますが今回はPrometheus UIを使って表示したいと思います。

公式ドキュメント通りにデプロイしていきます。

curl https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/v0.1.1/examples/frontend.yaml |
sed 's/\$PROJECT_ID/プロジェクトID/' |
kubectl apply -f -

正式に運用する場合は、Ingressなどの設定を行いブラウザからアクセスを行いますが、今回はサンプル同様port forwardを行ってローカルPCからアクセスしてみます。

kubectl port-forward svc/frontend 9090

ローカルからhttp://localhost:9090/へアクセスすると・・・

Prometheus UIでメトリクスが表示されました!!

6. 終わり

今回はパブリックプレビューになったManaged Service for Prometheusを試してみましたが結構簡単でしたね! セルフマネージドなPrometheusとの使い勝手を比較したりこれから色々使ってみようと思うので進展があったらまた続きを投稿したいと思います。

では、みなさん良いお年をお迎えください!


株式会社grasys(グラシス)は、技術が好きで一緒に夢中になれる仲間を募集しています。

grasysは、大規模・高負荷・高集積・高密度なシステムを多く扱っているITインフラの会社です。Google Cloud、Amazon Web Services (AWS)、Microsoft Azureの最先端技術を活用してクラウドインフラやデータ分析基盤など、ITシステムの重要な基盤を設計・構築し、改善を続けながら運用しています。

お客様の課題解決をしながら技術を広げたい方、攻めのインフラ技術を習得したい方、とことん技術を追求したい方にとって素晴らしい環境が、grasysにはあります。
お気軽にご連絡ください。