APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

【初心者】EKSでPrometheus、Grafanaによる監視ダッシュボードを作ってみた

こんにちは、クラウド事業部の中根です。

Kubernetes未経験だったのですが、業務で利用することになり予習することになりました。
監視ダッシュボード作成という題材をいただいたので、チャレンジしてみました。
自身の備忘録も兼ねて、共有させていただきます。

作業環境の準備

コマンド実行環境作成

CloudShellなど、お好みのコマンド実行環境を作成してください。
今回は再現性重視で、Cloud9で実行します。
名前だけ任意で決め、あとはデフォルトの設定で作成しました。

IAMロールの作成とアタッチ

※Cloud9以外でコマンド実行する方は飛ばしてください
デフォルトのIAM権限だと不十分なので、専用のIAMロールを作成します。
IAMのサービス画面を開き、「ロールを作成」を押下します。
以下の設定をして「次へ」を押下します。
・信頼されたエンティティタイプ:AWSのサービス
・ユースケース:EC2 -> EC2
検索欄に、「AdministratorAccess」 と入力し、AdministratorAccessポリシーにチェックを入れて、「次へ」を押下します。
注意:ここでは簡潔にするためにAdministratorAccess を付与していますが、実運用をする場合は最小権限にします。
ロール名を入力して、「ロールを作成」を押下します。

作成できたら、EC2のサービス画面を開き、インスタンス画面に遷移します。
検索欄に「aws-cloud9」 と入力します。
「aws-cloud9-<作成したCloud9環境名>」で始まるインスタンスを選択し、右上の「アクション」-> 「セキュリティ」 -> 「IAMロールを変更」を押下します。
作成したIAMロールに変更し、「IAMロールの更新」を押下します。

Cloud9コンソールの設定

Cloud9の接続画面に移ります。
右上の歯車マークを押下し、Preferences画面を開きます。
左メニューから、「AWS Settings」 -> 「Credentials」と進み、×にします。 以降、画面下のターミナルを中心に操作していきます。
下記コマンドを実行し、リージョンの設定をしておきます。

AWS_REGION="ap-northeast-1"
aws configure set region ${AWS_REGION}

下記コマンドを実行し、先ほどアタッチしたIAMロールが使用されていることを確認します。

EKSクラスター、アプリの構築

各種ツールのインストール

コマンド実行環境に、各種ツールをインストールしていきます。
eksctl

curl -L "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
sudo mv /tmp/eksctl /usr/local/bin

kubectl
※使いたいバージョンに応じてコマンドが変わります。
  特定のバージョンを使用したい場合は、ドキュメントを参照し、最初のcurlコマンドを書き換えてください。

curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.28.5/2024-01-04/bin/linux/amd64/kubectl
chmod +x ./kubectl
mkdir -p $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export PATH=$HOME/bin:$PATH
echo 'export PATH=$HOME/bin:$PATH' >> ~/.bashrc

ここからは便利ツールなので、任意です。
コマンド補完(eksctl、kubectl)

kubectl completion bash > kubectl_completion
sudo mv kubectl_completion /etc/bash_completion.d/kubectl
eksctl completion bash > eksctl_completion
sudo mv eksctl_completion /etc/bash_completion.d/eksctl

kube-ps1
 今自分がどのcontext/namespaceで作業しているのかが、ターミナルのプロンプトに表示されます。
 いちいちコマンドで確認する手間が省けます。

git clone https://github.com/jonmosco/kube-ps1.git ~/.kube-ps1
cat <<"EOT" >> ~/.bashrc

source ~/.kube-ps1/kube-ps1.sh
function get_cluster_short() {
  echo "$1" | cut -d . -f1
}
KUBE_PS1_CLUSTER_FUNCTION=get_cluster_short
KUBE_PS1_SUFFIX=') '
PS1='$(kube_ps1)'$PS1
EOT

kubectx & kubens
 context、namespaceの切り替えコマンドは、デフォルトだと割と長くなります。
 これを使うことで短くなり、少し楽になります。

git clone https://github.com/ahmetb/kubectx.git ~/.kubectx
sudo ln -sf ~/.kubectx/completion/kubens.bash /etc/bash_completion.d/kubens
sudo ln -sf ~/.kubectx/completion/kubectx.bash /etc/bash_completion.d/kubectx
cat <<"EOT" >> ~/.bashrc

export PATH=~/.kubectx:$PATH
EOT

導入したツールを有効化します。

. ~/.bashrc
. /etc/profile.d/bash_completion.sh
. /etc/bash_completion.d/kubectl
. /etc/bash_completion.d/eksctl

クラスターの作成

いよいよ、クラスターを作成してみます。

AWS_REGION=$(aws configure get region)
eksctl create cluster \
  --name=eks-test \
  --version 1.28 \
  --nodes=3 --managed \
  --region ${AWS_REGION} --zones ${AWS_REGION}a,${AWS_REGION}c

しばらく待ちます。(15分程度)
こんな感じで表示されたらOKです。

クラスターの起動を確認します。

eksctl get cluster

ノードの起動を確認します。

kubectl get node

ステータスがReadyになっていればOKです。

サンプルアプリケーションをデプロイ

作業用のディレクトリとnamespaceを作ります。

mkdir -p ~/environment/manifests/
cd ~/environment/manifests/
kubectl create namespace sample
kubens sample       # kubensを導入していない方は「kubectl config」コマンドで設定してください。

「~/environment/manifests/」ディレクトリにマニフェストを格納していきます。
ChatGPTにマニフェストを作ってもらいました。
ファイル名は自由ですが、ここでは「sample-deployment.yaml」にしました。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 2 # Podのレプリカ数を2に設定
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80

以下のコマンドでデプロイします。

kubectl apply -f ~/environment/manifests/sample-deployment.yaml

作成したDeploymentとPodがRunningになっていることを確認します。
なっていない場合は、少し待ってから確認してみてください。(1分程度)

kubectl get deployment
kubectl get pod

続いて、Serviceを作成します。(ファイル名「sample-service.yaml」)

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
  selector:
    app: nginx

ファイルを作成したら、サービスもデプロイします。

kubectl apply -f ~/environment/manifests/sample-service.yaml

serviceも起動確認します。

kubectl get service

このコマンドで出力されたEXTERNAL-IPで、作成したアプリケーション(nginx)にアクセスできます。
ロードバランサーがアクティブになるまでは、アクセスできないことに注意してください。

監視システムの構築

Helmを導入

Helm をインストールします。
Helmは、Kubernetesのパッケージマネージャーです。
一応無くても構築はできますが、これを使うと非常に簡単に構築ができます!

curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh
source <(helm completion bash)

Prometheusのインストール

Prometheusは、監視・アラート通知ツールです。
クラスター内のPod等のパフォーマンスをリアルタイムで収集分析してくれます。
以下のコマンドを実行します。

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install my-prometheus prometheus-community/kube-prometheus-stack

フリーズしたように見えますが、少し待つと、以下のような出力がされます。 インストール後の案内に従って、起動確認もしておきましょう。

Grafanaのインストール

Grafanaは、可視化ツールです。
Prometheusで収集したデータをいい感じに見せてくれます。
以下のコマンドを実行します。

helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
helm install my-grafana grafana/grafana \
    --set service.type=LoadBalancer

以下のような出力がされるので、コマンドを順番に実行します。
まずは1.のコマンドです。
出てきた文字列は、Grafanaへの初期ログインパスワードになります。

kubectl get secret --namespace sample my-grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo

続いて、2.のコマンドですが、そのまま実行してもうまくいかないと思います。
最後の「ip」を「hostname」にして実行してください。

export SERVICE_IP=$(kubectl get svc --namespace sample my-grafana -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')

最後に、GrafanaへログインするためのURLを出力します。

echo http://$SERVICE_IP:80

でてきたURLにアクセスすると、Grafanaのログイン画面が表示されます!
こちらもアクセスできるまで少し時間がかかります。
接続できない場合は以下のコマンドで、my-grafana-XXXのPodがRunningになっていることを確認しましょう。

kubectl get pods

usernameに”admin”、Passwordは、先ほど”kubectl get secret”コマンドで出てきた文字列を入力すると、ログインできます。

ログイン出来たら、左メニュー → Connections → Data sourcesを選択し、”Add data source”ボタンを押下 prometheusを検索し、選択します。
ConnectionにPrometheusへのURLを入力します。 URLのIPアドレス部は、以下のコマンドで確認できます。

kubectl get svc

表示された中から、NAMEの末尾が「kube-prometh-prometheus」をなっている行の、CLUSTER-IPです。
同じ名前で進めていれば、「my-prometheus-kube-prometh-prometheus」の行です。 一番下にスクロールし、Save & Testボタンを押下し、”Successfully queried the Prometheus API.”と出てくればOKです!

ダッシュボードを作ってみる

左メニュー → Dashboards → Create Dashboad → import dashboardと進んでいきます。
今回はGrafana Labsのダッシュボードをつかってみます。
Kubernetes Clusterにアクセスします。
「Copy ID to clipboard」を押下し、ダッシュボードのIDをコピーします。
コピーしたIDを入力し、「Load」します。 データソースには先ほど作成したものを選択し、「Import」を押下します。
一瞬でおしゃれなダッシュボードができました!
自分でカスタマイズしたり、1から作り上げていくこともできます!

お掃除

このままだと料金がかかってしまうので、リソースの削除を行います。

EKS

kubectl delete namespace sample

少し時間がかかります。(1,2分)

eksctl delete cluster --name eks-test

途中で失敗しているときがあるので、CloudFormation上から”eksctl-eks-test-XXX”スタックがすべて削除されていることを確認しましょう。

Cloud9

環境を選択して削除します。

IAMロール

Cloud9にアタッチしていたIAMロールも削除しておきます。