kind で作った Kubernetes クラスタに Prometheus をデプロイする方法を解説します。

kind クラスタを作る

まず kind で Kubernetes クラスタを立ち上げます。クラスタはひとまず 4 ノードで作ります。

cluster.yaml

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
- role: worker
$ # kind 0.11.0 + Kubernetes 1.21.1
$ kind create cluster --config cluster.yaml
Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.21.1) 🖼
 ✓ Preparing nodes 📦 📦 📦 📦  
 ✓ Writing configuration 📜 
 ✓ Starting control-plane 🕹️ 
 ✓ Installing CNI 🔌 
 ✓ Installing StorageClass 💾 
 ✓ Joining worker nodes 🚜 
Set kubectl context to "kind-kind"
You can now use your cluster with:

kubectl cluster-info --context kind-kind

Thanks for using kind! 😊
$ kubectl get nodes
NAME                 STATUS   ROLES                  AGE     VERSION
kind-control-plane   Ready    control-plane,master   2m14s   v1.21.1
kind-worker          Ready    <none>                 106s    v1.21.1
kind-worker2         Ready    <none>                 106s    v1.21.1
kind-worker3         Ready    <none>                 106s    v1.21.1

Prometheus の設定ファイルをデプロイする

次に、Prometheus の設定ファイルを ConfigMap の形でデプロイします。 この YAML を編集すると Prometheus の動作を変えられます。

prometheus.yml の書き方は 公式マニュアル をご参照ください。

prometheus-config.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus
data:
  prometheus.yml: |
    scrape_configs:
      - job_name: prometheus
        static_configs:
          - targets:
            - localhost:9090    
$ kubectl apply -f prometheus-config.yaml 
configmap/prometheus created

Prometheus の Pod をデプロイする

次に Prometheus の Pod をデプロイします。 Prometheus の 公式イメージの設定 で、デフォルトの設定ファイルの読み込みパスは /etc/prometheus/prometheus.yml になっています。

prometheus.yaml

apiVersion: v1
kind: Pod
metadata:
  name: prometheus
  labels:
    app: prometheus
spec:
  containers:
    - name: prometheus
      image: prom/prometheus:v2.27.1
      volumeMounts:
        - name: config
          mountPath: /etc/prometheus
          readOnly: true
  volumes:
    - name: config
      configMap:
        name: prometheus
        items:
          - key: prometheus.yml
            path: prometheus.yml
$ kubectl apply -f prometheus.yaml 
pod/prometheus created

Prometheus は デフォルト で 9090 番ポートで通信を待機します。

$ kubectl exec -it prometheus -- sh
/prometheus $ netstat -tln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       
tcp        0      0 :::9090                 :::*                    LISTEN 
/prometheus $ wget -q -O - http://localhost:9090/
<!doctype html>
...

Prometheus の Service をデプロイする

Prometheus をクラスタ内から利用するため、Service をデプロイします。 Pod には app: prometheus というラベルを付けておいたので、このラベルを使って Pod を選択します。

prometheus-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: prometheus
spec:
  selector:
    app: prometheus
  ports:
    - port: 9090
$ kubectl apply -f prometheus-service.yaml 
service/prometheus created

kubectl port-forward を使えばブラウザから動作を確認できます。

$ kubectl port-forward service/prometheus 9090
Forwarding from 127.0.0.1:9090 -> 9090
Forwarding from [::1]:9090 -> 9090

kind 環境に Grafana をデプロイする に続きます。

参考資料