あふん

ぷろぐらむとか

Kubernetes のソースコードとの付き合い方 というタイトルで登壇してきました #gounco

登壇してきたという報告です。

gounconference.connpass.com

私が Kubernets のソースを読もうと思ったきっかけとして、k8s source code reading という勉強会の存在があるんですけど、最近開催されなくてかなしい。

k8s-code-reading.connpass.com

ブコメでいただいたこれ、本当にその通りなのでがんばりたい。

Schedulerに関しても大事なコンポーネントなので掘り下げていきたい気持ちがある。

qiita.com

Amazon EKS にはデフォルトだと Metrics Server がいないので HorizontalPodAutoscaler が動いてくれないと言う話

f:id:ponde_m:20190325193636p:plain:w300

TL;DR

docs.aws.amazon.com

HorizontalPodAutoscaler と Metrics Server

HorizontalPodAutoscaler は Deployment とか ReplicaSet とかの Pod 数をメトリクスに基づいてスケールさせてくれます。

kubernetes.io

この際に用いるメトリクスは 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 に参加してきた

f:id:ponde_m:20190404184917p:plain:w300

opencensus.connpass.com

参加してきました。抽選倍率高めだったのでブログ枠にしました。書きます。 メモはしたけどスライドが全部公開されていて、見ればだいたい書いてあるので感想成分多めでいきます。

私のステータスとしては OpenCensus の存在は知ってるけど実際に手を動かして触ったことはないみたいな感じでこの勉強会に参加してました。

OpenCensus Intro and Status Update

docs.google.com

OpenCensus の概要から今後の展望の話とかをしていただきました。OpenCensus が Collector と Exportor に別れているから、送信するバックエンドを変えるときは Exportor だけ変えればいいんだよぐらいの話は把握してたんですけど、Stats/Metrics の方の話とかなんにも知らなかったので勉強になりました。

OpenCensus Service についてはなにも知らなくて今回初耳だったんですけど、Exportor 自体はそれぞれのバックエンドに依存していてアプリの中に組み込まれているのでバックエンドの切り替え時にはコードに手を入れなきゃいけない、ので Agent として外に切り出そう、みたいな思想は良いなーと思ったので今後に期待したいです。

デザインドキュメント軽く読んでたら OpenCensus 以外からのデータも OpenCensus Agent で受け取れるように Recevier 用意して拡張できたりするんですね、すごい。

f:id:ponde_m:20190404194006p:plain:w500

opencensus-service/DESIGN.md at master · census-instrumentation/opencensus-service · GitHub

OpenCensusを実際に使ってみて、便利なところと、困ってるところ

docs.google.com

GCPSDK に 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

docs.google.com

Java のお話でした。お仕事のでは Java と Spring Boot 使ってたりするんですが、Spring Cloud Sleuth なるものがあるんですね。知らなかった。

spring.io

JavaのCustom Exporterを書いてみた / Writing custom exporter for Java

docs.google.com

JavaAWS X-Ray Exporter を作ったというお話でした。200 行ぐらいでメインのロジックは書けたらしい、すごい。

github.com

TracingとLoggingの連携 / Tracing and logging correlation

github.com

f:id:ponde_m:20190404235018p:plain:w500

Jaeger を使って Trace 情報と Log を紐づけるお話でした。デモアプリケーションがサクッと動くので動かすとわかりやすいです。

OpenCensus の Span には Log フィールドがないので annotations に入れとくと Jaeger Exporter が OpenTracing Span の Log に変換してくれるらしいです。このへんこのへん

Gopher くんはニンジンが好きらしい。かわいい。

OpenCensus Stats で PaaS のメトリクスを補完する / Interpolate PaaS metrics with OpenCensus Stats

docs.google.com

OpenCensus Stats のお話。アプリケーションメトリクスも OpenCensus で取得できるよとのことでした。OpenCensus についてまさに Trace しか知らない人間だったので学びしかありませんでした。

Ruby実装について / About Ruby implementation

Wantedly さんで OpenCensus の Ruby 実装 やっていくぞというスライド。かっこいい。

ウェブフロントエンドからサーバーまでの一気通貫のトレーシングに挑戦してみる / Try consistent tracing from web frontend to backend servers

docs.google.com

フロントエンドからの Tracing のお話。WebSocket でサーバに繋いで start/end を代わりに実行してもらう感じらしい。

この LT で Observability は港区用語。というパワーワード爆誕していて笑いました。

おわりに

OpenCensus 全然わかってなかったので本当に勉強になりました。これからは手を動かしていきたい。

今回が初回の勉強会だったのですが、OpenCensus マジヤバイとか言って流行らせると2回目が開催されるらしいので布教していきたいと思います。

OpenCensus マジヤバイ