PrometheusをEKSにデプロイしてEKSクラスターをモニタリングしてみた

2019.11.14

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは!AWS事業本部の島川です。

EKSクラスターの監視やモニタリングの方法は色んなやり方がありますが、今回はPrometheusを使ってモニタリングしてみました。

なおこちらはAmazon EKS WorkshopMONITORING USING PROMETHEUS AND GRAFANAを元に実施しています。EKSのワークショップがたくさんあるのでぜひ覗いてみてください。

それではやっていきます!

環境

AWS Cloud9を使って今回は構築しました。EC2/t2.micro/Amazon Linuxと最小構成のものです。

EKSを作成する。

まっさら状態ですので、まずはEKSを作成します。今回はeksctlコマンドを用いてインストールしてみました。

eksctlをインストールする。

参考:weaveworks/eksctl

$ curl --silent --location "https://github.com/weaveworks/eksctl/releases/download/latest_release/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
$ sudo mv -v /tmp/eksctl /usr/local/bin
$ eksctl version
[ℹ]  version.Info{BuiltAt:"", GitCommit:"", GitTag:"0.9.0"}

EKSクラスターを作成する。

参考:Amazon EKS クラスターの作成

t3.mediumで2つのノードを起動します。

$ eksctl create cluster \
> --name eksmonitoring \
> --version 1.14 \
> --nodegroup-name standard-workers \
> --node-type t3.medium \
> --nodes 2 \
> --nodes-min 1 \
> --nodes-max 4 \
> --node-ami auto

完成まで大体15分くらいかかりました。VPCやサブネットに関しても自動で作成されていました。

起動確認

$ kubectl get nodes
NAME                                                STATUS   ROLES    AGE     VERSION
ip-192-168-31-136.ap-northeast-1.compute.internal   Ready    <none>   5m58s   v1.14.7-eks-1861c5
ip-192-168-80-55.ap-northeast-1.compute.internal    Ready    <none>   6m4s    v1.14.7-eks-1861c5

kubectlのインストールコマンドが入っていない場合はこちら kubectl のインストール

1.14をインストールしています。

$ curl -o kubectl https://amazon-eks.s3-us-west-2.amazonaws.com/1.14.6/2019-08-22/bin/linux/amd64/kubectl
$ chmod +x ./kubectl
$ mkdir -p $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export PATH=$HOME/bin:$PATH

$ kubectl version --short --client
Client Version: v1.14.7-eks-1861c5

環境変数をセット

STACK_NAME=$(eksctl get nodegroup --cluster eksmonitoring -o json | jq -r '.[].StackName')
INSTANCE_PROFILE_ARN=$(aws cloudformation describe-stacks --stack-name $STACK_NAME | jq -r '.Stacks[].Outputs[] | select(.OutputKey=="InstanceProfileARN") | .OutputValue')
ROLE_NAME=$(aws cloudformation describe-stacks --stack-name $STACK_NAME | jq -r '.Stacks[].Outputs[] | select(.OutputKey=="InstanceRoleARN") | .OutputValue' | cut -f2 -d/)
echo "export ROLE_NAME=${ROLE_NAME}" >> ~/.bash_profile
echo "export INSTANCE_PROFILE_ARN=${INSTANCE_PROFILE_ARN}" >> ~/.bash_profile

Prometheusをデプロイ

kubectl create namespace prometheus
helm install stable/prometheus \
    --name prometheus \
    --namespace prometheus \
    --set alertmanager.persistentVolume.storageClass="gp2" \
    --set server.persistentVolume.storageClass="gp2"

コンポーネントの起動確認

$ kubectl get all -n prometheus

NAME                                                 READY   STATUS    RESTARTS   AGE
pod/prometheus-alertmanager-6f5c6d6f49-8zxv5         2/2     Running   0          2m15s
pod/prometheus-kube-state-metrics-7fddb795c8-xtnx8   1/1     Running   0          2m15s
pod/prometheus-node-exporter-7269b                   1/1     Running   0          2m15s
pod/prometheus-node-exporter-mkwm9                   1/1     Running   0          2m15s
pod/prometheus-pushgateway-564f594fb6-5d6bj          1/1     Running   0          2m15s
pod/prometheus-server-775cc84c8f-5hpzf               2/2     Running   0          2m15s

NAME                                    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
service/prometheus-alertmanager         ClusterIP   10.100.237.213   <none>        80/TCP     2m15s
service/prometheus-kube-state-metrics   ClusterIP   None             <none>        80/TCP     2m15s
service/prometheus-node-exporter        ClusterIP   None             <none>        9100/TCP   2m15s
service/prometheus-pushgateway          ClusterIP   10.100.52.56     <none>        9091/TCP   2m15s
service/prometheus-server               ClusterIP   10.100.90.214    <none>        80/TCP     2m15s

NAME                                      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
daemonset.apps/prometheus-node-exporter   2         2         2       2            2           <none>          2m15s

NAME                                            READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/prometheus-alertmanager         1/1     1            1           2m15s
deployment.apps/prometheus-kube-state-metrics   1/1     1            1           2m15s
deployment.apps/prometheus-pushgateway          1/1     1            1           2m15s
deployment.apps/prometheus-server               1/1     1            1           2m15s

NAME                                                       DESIRED   CURRENT   READY   AGE
replicaset.apps/prometheus-alertmanager-6f5c6d6f49         1         1         1       2m15s
replicaset.apps/prometheus-kube-state-metrics-7fddb795c8   1         1         1       2m15s
replicaset.apps/prometheus-pushgateway-564f594fb6          1         1         1       2m15s
replicaset.apps/prometheus-server-775cc84c8f               1         1         1       2m15s

起動

Prometheusにログインするためにポートフォワーディングの設定をして起動します。

$ kubectl port-forward -n prometheus deploy/prometheus-server 8080:9090
Forwarding from 127.0.0.1:8080 -> 9090
Forwarding from [::1]:8080 -> 9090

確認してみた

Cloud9からTools > Preview > Preview Running Applicationと進むとPrometheusの画面が表示されます。タブから「targets」にアクセスするとノード一覧などが表示されます。

また「Graph」タブからグラフの確認もすることができます。loadaverage_1を表示してみました。

モニタリング項目は他にもたくさんあるので、色々カスタマイズできそうです。

さいごに

workshopという形ではありましたが、EKSでのモニタリングをPrometheusでやってみました。監視モニタリングというのは様々な手段がありますがその選択肢としてPrometheusいかがでしょうか。またこのworkshopはGrafanaを例にしたものもありますので、興味がある方はぜひ試してみてください!