Kubernetes に Prometheus Operator を導入して監視環境を構築する

Kubernetes クラスタ上で Prometheus Operator(kube-prometheus)を導入し、Grafana や Alertmanager を含む監視基盤を構築する手順を紹介します。NodePort を利用して外部から各コンポーネントにアクセス可能にする設定と、よく発生する問題の対処方法も併せて解説します。

リポジトリの取得と準備

git clone -b v0.7.0 https://github.com/prometheus-operator/kube-prometheus.git
cd kube-prometheus/manifests

サービスの公開方法を NodePort に変更

デフォルトでは ClusterIP が使用されるため、外部からアクセスできるように以下の YAML ファイルを編集します。

grafana-service.yaml

spec:
  type: NodePort
  ports:
  - name: http
    port: 3000
    targetPort: http
    nodePort: 30100

prometheus-service.yaml

spec:
  type: NodePort
  ports:
  - name: web
    port: 9090
    targetPort: web
    nodePort: 30200

alertmanager-service.yaml

spec:
  type: NodePort
  ports:
  - name: web
    port: 9093
    targetPort: web
    nodePort: 30300

イメージの置き換え

ネットワーク制限により一部のイメージが pull できない場合があるため、信頼できるミラーまたは代替レジストリを使用します。

grep -rn 'image: ' *

例として、以下のようにイメージを置き換えます:

  • quay.io/prometheus/alertmanagerquay.mirrors.ustc.edu.cn/prometheus/alertmanager
  • quay.io/coreos/kube-state-metricscnych/kube-state-metrics
  • quay.io/brancz/kube-rbac-proxyquay.mirrors.ustc.edu.cn/brancz/kube-rbac-proxy

インストール

kubectl create namespace monitoring
kubectl apply -f setup/
kubectl apply -f .

よくある問題と対処法

CRD のサイズ超過エラー

The CustomResourceDefinition ... is invalid: metadata.annotations: Too long というエラーが出る場合、kubectl apply の代わりに kubectl create を使用します。

kubectl create -f setup/

Secret が見つからないエラー

StatefulSet が起動しない場合、以下のログが表示されることがあります:

MountVolume.SetUp failed for volume "...-token-xxxxx" : secret "...-token-xxxxx" not found

これは kubelet のキャッシュや一時的な不整合が原因であることが多く、kubelet を再起動することで解決します。

systemctl restart kubelet

metrics-server 未導入による top コマンドのエラー

kubectl top nodes でエラーが発生する場合は、metrics-server がクラスタにデプロイされていない可能性があります。別途 metrics-server をインストールしてください。

アラート通知の設定(メール・企業微信・Webhook)

Alertmanager の設定をカスタマイズするには、alertmanager.yaml を作成し、Secret を再生成します。

alertmanager.yaml

global:
  resolve_timeout: 5m
  smtp_smarthost: 'smtp.163.com:25'
  smtp_from: 'your-email@163.com'
  smtp_auth_username: 'your-email@163.com'
  smtp_auth_password: 'your-password-or-token'
  smtp_require_tls: false
  wechat_api_url: 'https://qyapi.weixin.qq.com/cgi-bin/'
  wechat_api_secret: 'YOUR_WECHAT_SECRET'
  wechat_api_corp_id: 'YOUR_CORP_ID'

templates:
  - '*.tmpl'

route:
  group_by: ['alertname', 'job']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 12h
  receiver: 'wechat'
  routes:
  - match:
      job: 'prometheus'
    receiver: 'wechat'

receivers:
- name: 'email'
  email_configs:
  - to: 'recipient@example.com'
- name: 'wechat'
  wechat_configs:
  - send_resolved: true
    to_party: '2'
    agent_id: '1'
- name: 'webhook'
  webhook_configs:
  - url: 'http://webhook-dingtalk.monitoring.svc.cluster.local:8060/dingtalk/webhook1/send'
    send_resolved: true

Secret を更新する手順:

kubectl delete secret alertmanager-main -n monitoring
kubectl create secret generic alertmanager-main --from-file=alertmanager.yaml -n monitoring

Grafana の初期パスワード取得

Grafana の admin パスワードは Secret に Base64 エンコードで保存されています。

kubectl -n monitoring get secret \
  $(kubectl -n monitoring get secrets | grep grafana | awk '/Opaque/ {print $1}') \
  -o jsonpath='{.data.admin-password}' | base64 -d

デフォルトでは prom-operator がパスワードとして設定されていることが多いです。

タグ: Prometheus grafana Kubernetes Alertmanager kube-prometheus

8月22日 18:39 投稿