Upgrade to Pro — share decks privately, control downloads, hide ads and more …

kubernetes(GKE)環境でのdatadog利用事例 / Using Datadog in Kubernetes environment

HAL
November 08, 2016

kubernetes(GKE)環境でのdatadog利用事例 / Using Datadog in Kubernetes environment

HAL

November 08, 2016
Tweet

More Decks by HAL

Other Decks in Technology

Transcript

  1. ©2016 D.A.Consortium All rights reserved 目次 2 • 自己紹介 • DACについて

    • AudienceOne • KubernetesとGKE • AudienceOneでのdatadog の利用方法 • 今後のdatadogに改善を期待する点 • まとめ
  2. ©2016 D.A.Consortium All rights reserved 自己紹介 3 • 名前 ➢ 春名 光一

    (はるな こういち) • 経歴 ➢ 2006年4月 某DNSな会社に入社 (AS 18149) ➢ 2015年2月 デジタルアドバタイジングコンソーシアム(株) • 最近の業務 ➢ 自社サービスの運用や社内ネットワークの管理 ➢ Terraform や ansible を書いたりしてます
  3. [API] Request Receiver Aggregator [Batch] [Web] Log Aggregation Definition Publisher

    Admin Console Bulk Loader Definition Consumer scylladb [monitor] AudienceOne System Diagram
  4. [API] Request Receiver Aggregator [Batch] [Web] Log Aggregation Definition Publisher

    Admin Console Bulk Loader Definition Consumer scylladb [monitor] AudienceOne System Diagram 今日のお話
  5. ©2016 D.A.Consortium All rights reserved AudienceOneのシステム構成概要 • 一部だけGCP上に乗っている経緯などは、Google Cloud Platform Japan

    Blogに載っています ➢ http://googlecloudplatform-japan.blogspot.jp/2016/08 /dmp-google-cloud-platform.html • 外部サービスを利用していた部分を内製して再構 築しました ➢ 興味あればぜひ • 今日はその再構築した部分でdatadogをどのように 使っているかをお話します
  6. ©2016 D.A.Consortium All rights reserved 1. DockerなどのContainer技術に触ったことあ りますか? 2. Kubernetesとかswarm /

    ECS / GKE とか 使っていますか? 1. Kubernetes 2. GKE 3. Swarm 4. ECS 5. その他 12 質問
  7. ©2016 D.A.Consortium All rights reserved KubernetesとGKE • Kubernetes (k8s)とは ➢ 元はGoogleが自社のコンテナ技術で培ったノウハウを

    オープンソースにしたコンテナクラスタマネージャ ➢ 結構頻繁にドキュメント更新されている • GKE (Google Container Engine) ➢ GCP(Google Compute Platform) 上で利用できる Kubernetes のmanaged service ✓ kubernetesのVer. up後、早いと翌日には最新版が利用できるよ うになることも ➢ 素のkubernetesにはない機能もある ✓ node-poolなど • PodやReplica Setなどの概念がある 15
  8. ©2016 D.A.Consortium All rights reserved Pod Pod とは • いくつかのコンテナをグループ化したもの •

    KubernetesはPod単位で操作を行う • 1コンテナでも「コンテナが1つだけ含まれるPod」で1Pod • Pod内のコンテナは同一nodeに配置される • 仮想NICを共有するなどの特徴がある ➢ Pod内の他コンテナからlocalhostでアクセス可能 • コンテナ起動時と停止時に特定のコマンドを実行させること が可能 ➢ postStart / preStop / init-containers • ヘルスチェック関連のパラメータもある ➢ readinessProbe / livenessProbe など 16
  9. ©2016 D.A.Consortium All rights reserved Replica Set / Replication Controller/ Deployments

    Replica Setとは • Podの”Replica”を指定台数動かし続けるための仕組み ➢ “Replication Controller”との違いは、Selector が使えるかどうか ➢ “The only difference between a Replica Set and a Replication Controller right now is the selector support.” • Replica Setで作成されたPodに異常があったりPodを削除し た場合でも、Replica SetによりPodが再作成される • Podのimage updateをより宣言的に扱える”Deployments” の方が推奨されているみたい ➢ DeploymentsがReplica Setを制御してくれる • Replica Setを Autoscaling させる仕組みもある HPA (Horizontal Pod Autoscaling ) ➢ Autoscalingでnodeがscale inする時に preStop がうまく効かない模 様(GKE 1.3) ✓ Mackerelを試したときに自動退役できず問題に。。 18
  10. ©2016 D.A.Consortium All rights reserved Replica Set / Replication Controller/ Deployments

    node pod Ver 1 container node pod Ver 1 container pod Ver 1 container Repclia = 3 Replica Set 19 node pod Ver 2 container node pod Ver 2 container pod Ver 2 container Deployment s
  11. ©2016 D.A.Consortium All rights reserved Daemon Set Daemon Setとは • 全nodeもしくは、Selectorで指定したnodeにPodを動かすた

    めの仕組み • Replica Setでは、同一nodeに同じ構成のPodが複数動くこ とがあるが、 Daemon Setでは確実に1Podだけ動かせる様 になる ➢ logstash , fluentd のようなログコレクターなどを動かすのが容易に なる   20
  12. ©2016 D.A.Consortium All rights reserved Daemon Set node pod fluentd container

    node pod fluentd container node pod fluentd container java ruby Daemon Set 21
  13. ©2016 D.A.Consortium All rights reserved Service Service とは • 受け付けたトラフィックをPodに流すための仕組み •

    Port-forwarderやLoad Balancerの役割をする ➢ readinessProbe がokなPodへトラフィックが流れる • kubernetesクラスタ内からだけでなく、クラスタ外部からも 接続できる • Podへは環境変数で接続先ホスト名やポート番号を渡す • 外部のDNS名をCnameで返すことも出来るようになった • Ingress という概念もあるがここでは説明しません  
  14. ©2016 D.A.Consortium All rights reserved Service node node node java java

    23 Service GCLB or ELBなど selector: {“app”: java”} ruby selector: {“app”: “java”} selector: {“app”: “java”} selector: {“app”: “ruby”}
  15. ©2016 D.A.Consortium All rights reserved AudienceOneでの kubernetes GKE Request Receiver Cluster

    Request Receiver RS Cassandra Compatible DB fluentd send log via UDP fluetnd(active) message aggregator update GeoIP DB using geoip-update GeoIP DB notify GeoIP DB’s update Side kick geoip Request Receiver forward messages read GeoIP data fluentd(standby) message aggregator Request Receiver Treasure Data aggregator-active SVC aggregator-standby SVC nginx 25 Request Reciver SVC
  16. ©2016 D.A.Consortium All rights reserved AudienceOneでの kubernetes 26 • 必要リソースの関係で1nodeに1Podが配置されるよ うにしておきたい

    ➢ PodのhostPortを指定することで排他的にnodeのポート をPodから利用 ➢ Replica SetごとにGKEの nodeSelector などを利用して Podが起動するnode-poolを制御 • deployには”ReplicaSet” ではなく、” deployments” を利用 ➢ GithubのリリースブランチへのPRをマージするとコンテナ build, deploy処理が走る
  17. ©2016 D.A.Consortium All rights reserved AudienceOneでの datadog 利用 • kubernetes での単純なケース

    ➢ 全 node で動かす ✓ Daemon set を使う! 27 - apiVersion: extensions/v1beta1 kind: DaemonSet labels: app: dd-agent name: dd-agent spec: template: metadata: labels: app: dd-agent name: dd-agent spec: containers: - env: - name: API_KEY value: <your api key> image: datadog/docker-dd-agent:kubernetes (snip)
  18. ©2016 D.A.Consortium All rights reserved AudienceOneでの datadog 利用 node pod dd-agent

    container node pod dd-agent container node pod dd-agent container アプリ1 アプリ2 Daemon Set 28 一般的な場合
  19. ©2016 D.A.Consortium All rights reserved AudienceOneでの datadog 利用 29 GKE Request

    Receiver Cluster fluentd send log via UDP fluetnd(active) message aggregator update GeoIP DB using geoip-update GeoIP DB notify GeoIP DB’s update Side kick geoip Request Receiver forward messages read GeoIP data fluentd(standby) message aggregator Request Receiver aggregator-active SVC aggregator-standby SVC nginx docker-dd-agent docker-agent DS scylladb Treasure Data Request Receiver RS Request Reciver SVC
  20. ©2016 D.A.Consortium All rights reserved AudienceOneでの datadog 利用 • Fluetnd のメトリクスを取得したい!

    ➢ Daemon Setだと、メトリクス取得対象のFluentdは別Pod(別IP)になる ➢ PodのIPがわからないと接続できない!知るのも簡単じゃない! 1. 同一PodにDatadogを入れる 2. Fluentdを含むPodの “hostPort: <ポート番号>” でnodeのIPでListen す るようにし、dd-agentも “hostNetwork: true” でnode のIPを持たせて localhostで接続する ➢ AudienceOneでは、後者のやり方で対応 ➢ 1nodeに1Pod載せるためできた技 • ホスト名とポート番号をコンテナ内から知ることができ、etcd へ アクセスできる場合は、 Service Discovery 機能を使うのが良 さそう ➢ GKEでは kubernetes の etcdへ自由にアクセス出来ないためこのよう にした • もっといいやり方あったら教えてください! 30
  21. ©2016 D.A.Consortium All rights reserved AudienceOneでの現状 31 GKE Request Receiver Cluster

    fluentd send log via UDP fluetnd(active) message aggregator update GeoIP DB using geoip-update GeoIP DB notify GeoIP DB’s update Side kick geoip Request Receiver forward messages read GeoIP data fluentd(standby) message aggregator Request Receiver aggregator-active SVC aggregator-standby SVC nginx dd-agent docker-agent DS scylladb Treasure Data read fluentd monitor 同一IPを持っているので、 localhost接続 Request Reciver SVC
  22. ©2016 D.A.Consortium All rights reserved datadog の dashboard • 必要に応じてドリルダウンしたdashboardを作成 ➢

    tagやlabelで絞込 ➢ アラートなども適宜設定 • まだ、あまり使いこなせてません
  23. ©2016 D.A.Consortium All rights reserved datadogに改善を期待する点 • Dockerのバージョンアップなどで一部メトリクスが取れなくなることがある ➢ /sys/fs/cgroup 経由だと見えなくなることあり

    ➢ /var/run/docker.sock をホストマウントして見えるようになっているので、cpuや memoryもこっち経由で見るようにして欲しい ➢ Kubernetes Integration経由のメトリクスは見えている • GCP Integrationを有効にしているが、メトリクスを取りこぼす事がある ➢ LBのアクセス数とか歯抜けもいいところ ✓ 最後はBQに突っ込むのだが、ログが揃うのに多少時間がかかるため、リアルタイ ムの値を取りこぼすのは痛い ✓ GCPのコンソールで代用 • パーセンタイル値でグラフやアラートが作成できない? ➢ Stackdriver の集約関数だと実現可能 • グラフやアラートの設定が結構大変 ➢ JSON書くのもめんどくさい。。 ➢ Terraformで一括して設定出来るみたいなので、これを利用する? 35
  24. ©2016 D.A.Consortium All rights reserved 36 まとめ • Kubernetesの概略説明をしました ✓ Pod

    / Replica Set / Daemon Set / Service • Kubernetes 環境におけるdd-agentの設定例 を説明しました • AudienceOneでのdatadogの利用方法を説 明しました