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/alertmanager→quay.mirrors.ustc.edu.cn/prometheus/alertmanagerquay.io/coreos/kube-state-metrics→cnych/kube-state-metricsquay.io/brancz/kube-rbac-proxy→quay.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 がパスワードとして設定されていることが多いです。