0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

KubernetesをオープンソースのGraphiteで監視

Last updated at Posted at 2020-05-22

はじめに

この記事では、オープンソースの監視ツールGraphiteを使用してKubernetesを監視する方法について説明し、それをGrfanaで視覚化していく方法を説明していきます。 焦点は、Kubernetesクラスタを監視するための重要な指標の監視とプロットにあります。GrafanaダッシュボードリソースからダウンロードできるKubernetesのカスタムダッシュボードをダウンロード、実装、監視します。 これらの監視ダッシュボードには、きめ細かいレベルでデータにドリルダウンできる変数があります。

またこのようなセットアップを自ら行わずとも、MetricFireはGraphiteとGrafanaの統合を完了してプラスαのモノを提供しております。是非、MetricFireの無料トライアルにサインアップしてください。MetricFireとGrafanaをプラットフォームで直接使用できます。 MetricFireはホスト型のGraphite、Grafana、Prometheusサービスであり、これらのオープンソースツールのセットアップと管理を行っているため、お客様が行う必要は一切ありません。

Kubernetesの概要

Kubernetesによると、Kubernetesは、コンテナ化されたワークロードとサービスを管理するための「移植可能で拡張可能なオープンソースプラットフォーム」であり、宣言的な構成と自動化の両方を容易にします。大規模で急速に成長しているエコシステムが存在し、Kubernetesのサービス、サポート、ツールは広く利用できます。

今日の業界では、Kubernetesデプロイメントの監視は困難ですが必要な活動です。 この記事では、ダッシュボードの使用方法を詳しく説明するため、Kubernetesの基本については説明しません。 Kubernetesモニタリングの詳細については、MetricFireブログのKubernetesモニタリングの概要をご覧ください。

Graphiteの概要

Graphiteは非常に人気のあるエンタープライズモニタリングツールです。MetricFireには、2012年から開発および改善されているHosted Graphite製品があります。グラファイトは、StatsDなどのコレクターによってプッシュされたメトリックデータを受信する時系列モニタリングツールです。 collectdし、ユーザーが指定した時系列メトリックを監視します。 Graphiteの基本について知りたい場合は、この記事を読む前に、アーキテクチャとコンセプト、Graphiteのインストールとセットアップに関する記事をご覧ください。

Graphite、Grafana、Kubernetesのセットアップ

この記事では、AWSにデプロイされたKubernetesクラスターを使用します。 Amazon AWS EKSユーザーガイドの指示に従ってAWS CLIをインストールし、kubectlコマンドラインツールもインストールしてください。

kubectlがインストールされたら、コマンド「kubectl cluster-info」を実行すると、次の出力が表示されます。

~ ./kubectl cluster-info
Kubernetes master is running at https://92797800687320683968AF0937C2B5D3.yl4.ap-south-1.eks.amazonaws.com
CoreDNS is running at https://92797800687320683968AF0937C2B5D3.yl4.ap-south-1.eks.amazonaws.com/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

次に、kubernetesクラスターにGrafanaをセットアップします。 以下は、GrafanaポッドとKubernetesで実行されるサービスを作成する単純な設定ファイルです

| apiVersion: apps/v1 |
|:--|
| kind: Deployment |
| metadata: |
|  labels: |
|    app: grafana |
|  name: grafana |
| spec: |
|  replicas: 1 |
|  selector: |
|    matchLabels: |
|      app: grafana |
|  template: |
|    metadata: |
|      labels: |
|        app: grafana |
|    spec: |
|      containers: |
|      - image: grafana/grafana:5.4.3 |
|        name: grafana |
|        ports: |
|        - containerPort: 3000 |
|          name: http |
|  |
|        volumeMounts: |
|          - name: grafana-storage |
|            mountPath: /var/lib/grafana |
|      volumes: |
|        - name: grafana-storage |
|          persistentVolumeClaim: |
|            claimName: grafana-storage |
|      securityContext: |
|        runAsNonRoot: true |
|        runAsUser: 65534 |
|        fsGroup: 472 |
| --- |
| kind: PersistentVolumeClaim |
| apiVersion: v1 |
| metadata: |
|  name: grafana-storage |
| spec: |
|  accessModes: |
|    - ReadWriteOnce |
|  resources: |
|    requests: |
|      storage: 1Gi |
| --- |
| apiVersion: v1 |
| kind: Service |
| metadata: |
|  name: grafana |
|  labels: |
|    app: grafana |
| spec: |
|  type: LoadBalancer |
|  ports: |
|  - port: 3000 |
|    protocol: TCP |
|    targetPort: 3000 |
|  selector: |
|    app: grafana |

「kubectl create -f grafana-deployment.yml」を実行して、Grafanaポッドとサービスを作成します。
コマンド「kubectl get service」を実行すると、次のような出力が表示されます。

➜  ~/github/k8-graphite-monitoring (master) kubectl get service
NAME         TYPE           CLUSTER-IP       EXTERNAL-IP                                                                PORT(S)                       AGE
grafana      LoadBalancer   10.100.252.229   a942a31a4780f11eaa9010a814a720da-1449083553.ap-south-1.elb.amazonaws.com   3000:31159/TCP                3d21h
kubernetes   ClusterIP      10.100.0.1       <none>                                                                     443/TCP                       3d22h

a942a31a4780f11eaa9010a814a720da-1449083553.ap-south-1.elb.amazonaws.comは新しく作成されたサービスのホスト名で、3000はアクセスするポートです。 http://a942a31a4780f11eaa9010a814a720da-1449083553.ap-south-1.elb.amazonaws.com:3000にアクセスし、admin / adminを使用してログインし、次のようにGrafanaが稼働していることを確認します。

image.png

同様に、Graphiteのポッドとサービスを作成してみましょう。 以下の設定ファイルを使用して、Graphiteサービスを作成します。

apiVersion: apps/v1
kind: Deployment
metadata:
 labels:
   app: graphite
 name: graphite
spec:
 replicas: 1
 selector:
   matchLabels:
     app: graphite
 template:
   metadata:
     labels:
       app: graphite
   spec:
     containers:
     - image: graphiteapp/docker-graphite-statsd
       name: graphite
       ports:
       - containerPort: 2003
         name: carbon-plain     
       - containerPort: 2004
         name: carbon-pkl   
       - containerPort: 2023
         name: carbon-ag-plain
       - containerPort: 2024
         name: carbon-ag-pkl   
       - containerPort: 8125
         name: statsd   
       - containerPort: 8126
         name: statsd-admin  
       - containerPort: 80
         name: http       
---
apiVersion: v1
kind: Service
metadata:
 name: graphite
 labels:
   app: graphite
spec:
 type: LoadBalancer
 ports:
 - port: 80
   protocol: TCP
   targetPort: 80
   name: http
 - port: 2003
   protocol: TCP
   targetPort: 2003
   name: carbon
 selector:
   app: graphite

「kubectl create -f Graphite-deployment.yml」を実行して、このポッドとサービスを作成します。
この時点で、GrafanaとGraphiteの両方が稼働しているはずです。
「kubectl get service」を実行して、両方のサービスが稼働していることを確認します。

➜  ~/github/k8-graphite-monitoring (master) kubectl get service
NAME         TYPE           CLUSTER-IP       EXTERNAL-IP                                                                PORT(S)                       AGE
grafana      LoadBalancer   10.100.252.229   a942a31a4780f11eaa9010a814a720da-1449083553.ap-south-1.elb.amazonaws.com   3000:31159/TCP                3d21h
graphite     LoadBalancer   10.100.216.91    ac0f466207b2211eaa9010a814a720da-687823427.ap-south-1.elb.amazonaws.com    80:32198/TCP,2003:32041/TCP   104s
kubernetes   ClusterIP      10.100.0.1       <none>                                                                     443/TCP                       3d22h

Grafanaと同様に、ブラウザーにhttp://ac0f466207b2211eaa9010a814a720da-687823427.ap-south-1.elb.amazonaws.comと入力して、以下に示すように、GraphiteWebアプリケーションを開くことができます。

image.png

次に、GrafanaのデータソースとしてGraphiteを追加します。 以下に示すように、Grafanaのデータソースセクションを参照し、データソースとしてGraphiteを追加します。

image.png

次に、KubernetesクラスターでSnap Daemonを実行します。 Snap Daemonは、さまざまなkubernetesモニタリングメトリックをプルし、それらをGraphiteにプッシュするモニタリングデーモンです。

Snap Daemonを実行する前に、snap_ds.yml内に1つの小さな変更を加える必要があります。 次に示すように、configセクションでGraphiteサービスのホスト名とポートを更新します。

apiVersion: apps/v1
kind: DaemonSet
metadata:
 name: snap
spec:
 selector:
   matchLabels:
     name: snap
 template:
   metadata:
     name: snap
     labels:
       name: snap
   spec:
     hostPID: true
     hostNetwork: true
     containers:
     - name: snap
       image: raintank/snap_k8s:v4
       volumeMounts:
         - mountPath: /sys/fs/cgroup
           name: cgroup
         - mountPath: /var/run/docker.sock
           name: docker-sock
         - mountPath: /var/lib/docker
           name: fs-stats
         - mountPath: /usr/local/bin/docker
           name: docker
         - mountPath: /proc_host
           name: proc
         - mountPath: /opt/snap/tasks
           name: snap-tasks
       ports:
       - containerPort: 8181
         hostPort: 8181
         name: snap-api
       imagePullPolicy: IfNotPresent
       securityContext:
         privileged: true
       env:
         - name: PROCFS_MOUNT
           value: /proc_host
     volumes:
       - name: dev
         hostPath:
           path: /dev
       - name: cgroup
         hostPath:
           path: /sys/fs/cgroup
       - name: docker-sock
         hostPath:
           path: /var/run/docker.sock
       - name: fs-stats
         hostPath:
           path: /var/lib/docker
       - name: docker
         hostPath:
           path: /usr/bin/docker
       - name: proc
         hostPath:
           path: /proc
       - name: snap-tasks
         configMap:
           name: snap-tasks
---
apiVersion: v1
kind: ConfigMap
metadata:
 name: snap-tasks
data:
 core.json: |-
   {
       "version": 1,
       "schedule": {
           "type": "simple",
           "interval": "10s"
       },
       "workflow": {
           "collect": {
               "metrics": {
                   "/intel/docker/*":{},
                   "/intel/procfs/cpu/*": {},
                   "/intel/procfs/meminfo/*": {},
                   "/intel/procfs/iface/*": {},
                   "/intel/linux/iostat/*": {},
                   "/intel/procfs/load/*": {}
               },
               "config": {
                   "/intel/procfs": {
                       "proc_path": "/proc_host"
                   }
               },
               "process": null,
               "publish": [
                   {
                       "plugin_name": "graphite",                   
                       "config": {
                           "prefix": "snap.dev.<%NODE%>",
                           "server": "ac0f466207b2211eaa9010a814a720da-687823427.ap-south-1.elb.amazonaws.com",
                           "port": 2003
                       }
                   }
               ]
           }
       }
   }

「kubectl create -f snap_ds.yml」を実行して、スナップデーモンを作成し、開始します。 「kubectl get pod」を実行すると、次のような出力が表示されます。

NAME                       READY   STATUS    RESTARTS   AGE
grafana-6f64b8c7f6-tc7qn   1/1     Running   0          3d23h
graphite-775d8b989-zwp9x   1/1     Running   0          65m
snap-dblx2                 1/1     Running   0          56m
snap-g5pzm                 1/1     Running   0          56m
snap-jdqrg                 1/1     Running   0          56m

Grafana用に1つのポッド、Graphite用に1つ、Snap用に3つが表示されます。 これは、Kubernetesクラスターに3つのノードがあり、Snapが各ノードでデーモンとして実行され、メトリックをプルしてGraphiteにプッシュするためです。

Grafanaでモニタリングの視覚化をプロットする

Grafanaには、Grafanaダッシュボードのリソースサイトで見つけることができる多くの事前構築されたダッシュボードが付属しています。 これらのダッシュボードの1つをKubernetesモニタリングに利用します:KubernetesContainer Stats

Kubernetes Container Statsページで、Download JSONリンクをクリックして、Grafanaポータルにインポートします。 グラファイトデータソースを適切に選択してください。

image.png

ダッシュボードがインポートされるとすぐに、以下のように、ダッシュボードにメトリックが表示されます。

image.png
image.png

同様に、別のダッシュボードKubernetes Nodeホストメトリックがあります。 これがインポートされると、ダッシュボードで選択されたホストごとのメトリックが表示されます。

image.png

これらのダッシュボードの値が重要なしきい値を超えた場合は、これらのダッシュボードにアラートを設定することができます。 Grafanaアラートの設定方法とカスタムダッシュボードの作成方法については、記事「基本から詳細までのGrafanaダッシュボード」をご覧ください。

Kubernetesによって公開された指標に基づいて、他のタイプの視覚化を作成することもできます。 「お気に入りのGrafanaダッシュボード」の記事を見て、より高度なダッシュボードをいくつか作成してください。

MetricFireによるモニタリングのセットアップ

上記で行った設定は、ほんの数個のノードを含む非常に基本的なKubernetesインフラストラクチャで機能します。 数百ノード以上の数Mbpsのネットワークトラフィックである本番レベルの負荷を処理するには、増加する負荷を処理するために、GraphiteとGrafanaの両方をスケールアウトする必要があります。

Hosted GraphiteHosted Grafanaが登場します。 これにより、長期間のストレージに合わせてスケーリングし、データの冗長ストレージを自動的に提供できます。

MetricFireを介したホストされたGraphiteとホストされたGrafanaは、MetricFireのすべての製品が成長し続けるオープンソースプロジェクトに基盤を持っているため、新機能の継続的なアクティブな展開を可能にします。 ここでMetricFireの無料トライアルにサインアップし、数分以内にKubernetesダッシュボードの構築を開始してください。

まとめ

この記事では、Graphiteを使用してKubernetesモニタリングを設定する方法について説明しました。 GraphiteとGrafanaを使用してKubernetesを監視するための高度な視覚化を見てきました。

Hosted GraphiteとGrafanaの無料トライアルにサインアップにご登録ください。 また、MetricFireの製品について、またはMetricFireがあなたの会社をどのように支援できるかについて質問がある場合は、是非デモを予約して直接当社にご連絡ください。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?