はじめに
サイオステクノロジー中島です。
Raspberry Piを使用して、kubernetesクラスターを組みましたので、Prometheusを使用して、各NodeのCPUやメモリ状態を監視するため、Prometheusとnode exporterというエージェントを導入して監視を行ます。また、Prometheus単体だけでは、複数の状態監視は難しいため、Grafanaを導入して監視しやすいように作ります。
なお、本記事は、前編と後編に分けて説明します。
構築手順
構築方法について、以下の手順で構築を行います。作業については、masterの機器にsshでログインして作業を実施します。
- 名前空間の作成
- 監視エージェントを各nodeに実行
- Prometheusで監視
- Grafanaを使用してPrometheusの視覚的に監視
装置構成として以下のように構築した装置を使用します。
なお、k8s-worker-1はNFSサーバを立て「/home/pi/nfs」配下のフォルダを共有できるように設定しています。
ほかに、metallbとflannelをKubernetesに導入しています。
構築方法については、ここを参照してください。
実際に作成した、Kuberneteクラスタの状態は以下の通りになります。
$ kubectl get node -L type NAME STATUS ROLES AGE VERSION TYPE bookserver2 Ready master 9d v1.19.0 bookserver2 k8s-worker-1 Ready worker 9d v1.19.0 k8s-worker-1 raspberrypi5 Ready worker 9d v1.19.0 raspberrypi5
名前空間の作成
kubernetesクラスター上に名前空間を作成します。本記事では「gf-space」という名前空間を作ります。
・gf-space.yml
apiVersion: v1 kind: Namespace metadata: name: gf-space
以下のコマンドを実行します。
kubectl apply -f gf-space.yml
以下のように、「kubectl get namespace」と入力すると「gf-space」という名の名前空間ができています。
$ kubectl get namespace NAME STATUS AGE default Active 9d gf-space Active 4d22h kube-node-lease Active 9d kube-public Active 9d kube-system Active 9d metallb-system Active 9d
監視エージェントを各nodeに実行
以下図のように、設定をファイルを読み込みます。
図 node-exporterの読み込みファイルイメージ
設定ファイル読み込み後、以下図のようにKubernetesクラスター上の各nodeにnode exporterという名のエージェントが動作します。このpodは各nodeのIPに向けて9100ポートでアクセスするとエージェントの情報を取得することができるように設定しています。
図 node-exporterの設定読み込み後の動作イメージ
以下に、各ノード全てに監視エージェントが起動する設定ファイル「exporter.yml」を記載します。
・exporter.yml
apiVersion: apps/v1 kind: DaemonSet metadata: name: exporter namespace: gf-space spec: selector: matchLabels: name: exporter template: metadata: labels: name: exporter annotations: prometheus.io/scrape: 'true' prometheus.io/port: '9100' prometheus.io/path: /metrics spec: tolerations: - key: node-role.kubernetes.io/master effect: NoSchedule containers: - name: exporter image: prom/node-exporter ports: - containerPort: 9100 resources: limits: memory: 200Mi requests: cpu: 100m memory: 200Mi terminationGracePeriodSeconds: 30 hostNetwork: true hostPID: true
kubectlコマンドで起動させます。
kubectl apply -f exporter.yml
以下のコマンドで、起動状態を確認できます。
$ kubectl get pod --namespace=gf-space -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
exporter-hdrf9 1/1 Running 2 5d18h 192.168.0.25 raspberrypi5 <none> <none>
exporter-sftk9 1/1 Running 1 5d18h 192.168.0.21 bookserver2 <none> <none>
exporter-xqh25 1/1 Running 3 5d18h 192.168.0.24 k8s-worker-1 <none> <none>
以下のコマンドで、podの配信状態を確認できます。
$ kubectl get daemonset --namespace=gf-space -o wide NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR exporter 3 3 3 3 3 <none> 5d18h exporter prom/node-exporter name=exporter
また、動作確認として、curlコマンドで9100ポートへ各nodeへアクセスすると以下の通りに返します。
$ curl 192.168.0.21:9100 <html> <head><title>Node Exporter</title></head> <body> <h1>Node Exporter</h1> <p><a href="/metrics">Metrics</a></p> </body> </html>
なお、node内の特定フォルダのファイル容量を監視したいときは以下のように追加します。
・exporter.yml
apiVersion: apps/v1 kind: DaemonSet metadata: name: exporter namespace: gf-space spec: selector: matchLabels: name: exporter template: metadata: labels: name: exporter annotations: prometheus.io/scrape: 'true' prometheus.io/port: '9100' prometheus.io/path: /metrics spec: tolerations: - key: node-role.kubernetes.io/master effect: NoSchedule containers: - name: exporter image: prom/node-exporter ports: - containerPort: 9100 resources: limits: memory: 200Mi requests: cpu: 100m memory: 200Mi volumeMounts: - name: usb1 mountPath: /home/pi/usb/usb1 #マウントのフォルダパスを指定 terminationGracePeriodSeconds: 30 hostNetwork: true hostPID: true volumes: - name: usb1 hostPath: path: /home/pi/usb/usb1 #監視フォルダパスを指定
もし、各Node内のdockerコンテナ情報を監視するためのためエージェントであるcAdviserを導入するならば、以下の通り実装してください。実行すると8080ポートを使用して情報を取得できます。
・cAdviser
apiVersion: apps/v1 kind: DaemonSet metadata: name: cadvisor namespace: gf-space spec: selector: matchLabels: name: cadvisor template: metadata: labels: name: cadvisor annotations: prometheus.io/scrape: 'true' prometheus.io/port: '8080' prometheus.io/path: /metrics spec: tolerations: - key: node-role.kubernetes.io/master effect: NoSchedule containers: - name: cadvisor image: zcube/cadvisor ports: - containerPort: 8080 resources: limits: memory: 300Mi requests: cpu: 100m memory: 200Mi volumeMounts: - name: rootfs mountPath: /rootfs readOnly: true - name: run mountPath: /var/run - name: sys mountPath: /sys readOnly: true - name: docker mountPath: /var/lib/docker readOnly: true terminationGracePeriodSeconds: 30 hostNetwork: true hostPID: true volumes: - name: rootfs hostPath: path: / - name: run hostPath: path: /var/run - name: sys hostPath: path: /sys - name: docker hostPath: path: /var/lib/docker