Kubernetes のソースコードとの付き合い方 というタイトルで登壇してきました #gounco
Amazon EKS にはデフォルトだと Metrics Server がいないので HorizontalPodAutoscaler が動いてくれないと言う話
TL;DR
HorizontalPodAutoscaler と Metrics Server
HorizontalPodAutoscaler は Deployment とか ReplicaSet とかの Pod 数をメトリクスに基づいてスケールさせてくれます。
この際に用いるメトリクスは metrics-server と呼ばれるコンポーネントから API で取得します。metrics-server は kube-system の namespace に Deployment として配置して動作する形になります。
このへんのドキュメント を読むと kubelet に cAdvisor が含まれていてそいつが metrics-server にメトリクスを集約しているらしいです。
Metrics Server がいない
Amazon EKS にはデフォルトだとこの Metrics Server がいません。
eksctl で真っさらのクラスタを新規作成して、namespace: kube-system のリソースを見てみます。
$ eksctl create cluster \ --region ap-northeast-1 \ --nodes 1 \ --nodes-min 1 \ --nodes-max 1 \ --version 1.12
$ kubectl get deployment -n kube-system NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE coredns 2 2 2 2 10m
CoreDNS しかいないですね。この状態で適当な HPA を apply して get してみます。
$ kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE sample-hpa Deployment/sample-deployment <unknown>/50% 1 10 0 10s
このように、TARGETS のところが <unknown>/50%
のように表示され、動いてくれません。
describe してみると Event の所に以下のようなメッセージが出ています。
$ kubectl describe hpa sample-hpa ... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedGetResourceMetric 3m26s (x4897 over 20h) horizontal-pod-autoscaler unable to get metrics for resource cpu: unable to fetch metrics from resource metrics API: the server could not find the requested resource (get pods.metrics.k8s.io)
メトリクスが取得できないと書かれてあります。このように metrics-server がいないと HorizontalPodAutoscaler が動作しません。
Metrics Server を apply する
metrics-server の apply 方法はドキュメントに書いてある通りです。 Helm chart もあるので Helm を用いる場合はこちらを使いましょう。
$ kubectl create -f deploy/1.8+/
metrics-server が apply できたら再度 kube-system の Deployment を確認してみます。
$ kubectl get deployment -n kube-system NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE coredns 2 2 2 2 1d metrics-server 1 1 1 1 3h
metrics-server という deployment ができました。
この状態で再度 HPA を get してみると正常に CPU のメトリクスを取得していることが確認できます。
$ kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE sample-hpa Deployment/sample-deployment 130%/50% 1 10 10 1d
まとめ
Since metrics server is prerequisite for a number of Kubernetes components (HPA, scheduler, kubectl top) it will run by default in all Kubernetes clusters.
OpenCensus meetup vol.1 に参加してきた
参加してきました。抽選倍率高めだったのでブログ枠にしました。書きます。 メモはしたけどスライドが全部公開されていて、見ればだいたい書いてあるので感想成分多めでいきます。
私のステータスとしては OpenCensus の存在は知ってるけど実際に手を動かして触ったことはないみたいな感じでこの勉強会に参加してました。
OpenCensus Intro and Status Update
OpenCensus の概要から今後の展望の話とかをしていただきました。OpenCensus が Collector と Exportor に別れているから、送信するバックエンドを変えるときは Exportor だけ変えればいいんだよぐらいの話は把握してたんですけど、Stats/Metrics の方の話とかなんにも知らなかったので勉強になりました。
OpenCensus Service についてはなにも知らなくて今回初耳だったんですけど、Exportor 自体はそれぞれのバックエンドに依存していてアプリの中に組み込まれているのでバックエンドの切り替え時にはコードに手を入れなきゃいけない、ので Agent として外に切り出そう、みたいな思想は良いなーと思ったので今後に期待したいです。
デザインドキュメント軽く読んでたら OpenCensus 以外からのデータも OpenCensus Agent で受け取れるように Recevier 用意して拡張できたりするんですね、すごい。
opencensus-service/DESIGN.md at master · census-instrumentation/opencensus-service · GitHub
OpenCensusを実際に使ってみて、便利なところと、困ってるところ
GCP の SDK に OpenCensus が組み込まれてるの、めちゃくちゃ便利そう。基本 Trace 情報はサンプリングされているので、ダメだったやつピンポイントで Trace が見たいけど難しい。trace.AlwaysSample{}
で全部出力しようとしたけど buffer full になって捨てられた。みたいなつらいお話が聞けました。サンプリングで欲しいのが取れない話、割と聞くので苦労ポイントっぽい。Trace の Span だけ見てないでその瞬間の CPU などの他の Metrics も考慮しようって話はいいお話でした。
Distributed Tracing with OpenCensus at Wantedly
Wantedly さんの発表。OpenCensus を導入した背景から、入れてみた課題について触れられていました。技術選定のときにどういうことを考えて OpenCensus を選択したとか、実際のマイクロサービスでは共通ライブラリに実装を入れていて、検索用にメタデータには Kubenetes の情報とか Request ID/User ID とか入れてるよとかの情報が聞けて学びがありました。
Exporter がコードに依存するのでライブラリのアップデートなどのつらみがあったり、使ってる言語での Exporter 実装がなかったりしたときにつらいことになるので OpenCensus Service によってアプリとベンダが分離された世界になると嬉しいとのことでここでも期待されてる感じでした。
OpenCensus Javaで始めるOpenCensus
Java のお話でした。お仕事のでは Java と Spring Boot 使ってたりするんですが、Spring Cloud Sleuth なるものがあるんですね。知らなかった。
JavaのCustom Exporterを書いてみた / Writing custom exporter for Java
Java の AWS X-Ray Exporter を作ったというお話でした。200 行ぐらいでメインのロジックは書けたらしい、すごい。
TracingとLoggingの連携 / Tracing and logging correlation
Jaeger を使って Trace 情報と Log を紐づけるお話でした。デモアプリケーションがサクッと動くので動かすとわかりやすいです。
OpenCensus の Span には Log フィールドがないので annotations に入れとくと Jaeger Exporter が OpenTracing Span の Log に変換してくれるらしいです。このへんとこのへん。
Gopher くんはニンジンが好きらしい。かわいい。
OpenCensus Stats で PaaS のメトリクスを補完する / Interpolate PaaS metrics with OpenCensus Stats
OpenCensus Stats のお話。アプリケーションメトリクスも OpenCensus で取得できるよとのことでした。OpenCensus についてまさに Trace しか知らない人間だったので学びしかありませんでした。
Ruby実装について / About Ruby implementation
Wantedly さんで OpenCensus の Ruby 実装 やっていくぞというスライド。かっこいい。
ウェブフロントエンドからサーバーまでの一気通貫のトレーシングに挑戦してみる / Try consistent tracing from web frontend to backend servers
フロントエンドからの Tracing のお話。WebSocket でサーバに繋いで start/end を代わりに実行してもらう感じらしい。
この LT で Observability は港区用語。というパワーワードが爆誕していて笑いました。
Observabilityは港区用語。俺たちは現実《リアル》を把握していく と表現することで足立区まで到達していける #opencensusjp
— わかめ@毎日猫がいる (@vvakame) 2019年4月3日
おわりに
OpenCensus 全然わかってなかったので本当に勉強になりました。これからは手を動かしていきたい。
今回が初回の勉強会だったのですが、OpenCensus マジヤバイとか言って流行らせると2回目が開催されるらしいので布教していきたいと思います。
OpenCensus マジヤバイ