Contents
はじめに
前回prometheusとgrafanaをkubernetes上で動かしました。
前回はprometheusとgrafanaを動かすことを目的としていましたが、今回は新たにsnmp-exporterを使ってみたいと思います。exporterとはprometheusでデータを取得するために必要なものです。
なんでsnmp-exporter?
snmp-exporterは名前の通りsnmpポーリングを使用します。
なんで数あるexporterからsnmp-exporterを選んだか?それは取っ付きやすいからです!w
NWエンジニアである私はsnmpに多少なじみがあり、k8sやprometheusという荒野に突撃した私にとってsnmpはオアシスです。
今回はpromethuesのstatic_configを使ってやるパターンです。
参考サイト
snmp-exporterの設定はこちらのサイト様を参考にさせていただきました。
prometheusのconfigは公式をもとに作成しました。
内部DNSを使ってドメインを指定することで解決しています。この部分はこちらを参考にさせていただきました。
公式だとこの辺。
ちなみに今回の参考サイトではないですが前回同様kkohtaka様のコードをもとにしてます。
使用した環境について
各versionはこちら
Ubuntu 16.04.4 LTS
docker:17.03.2-ce
kubectl:v1.10.1
prometheus:v2.2.1
snmp-exporter:v0.11.0
grafana:5.1.3
k8sの環境は前回と同じです。
SNMPのポーリング宛先としてRaspberry Pi3を使っています。192.168.0.31というアドレスです。
ciscoもyamahaもうちにはないのでorz
type: raspiのraspiはラズパイのことです。
ちなみにラズパイ側でのsnmp設定はdockerで作ってみました。
自分で何回か見返すこともあるので別の投稿で残しておきます。
各種ファイルについて
grafanaは前回と同様です。
prometheusに一部変更とsnmp-exporter.ymlを追加してます。
prometheus.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
apiVersion: v1 kind: ConfigMap metadata: name: prometheus-config namespace: monitoring data: prometheus.yml: | global: scrape_interval: 60s evaluation_interval: 60s scrape_configs: - job_name: 'snmp-exporter' tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token static_configs: - labels: type: cisco targets: - '192.168.0.100' - labels: type: raspi targets: - '192.168.0.31' metrics_path: /snmp relabel_configs: - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - source_labels: [type] target_label: __param_module - source_labels: [type] target_label: type - target_label: __address__ replacement: 'snmp-exporter-clusterip.monitoring.svc.cluster.local:9116' |
●kind: ConfigMap
前回と違う箇所だけ抜き出しました。
最後のreplacementはk8sでsnmp-exporterのpodをIPアドレス指定にするわけにはいかないので内部DNSを使ってドメインを指定することで解決しています。
・snmp-exporter-clusterip.monitoring.svc.cluster.local:9116について
snmp-exporter-clusteripはこのあと出てくるsnmp-add.ymlのService名です。
monitoringはnamespaceの名前です。svcは固定でcluster.localだそうです。
これでsnmp-exporterがどのnodeにいるかを気にしなくて済みます。
snmp-exporter.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
apiVersion: v1 kind: Service metadata: name: snmp-exporter-clusterip namespace: monitoring spec: type: ClusterIP selector: app: snmp-exporter-app ports: - name: snmp-exporter-port port: 9116 targetPort: 9116 --- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: snmp-exporter namespace: monitoring spec: replicas: 1 selector: matchLabels: app: snmp-exporter-app template: metadata: labels: app: snmp-exporter-app spec: containers: - name: snmp-exporter image: prom/snmp-exporter:v0.11.0 ports: - containerPort: 9116 volumeMounts: - name: config-volume mountPath: /etc/snmp_exporter volumes: - name: config-volume configMap: name: snmp.yml --- apiVersion: v1 kind: ConfigMap metadata: name: snmp.yml namespace: monitoring data: snmp.yml: | cisco: walk: - 1.3.6.1.2.1.2.2.1.16 - 1.3.6.1.2.1.2.2.1.20 - 1.3.6.1.2.1.31.1.1.1.1 - 1.3.6.1.4.1.9.9.109.1.1.1.1.6 metrics: - name: ifOutOctets oid: 1.3.6.1.2.1.2.2.1.16 type: counter help: The total number of octets transmitted out of the interface, including framing characters - 1.3.6.1.2.1.2.2.1.16 indexes: - labelname: ifName type: gauge lookups: - labels: - ifName labelname: ifName oid: 1.3.6.1.2.1.31.1.1.1.1 type: DisplayString - name: ifOutErrors oid: 1.3.6.1.2.1.2.2.1.20 type: counter help: For packet-oriented interfaces, the number of outbound packets that could not be transmitted because of errors - 1.3.6.1.2.1.2.2.1.20 indexes: - labelname: ifName type: gauge lookups: - labels: - ifName labelname: ifName oid: 1.3.6.1.2.1.31.1.1.1.1 type: DisplayString - name: cpmCPUTotal5secRev oid: 1.3.6.1.4.1.9.9.109.1.1.1.1.6 type: gauge help: The overall CPU busy percentage in the last 5 second period - 1.3.6.1.4.1.9.9.109.1.1.1.1.6 indexes: - labelname: cpmCPUTotalIndex type: gauge version: 2 auth: community: ciscopublic raspi: walk: - 1.3.6.1.2.1.2.2.1.10 - 1.3.6.1.2.1.2.2.1.14 metrics: - name: ifInOctets oid: 1.3.6.1.2.1.2.2.1.10 type: counter help: The total number of octets received on the interface, including framing characters - 1.3.6.1.2.1.2.2.1.10 indexes: - labelname: ifIndex type: gauge - name: ifInErrors oid: 1.3.6.1.2.1.2.2.1.14 type: counter help: For packet-oriented interfaces, the number of inbound packets that contained errors preventing them from being deliverable to a higher-layer protocol - 1.3.6.1.2.1.2.2.1.14 indexes: - labelname: ifIndex type: gauge version: 2 auth: community: public |
●kind: Serviceについて
prometheus.ymlと同じような感じですが内部だけでアクセスできればいいのでtypeをClusterIPにしています。
●kind: Deploymentについて
prometheusのときと同じような感じです。
podの/etc/snmp_exporterにsnmp.ymlを渡したいのでvolumeを使ってます。
●kind: ConfigMapについて
snmp.ymlを作っています。先ほどふれたsnmp.ymlがこれです。
作成は以前の投稿で書いたgeneratorを使用しています。
grafana.yml
前回と全く同じですので前回を参考にお願いします。
前回の設定削除
一応前回の設定は以下コマンドで消しています。
kubectl delete -f prometheus.yml
kubectl delete -f grafana.yml
grafanaはそのままでも問題ないと思いますが、prometheusはもしかしたらpodが再作成されないかもしれないので消しておいたほうが確実です。
k8sへ適応(デプロイ)
設定時のログはこちらです。前回と同じようにkubectl apply -f XXXX.ymlでデプロイしています。
具体的には以下コマンドです。
kubectl apply -f prometheus.yml
kubectl apply -f snmp-exporter.yml
kubectl apply -f grafana.yml
prometheus.ymlにmonitoringのNamespaceを作る箇所があるのでこれを初めにいれます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
one3@master:~/git/kubernetes-prometheus-grafana-snmp_exporter$ kubectl get pod --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE kube-system etcd-master 1/1 Running 4 20d kube-system kube-apiserver-master 1/1 Running 7 20d kube-system kube-controller-manager-master 1/1 Running 6 20d kube-system kube-dns-86f4d74b45-x4v4c 3/3 Running 9 20d kube-system kube-flannel-ds-nqshb 1/1 Running 6 20d kube-system kube-flannel-ds-pp264 1/1 Running 5 20d kube-system kube-flannel-ds-t2xzn 1/1 Running 6 20d kube-system kube-proxy-jstnm 1/1 Running 3 20d kube-system kube-proxy-vqg8b 1/1 Running 3 20d kube-system kube-proxy-x4bxx 1/1 Running 4 20d kube-system kube-scheduler-master 1/1 Running 6 20d kube-system kubernetes-dashboard-7d5dcdb6d9-c6nsd 1/1 Running 2 12d one3@master:~/git/kubernetes-prometheus-grafana-snmp_exporter$ kubectl apply -f prometheus.yml namespace "monitoring" created service "prometheus" created deployment.extensions "prometheus" created configmap "prometheus-config" created one3@master:~/git/kubernetes-prometheus-grafana-snmp_exporter$ kubectl apply -f snmp-exporter.yml service "snmp-exporter-clusterip" created deployment.extensions "snmp-exporter" created configmap "snmp.yml" created one3@master:~/git/kubernetes-prometheus-grafana-snmp_exporter$ one3@master:~/git/kubernetes-prometheus-grafana-snmp_exporter$ kubectl apply -f grafana.yml service "grafana" created deployment.extensions "grafana" created one3@master:~/git/kubernetes-prometheus-grafana-snmp_exporter$ one3@master:~/git/kubernetes-prometheus-grafana-snmp_exporter$ kubectl get pod --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE kube-system etcd-master 1/1 Running 4 20d kube-system kube-apiserver-master 1/1 Running 7 20d kube-system kube-controller-manager-master 1/1 Running 6 20d kube-system kube-dns-86f4d74b45-x4v4c 3/3 Running 9 20d kube-system kube-flannel-ds-nqshb 1/1 Running 6 20d kube-system kube-flannel-ds-pp264 1/1 Running 5 20d kube-system kube-flannel-ds-t2xzn 1/1 Running 6 20d kube-system kube-proxy-jstnm 1/1 Running 3 20d kube-system kube-proxy-vqg8b 1/1 Running 3 20d kube-system kube-proxy-x4bxx 1/1 Running 4 20d kube-system kube-scheduler-master 1/1 Running 6 20d kube-system kubernetes-dashboard-7d5dcdb6d9-c6nsd 1/1 Running 2 12d monitoring grafana-788574fb7f-xvf59 0/1 ContainerCreating 0 4s monitoring prometheus-c6d5f59-grw28 1/1 Running 0 21s monitoring snmp-exporter-6ddbb769bd-lpbsj 0/1 ContainerCreating 0 10s one3@master:~/git/kubernetes-prometheus-grafana-snmp_exporter$ kubectl get pod --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE kube-system etcd-master 1/1 Running 4 20d kube-system kube-apiserver-master 1/1 Running 7 20d kube-system kube-controller-manager-master 1/1 Running 6 20d kube-system kube-dns-86f4d74b45-x4v4c 3/3 Running 9 20d kube-system kube-flannel-ds-nqshb 1/1 Running 6 20d kube-system kube-flannel-ds-pp264 1/1 Running 5 20d kube-system kube-flannel-ds-t2xzn 1/1 Running 6 20d kube-system kube-proxy-jstnm 1/1 Running 3 20d kube-system kube-proxy-vqg8b 1/1 Running 3 20d kube-system kube-proxy-x4bxx 1/1 Running 4 20d kube-system kube-scheduler-master 1/1 Running 6 20d kube-system kubernetes-dashboard-7d5dcdb6d9-c6nsd 1/1 Running 2 12d monitoring grafana-788574fb7f-xvf59 1/1 Running 0 24s monitoring prometheus-c6d5f59-grw28 1/1 Running 0 41s monitoring snmp-exporter-6ddbb769bd-lpbsj 1/1 Running 0 30s one3@master:~/git/kubernetes-prometheus-grafana-snmp_exporter$ |
kubectl get pod –all-namespacesでgrafana、prometheus、snmp-exporterがRunning担っているのが確認できます。
動作確認
prometheusにアクセスし、targetsを確認します。
http://192.168.0.14:30090/targets
うまく動作しているとこちらのような画面になります。
192.168.0.31はラズパイです。snmpの設定もされているので当然UPしています。
192.168.0.100は比較用のダミーです。そもそも機器が存在しないためDOWNしてます(cisco機ほしい)
確認のため適当にグラフを作成してみます。今回はsnmp-exporter.ymlで作っているsnmp.ymlなかのraspi箇所で定義しているifInOctetsを見ています。
ちゃんとifInOctetsが見えてますね!
snmp-exporterがラズパイ3からifInOctetsを取得してくれています。
※grafanaは前回と代り映えないので割愛します。
Githubについて
こちらにまとめておいてます。
最後に
ということでsnmp-exporterの設定例でした。
あんまりprometheusでsnmp使う人少ないんですかね?事例が少なかったので書いてみました。
個人的にgrafanaのおかげもありますがcactiやzabbixよりも設定箇所が少なくて取っ付き易いと思うのでおすすめです。
コメント