Kubernetes
運用プラットフォーム一式を監視対象の HAP/HDP Kubernetes クラスター内にデプロイします。Prometheus が ServiceAccount でクラスターを自動検出するため、Token や NodePort は不要です。
以下の手順には、Kubernetes 形態でのデプロイに必要な全工程が含まれます。
クラスター外にデプロイした場合はホスト とミドルウェアのみを監視でき、Kubernetes 自体のノード/Pod/Deployment メトリクスを直接収集できません(1.5.3 以降、クラスター外からの収集方式は廃止されました)。
開始前の準備
必要なもの
- 正常稼働している HAP/HDP クラスター
- 監視対象ミドルウェア(実際の構成に応じた MongoDB/MySQL/Redis/Kafka/Elasticsearch)にクラスター内からアクセスでき、デプロイ概要に従って読み取り専用アカウントを準備済みであること
- Flink などの外部 Web UI は任意です。デプロイ後に「データソース」でカスタムページとして登録します。
kubectlで対象クラスターを操作できること。未準備の場合は付録 A:テストクラスターの構築を参照してください。
⬇ k8s-cluster.tar.gz をダウンロード(展開すると次のファイルが得られます):
00-namespace.yaml 11-configmap.yaml 30-stateful.yaml 50-daemonsets.yaml
10-secret.yaml.example 20-rbac.yaml 40-stateless.yaml
データ永続化方式の選択
ステートフルなコンポーネント(Prometheus/Grafana/ops-mongo)にはデータの永続化が必要です。次の 2 つから選択し、手順 2 の作業を決定します:
| PVC(デフォルト、推奨) | hostPath(代替) | |
|---|---|---|
| 保存先 | ストレージボリューム。ノード再作成でも保持 | 特定ノードのローカルディレクトリ |
| 使用するマニフェスト | k8s-cluster/ の分割ファイル | 単一の ops.yaml |
| 前提 | デフォルトの StorageClass がある | 不要。ただしノード固定が必要 |
| 適した環境 | クラウド管理クラスター(TKE/ACK/EKS)、本番環境 | ノードが固定された自前クラスター、使用可能な StorageClass がない環境 |
クラウドのノードは交換可能であり、自動復旧、スケーリング、バージョンアップ時に再作成されます。hostPath のデータは Pod とともに移動しません。
Prometheus の TSDB が失われるとメトリクス履歴の検索に影響し、ops-mongo が失われるとアラートルール、通知チャンネル、データソース設定、スロークエリ履歴がすべて失われます。
以下は PVC を中心に説明し、hostPath との差異を各手順に記載します。
手順 1:イメージの取得
crictl pull nocoly/ops-allinone:1.5.12
ops-nodeagent は DaemonSet として実行されるため、全ノードにこのイメージが必要です。オフライン環境はオフラインパッケージを参照してください。
異なる地域のクラスターで 2.16GB のイメージを取得するには十数分かかる場合があり、ノードごとの所要時間も異なります。
あるノードで処理が止まる場合は、そのノードに kubectl cordon を実行し、DaemonSet 以外の Pod を削除して、イメージをキャッシュ済みのノードに再スケジュールできます(DaemonSet は各ノードで取得完了を待つ必要があります)。海外では近隣のイメージレジストリへの事前同期を推奨します。
手順 2:永続化の準備
PVC(推奨)
デフォルトの StorageClass が必要です。次のコマンドで確認します:
kubectl get sc
出力に (default) の付いた StorageClass があることを確認します。ない場合は、以下のいずれかの方法で作成します。
クラウド管理クラスター(TKE/ACK/EKS)
通常はクラウドプロバイダーがデフォルトの StorageClass を提供しますが、オンライン拡張に対応した StorageClass の作成を推奨します。PVC 作成後の StorageClass 変更には通常ディスク再作成が必要です。Tencent Cloud TKE の例:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: cbs-expandable
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: com.tencent.cloud.csi.cbs
parameters:
diskType: CLOUD_PREMIUM # 明示指定。TKE のデフォルト SC の `type: cbs` は無効なパラメーターで、ドライバーのデフォルト値に依存
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true # TKE のデフォルト SC は通常この設定が無効。ドライバーはオンライン拡張に対応
作成後は元の StorageClass のデフォルト指定を解除し、デフォルトが 2 つ存在しないようにします:
kubectl patch sc <元のデフォルトSC名> -p '{"metadata":{"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'
PVC.status.capacity は第 2 段階(ノード上の resize2fs)の完了後に更新されます。この段階には Pod によるマウントが必須です。未マウントの PVC は古い値のまま、condition が FileSystemResizePending になります。これは拡張失敗を意味せず、クラウドディスク自体の拡張は通常完了しています。
自前/単一ノードのテストクラスター
クラウドディスクがない場合は local-path-provisioner を使用し、ノードのローカルディレクトリに保存できます:
kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/master/deploy/local-path-storage.yaml
kubectl patch sc local-path -p '{"metadata":{"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
30-stateful.yaml のデフォルト要求は、本番クラスター向けに prometheus 100Gi + ops-mongo 20Gi + grafana 10Gi = 130Gi です。
local-path-provisioner はディスク空き容量を検証しません。PVC が正常に Bound になっても、Prometheus がディスクを使い切ると no space left on device が発生し、サービス障害と誤認しやすくなります。テストマシンは通常 100G 程度のため、apply 前に調整してください:
# 30-stateful.yaml の 3 か所の volumeClaimTemplates
resources:
requests:
storage: 20Gi # ops-prometheus,テスト環境
# storage: 5Gi # ops-mongo
# storage: 5Gi # ops-grafana
また local-path はオンライン拡張非対応で、増量には PVC の再作成が必要です。本番では allowVolumeExpansion に対応するクラウドディスク SC を使用してください。
hostPath(代替)
StorageClass を使用せず、ステートフルなコンポーネントを特定ノードに固定して、そのローカルディスクに保存します。対象ノードにラベルを付けます:
kubectl label node <ノード名> hap-ops=true
kubectl get node -o wideでノード名を確認します。データはそのノードの/data/mdis/以下に統一されます(prometheus/grafana/loki/tempo/mongo の各サブディレクトリ)。
手順 3:オブジェクトストレージの準備(任意)
ログ(Loki)とトレース(Tempo)はデフォルトでローカルボリュームに保存されます。単一ノードのディスク容量に制限されず長期保持する場合はオブジェクトストレージを用意します。バケットは 2 つ必要です:
| バケット | 用途 | 推奨名 |
|---|---|---|
| ログ | Loki ブロックストレージ | mdis-loki |
| トレース | Tempo ブロックストレージ | mdis-tempo |
設定先は 2 か所に分かれます:
| 設定内容 | 設定先 | 説明 |
|---|---|---|
| endpoint、AK/SK、path style | 10-secret.yaml の ENV_S3_* | 手順 4 で入力 |
| バケット名 | 30-stateful.yaml の ops-loki/ops-tempo それぞれの ENV_S3_BUCKET_LOKI/ENV_S3_BUCKET_TEMPO | 上表の名前が設定済み。同じ名前で作成すれば変更不要 |
⚠️ 2 コンポーネントは必ず別のバケットを使用してください。共通の ENV_S3_BUCKET だけを設定すると同じバケットに保存され、ディレクトリ構造を互いに上書きします(起動ログに警告が出ます)。各クラウドの endpoint と互換性はオブジェクトストレージを参照してください。
長期保持が不要なら、この手順はスキップし、後から設定できます。