Kubernetesで各Nodeの負荷監視 前編

DXブログ

はじめに

 サイオステクノロジー中島です。

 Raspberry Piを使用して、kubernetesクラスターを組みましたので、Prometheusを使用して、各NodeのCPUやメモリ状態を監視するため、Prometheusとnode exporterというエージェントを導入して監視を行ます。また、Prometheus単体だけでは、複数の状態監視は難しいため、Grafanaを導入して監視しやすいように作ります。

 なお、本記事は、前編と後編に分けて説明します。

構築手順

 構築方法について、以下の手順で構築を行います。作業については、masterの機器にsshでログインして作業を実施します。

  1. 名前空間の作成
  2. 監視エージェントを各nodeに実行
  3. Prometheusで監視
  4. 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

後編へ