どうも泉水です。
1ヶ月ほど経ってしましいましたが、11月15日にGoogle Cloud (GCP) Managed Service for Prometheusがパブリックプレビューになったので試してみました。
Google Cloud (GCP) 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 (GCP)、Amazon Web Services (AWS)、Microsoft Azureの最先端技術を活用してクラウドインフラやデータ分析基盤など、ITシステムの重要な基盤を設計・構築し、改善を続けながら運用しています。
お客様の課題解決をしながら技術を広げたい方、攻めのインフラ技術を習得したい方、とことん技術を追求したい方にとって素晴らしい環境が、grasysにはあります。
お気軽にご連絡ください。