Contents
Kubernetes 上の Prometheus 導入 手順 詳細
Kubernetes環境におけるリアルタイムモニタリングを構築するには、Prometheus導入が不可欠です。本記事では、YAMLファイルによるリソース作成とminikubeクラスタでの検証ケースに焦点を当て、手順や注意点を網羅して解説します。DevOpsエンジニアやKubernetes管理者にとって、現実的な導入ステップが理解できるよう設計されています。
Kubernetesクラスタの事前準備(minikube環境構築)
ローカルでKubernetesクラスタを構築するには、minikubeを使用するのが一般的です。以下にインストールから確認までの手順を示します。
minikubeのインストールと起動手順
- minikubeのインストール:
- macOS:
brew install minikube - Linux: パッケージマネージャーまたは公式サイトからバイナリをダウンロード
- クラスタ起動:
bash
minikube start
これで単一ノードのKubernetesクラスタが構築されます。
クラスタ状態確認コマンドの実行
以下のコマンドでクラスタの正常性を確認します:
|
1 2 3 |
kubectl get nodes kubectl get pods -A |
Namespace作成時の注意点
-
デフォルト以外のNamespaceを使う場合は、以下のように作成してください:
bash
kubectl create namespace monitoring -
クラスタに複数Namespaceを構築する際は、リソースの衝突を避けるために明確な命名規則を定義しましょう。
PrometheusのYAMLファイルによるデプロイメント
手動でYAMLファイルを作成してPrometheusをデプロイする方法を解説します。Helmチャートとの選択肢比較も含みます。
DeploymentとServiceリソースのYAMLサンプル
以下は、シンプルなDeploymentとServiceの例です:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
apiVersion: apps/v1 kind: Deployment metadata: name: prometheus namespace: monitoring spec: replicas: 1 selector: matchLabels: app: prometheus template: metadata: labels: app: prometheus spec: containers: - name: prometheus image: prom/prometheus:v2.47.0 ports: - containerPort: 9090 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
apiVersion: v1 kind: Service metadata: name: prometheus namespace: monitoring spec: selector: app: prometheus ports: - protocol: TCP port: 80 targetPort: 9090 |
ConfigMapで指定するPrometheus構成ファイルの記述例
Prometheusの構成(prometheus.yml)をConfigMapに保存します:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
apiVersion: v1 kind: ConfigMap metadata: name: prometheus-config namespace: monitoring data: prometheus.yml: | global: scrape_interval: 15s scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['prometheus.monitoring.svc.cluster.local:9090'] |
注意:
localhostではなく、Service名ベースの参照(例:prometheus.monitoring.svc.cluster.local)を使用すること。PodIPは不安定なため非推奨です。
ロール・ロールバインディングの設定
RBACを有効にするには、以下のようなRoleとRoleBindingを作成します:
|
1 2 3 4 5 6 7 8 9 10 |
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: prometheus-role namespace: monitoring rules: - apiGroups: [""] resources: ["services", "endpoints", "pods"] verbs: ["get", "list", "watch"] |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: prometheus-rolebinding namespace: monitoring subjects: - kind: ServiceAccount name: prometheus-sa roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: prometheus-role |
注意:
defaultサービスアカウントではなく、専用のServiceAccount(例:prometheus-sa)を必ず作成してください。セキュリティとロール分離の観点から推奨されます。
ServiceMonitorリソースによるメトリクススクレイピング設定
ServiceMonitorは、PrometheusがKubernetes内のサービスを監視するためのリソースです。ただし、monitoring.coreos.com APIグループの利用前提があります。
Prometheus Operatorのインストール手順(必須)
-
HelmチャートでOperatorをデプロイ:
bash
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install prometheus-operator prometheus-community/kube-prometheus-stack -n monitoring -
CRDsのインストール(Helmにより自動処理)
- ServiceMonitorリソースが利用可能になるまで待機:
bash
kubectl get crds | grep monitoring.coreos.com
ServiceMonitorのYAMLテンプレート
以下のようにServiceMonitorを作成します:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: example-service-monitor namespace: monitoring spec: selector: matchLabels: app: my-app endpoints: - port: metrics |
監視対象サービスのラベル付け方法
監視対象となるKubernetesサービスには、以下のようにラベルを付与します:
|
1 2 3 4 5 6 7 8 |
metadata: labels: app: my-app spec: ports: - name: metrics port: 8080 |
Prometheusサービスの外部公開方法
開発・検証環境では、NodePortまたはIngressを通じてPrometheusにアクセスする必要があります。
NodePortでクラスタ外からアクセスする設定
Serviceリソースにtype: NodePortを指定します:
|
1 2 3 4 5 6 7 |
spec: type: NodePort ports: - port: 80 targetPort: 9090 nodePort: 30000 |
クラスタ外からアクセスできます(例: http://localhost:30000)。
IngressとTLS証明書を使用したHTTPSアクセス構成
Ingressリソースを作成し、ドメインを指定します:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: prometheus-ingress spec: rules: - http: paths: - path: / pathType: Prefix backend: service: name: prometheus port: number: 9090 |
TLS証明書を有効にするには、Let's EncryptなどのCAで発行された証明書をIngressに割り当てます。
導入後の監視状況確認とトラブルシューティング
Prometheus導入後は、正しくモニタリングが行われているかを確認しましょう。
Prometheus UIからメトリクスの可視化
ブラウザで http://<prometheus-service>:9090 にアクセスし、「Status」→「Targets」から監視対象のステータスを確認します。
ポッドやサービスが正常に起動しているかのチェック
以下のコマンドで状態を確認してください:
|
1 2 3 |
kubectl get pods -n monitoring kubectl get services -n monitoring |
長期保存用のRemote Write設定(MetricFireなど)
メトリクスを長期保存するには、Remote Write機能を使用します。
Prometheusのremote_write設定ファイルの記述例
ConfigMapに以下のように記述します:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
apiVersion: v1 kind: ConfigMap metadata: name: prometheus-remote-write-config data: prometheus.yml: | remote_write: - url: https://<remote-service-endpoint>/api/v1/write basic_auth: username: <your-username> password: <your-password> |
外部サービスとの接続テスト方法
PrometheusのUIで「Status」→「Configuration」から、remote_writeが正しく設定されているかを確認します。また、curlコマンドでアクセス可能か試してください。
パラメータ化と汎用性向上
YAMLテンプレート内のnamespaceフィールドは固定値(例: monitoring)の代わりにパラメータ化することで柔軟性が高まります。以下のようなアプローチを検討してください:
パラメータ化の実装方法
- Helmチャート: 値ファイルでNamespaceを指定します(例:
values.yamlにnamespace: monitoring)。 - 環境変数: 構築時テンプレートで
${NAMESPACE}を置換します(例:sed "s/\${NAMESPACE}/monitoring/g")。
| 項目 | 値 | 補足 |
|---|---|---|
| Namespaceのパラメータ化 | ${NAMESPACE} |
環境ごとに変更可能 |
| デプロイメントテンプレート | prometheus-deployment.yaml |
変数でnamespaceを指定 |
- Kubernetes 上の Prometheus 導入 手順 詳細 を理解することで、リアルタイムモニタリング環境を構築できます。
- YAMLファイルによるリソース作成とminikubeでの検証ケースを活用し、信頼性の高い導入が可能です。
- 本記事の手順に従ってPrometheusを導入し、Kubernetesクラスタのリアルタイムモニタリング環境構築を試してみましょう