Amazon CloudWatch Container Insightsを導入する

最近 Anket 以外にもプライベートで作成したサービスをリリースしたのですが実行環境には両方とも k8s を採用してます。
k8sAWS の EC2 上に構築しているのですが、 EKS は使用しておらず kops を使って構築しています。

そのあたりの話はここに書いてます。
blog.hatappi.me

今回やったこと

k8s 上で運用する pod も増えてきたので、pod がどれくらいのリソースを使っているのかを見たくなりました。
そこで今回は pod のリソース をどうやって監視するのかを考えました。

検討した方法

Monitoring Saas から OSS まで色々ある。

今回使用したもの

今回は Amazon CloudWatch Container Insights を使うことにしました。

選定した基準としては導入のお手軽さとコストです。

まずお手軽さから Prometheus を除きました。
Prometheus は使ったことがないので正確ではないと思いますが、メトリクスの収集先とかダッシュボード的なサーバーを自分で管理する必要がある?認識なので今回は除きました。

価格という面だと Datadog や Mackerel は少々お値段がかかりそうでした。

Amazon CloudWatch Container Insights はどうかというと まずお手軽さは結構あって CloudWatch Container Insights 用の namespace を作成して ServiceAccount, ConfigMap, そして agent を DaemonSet として起動してあげるだけで基本はいける。

収集したメトリクスは AWS のコンソールからこんな感じで見ることができる。

f:id:hatappi1225:20190723003905p:plain

Amazon CloudWatch Container Insights の導入

ドキュメント通りにやれば導入できるはずです。

docs.aws.amazon.com

今回はまったところ

一通りドキュメントを見て導入したあとにメトリクスがとれてないので agent の pod のログを見ると 次のエラーログが出てました。

Unauthorized panic: Cannot retrieve cadvisor data from kubelet

これはドキュメントのトラブルシューティングにも書いてあって kubelet で webhook authentication が有効になってないっぽいです。

docs.aws.amazon.com

kops を使ってる場合は authenticationTokenWebhook を true にしてあげれば webhook は有効になるので kops rolling-update cluster --yes で update してあげればメトリクスがとれるようになるはず。

apiVersion: kops/v1alpha2
kind: Cluster
spec:
  ~~~
  kubelet:
    anonymousAuth: false
    authenticationTokenWebhook: true
  kubernetesApiAccess:

最後に

金額面などみつつしばらくこれで運用してみようと思います。