Kubernetes_Logging入門.pdf

24606216ae4bbee28494552cb71cc220?s=47 yosshi_
July 23, 2019

 Kubernetes_Logging入門.pdf

24606216ae4bbee28494552cb71cc220?s=128

yosshi_

July 23, 2019
Tweet

Transcript

  1. 入門 CloudNative Days Tokyo 2019 虎ノ門ヒルズ

  2. • 吉村 翔太 • コミュニケーションズ所属 • データサイエンスチーム • インフラエンジニア データエンジニアリング

    • 、   • 趣味:ボードゲーム • コミュニティ活動 自己紹介
  3. • Kubernetesをはじめて困ること • KubernetesにおけるLoggingとは • どうしてコンテナのログは難しい? • kubectl logsコマンド  •

    Kubernetes Logging Architecture • System Component Logs 本日の目次
  4. をはじめて困ること

  5. • 最初に困ること – DeploymentとServiceを使ってコンテナにアクセスする・・よく分からない – ConfigMapを使って、パラメータを設定する・・・ギリギリわかる – PVCとPVを使ってディスクをマウントする・・・全く分からない • 次に困ること

    – CI/CDのパイプラインを作る – Kubernetesの監視基盤を作る 今日はこの中のログの話 K8sを触り始めた時の自分の感想 Kubernetesをはじめて困ること
  6. • 一晩でKubernetesを覚えて帰ろう。 ワンナイトBootCamp! -- cndjp#10 • OCHaCafe2 #1-これからはじめる! Kubernetes基礎 参考

    https://cnd.connpass.com/event/123046/ 参考 https://ochacafe.connpass.com/event/136115/ 参考: 初心者向けの資料
  7. における とは

  8. Cloud Nativeとは Observability(可観測性)を 持っていること 参考 https://github.com/cncf/toc/blob/master/DEFINITION.md

  9. Observabilityとは 参考 https://static.sched.com/hosted_files/kccnceu19/b7/Tom%20Wilkie%20and%20Frederic%20Branczyk%20-%20May%2023.pdf • Metrics, Logs & Tracesを集めて状態を観測出来るようにすること

  10. 参考:Metrics, Logs & Tracesのサンプル 参考 https://static.sched.com/hosted_files/kccnceu19/b7/Tom%20Wilkie%20and%20Frederic%20Branczyk%20-%20May%2023.pdf

  11. Observabilityで目指すところ 参考 https://grafana.com/blog/2018/12/12/loki-prometheus-inspired-open-source-logging-for-cloud-natives/

  12. KubernetesにおけるLoggingとは (1/2) 参考 https://kubernetes.io/docs/reference/glossary/?fundamental=true#term-logging • 公式サイトの用語集によると

  13. KubernetesにおけるLoggingとは (2/2) • 対象のログ – Application Logs • Kubernetes上にDeployしたコンテナのログ –

    System Component Logs • Control Planeと呼ばれるKuberntesのクラスタを支えるコンポーネントのログ • 目的 – プログラムのデバッグのため – クラスタの状態を把握するため 他にもAudit Logs(監査用)のログもあります。
  14. 今日話す割合 • Application Logs ( 80% ) • System Component

    Logs ( 20% ) • Audit Logs ( 0% ) みなさんがよく使うので割合は多め マネージドサービスを使うとそもそも考えな くていいので軽く触れる程度 上記のセッションで詳しく話してくれると信じてます。 [2H4] 16:40 - 17:20 「Kubernetesにauditログを求めるのは間違っているだろうか」 by 長谷川 誠 (サイバーエージェント)
  15. どうしてコンテナのログは難しい?

  16. コンテナの特徴 • コンテナが消えると元の環境に戻る コンテナ サーバ サーバ コンテナを する前と同じ

  17. コンテナのログが見たい時 • 何らかのトラブルがあったからログが見たい コンテナ サーバ サーバ コンテナにトラブルが発生 ログが見たいのにコンテナごとない

  18. コンテナオーケストレーション使用時の難しさ サーバ サーバ • コンテナがどこにDeployされるかはオーケストレーション任せ • トラブル時にどのサーバにコンテナがあったか分からない サーバ 正常に動いてた時はここにいたの?

  19. 物理&VMと比べた時のコンテナのログの難しさ • 物理&VMのログ – ログの出力先のファイルパスを理解しておく – ログを見たい時は対象のファイルパスを見ればよかった • コンテナのログ –

    コンテナが消えると、コンテナがDeployされる前の環境に戻る – ログに関するアーキテクチャを正しく理解した上で、 設計しておかないとログが追えない
  20. コマンド

  21. kubectl logs コマンド (1/2) • “kubectl logs”はKubernetes上のコンテナのログを確認するコマンド ログファイル コンテナ コンテナが“

    ”に 出力したログを確認できる からのリクエストの受付 : 上のエージェント
  22. kubectl logs コマンド (2/2) apiVersion: v1 kind: Pod metadata: name:

    counter spec: containers: - name: count image: busybox args: [/bin/sh, -c, 'i=0; while true; do echo "$i: $(date)"; i=$((i+1)); sleep 1; done'] の定義 を の 先の を気にすることなく ログが確認できる ここで思考を止めずに このログが何か考える
  23. Kubeletが見ているログファイル • “/var/logs/pods/コンテナ名”の配下のファイルを見てる ログファイル なぜかリンクになっている?

  24. Dockerが書き出しているログファイル • “/var/lib/docker/containers/”の配下のファイルを見てる が見ていたログと同じ ログファイル コンテナ

  25. kubectl logs コマンドの振り返り • “kubectl logs”はKubernetes上のコンテナのログを確認するコマンド ログファイル コンテナ “/var/logs/pods” からのリクエストの受付

    : 上のエージェント “/var/lib/docker/containers/”
  26. kubectl logsで困ること サーバ サーバ • コンテナをたくさんDeployした時にログを追いかけるのが大変 • サーバそのものが故障した場合にログが残らない可能性がある サーバ サーバがなくなると当然ログもない

    コンテナ
  27. ログの収集基盤 • コンテナをたくさんDeployした時にログを追いかけるのが大変 • ログが保管されている場所が欲しい ログの収集基盤 ログファイル の外にログが保管されててほしい

  28. • “kubectl logs --help”かReferenceを見るともっと分かります 参考 hhttps://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#logs 参考:kubectl logsをもっと詳しく

  29. None
  30. KubernetesのLoggingのArchitectureについて • 大きく分けて3種類のアーキテクチャがある アプリケーションからの直接出力 参考 https://kubernetes.io/docs/concepts/cluster-administration/logging/ 経由での出力 クラスタ単位での出力

  31. アプリケーションからの直接出力 • 方法 – アプリケーションが直接、ログ収集基盤に出力する • 特徴 – Kubernetesに対する理解があまり要らない •

    懸念点 – 各チームが違う言語で作り始めた時に、ルールとかその他諸々作るのが大変? – アプリケーション側で設計されてないとログが収集されない コンテナを多数 する場合 ログにホスト名が入ってないと追跡できない ログの出力先が環境変数で 定義されてるといいな
  32. Sidecar経由での出力 • 方法 – Fluentdなどを使って、アプリケーションのログをログ収集基盤に出力する • 特徴 – Kubernetesに対する理解はSidecarの仕組みが分かればなんとかなる –

    ログの加工やログ収集基盤の情報をアプリケーションから剥がしてSidecarに持たせられる • 懸念点 – Sidecarが死ぬとメインのコンテナも一緒に死ぬ – Sidecarを仕込み忘れるとログが収集されない
  33. コンテナ コンテナ の定義 の状態 の中にコンテナが 個あることが分かる 単位に が 個ある をデプロイすると

    内のコンテナ間で ディスク領域を共有できる 参考:Sidecarとは
  34. クラスタ単位での出力 その1 • 方法 – 各ノードにDeamonSetでFluentdなどをDeployしてログを収集する • 特徴 – Kubernetesのログの仕組みに対して理解が必要 –

    アプリケーション側で何もしなくてもログが収集できる • 懸念点 – コンテナが にログを出力しないと取れない
  35. クラスタ単位での出力 その2 • 方法 – アプリケーションのログをFluentdなどのSidecarでつけて に出力する – 各ノードにDeamonSetでFluentdなどをDeployしてログを収集する • 特徴

    – Kubernetesのログの仕組みに対して理解が必要 – アプリケーション側で何もしなくてもログが収集できる – 既存のコンテナが に出力しなくても使える • 懸念点 – Sidecarが死ぬとメインのコンテナも一緒に死ぬ – Sidecarを仕込み忘れるとログが収集されない
  36. 方法 特徴 アプリケーションからの直 接出力 Kubernetesのことが分からなくても良い アプリケーション側で好きにできる kubectl logsがあまり使えない Sidecar経由での出力 Kubernetesについてそこまで分からなくても良い

    FluentdなどのLogging Agentの機能を使えば柔軟に対応できる kubectl logsがあまり使えない クラスタ単位での出力 Kuberntesについては理解が必要 クラスタ単位で設定するためKubernetes上の全てのコンテナのログを収集できる kubectl logsが存分に使用できる 個人的には「クラスタ単位での出力」がおすすめ Logging Architectureのおさらい
  37. • Elasticsearch and Kibana – https://kubernetes.io/docs/tasks/debug-application-cluster/logging-elasticsearch-kibana/ • Stackdriver – https://kubernetes.io/docs/tasks/debug-application-cluster/logging-stackdriver/

    参考:公式にLoggingの方法が2つ載ってる
  38. 完全ガイド 実践ガイド 実践入門 参考:書籍

  39. None
  40. Lokiとは • Lokiとは – Prometheusのようにログを操作できる • 用途 – Grafana経由でLokiに接続することで Logを可視化できる

    • GitHub – ★6,609 | https://github.com/grafana/loki • 開発主体 – Grafana Labs 初心者向けにβ版のプロダクトを説明するってなんなの?って話はありますが そもそも、Lokiの話がしたくて前段としてログの説明をしてるので許して欲しい (CFP応募の2019/2時点でLokiは無名)
  41. KubeConでの発表の歴史と個人的な感想 • KubeCon 2018 NA で発表 – 反響:あまりない – 出来栄え:α版、商用で絶対に使わないで

    • そもそも当時のGrafanaで使えない – 所感:無理矢理出した感あるけど期待したい – 参考:https://sched.co/GrXC • KubeCon 2019 EU で発表 – 反響:Keynoteで騒がれる – 出来栄え:β版 • でも機能がまだ足りない – 所感:いい感じに進化してる – 参考:https://sched.co/MPbj が変わった!
  42. What is “Grafa Loki” ? • 概要 – ログの収集と可視化ツール •

    開発の背景 – Metricsだけではインシデントの全容の半分しか分からない – MetricsとLogsの参照時の切替コストを最小限にしたい(Grafanaで完結したい) • アプローチ – Prometheusと同様にラベルがあって、時系列にデータを格納 – Cortexを参考に水平スケールを意識 • Non-Goal – みたいな統計情報 長期間のログに対しての統計情報の取得はターゲットにしてない プロダクト選定にあたり が自分たちのビジネスをスケールするにあたり だけじゃなくて をターゲットにする姿勢は信用できる
  43. LokiとPrometheus、Cortexの関係性 のログ版 を 水平スケール 水平スケールの アーキテクチャを踏襲

  44. Cortexのアーキテクチャ 参考 https://github.com/cortexproject/cortex/blob/master/docs/architecture.md

  45. Lokiのアーキテクチャ 参考 https://grafana.com/blog/2019/04/15/how-we-designed-loki-to-work-easily-both-as-microservices-and-as-monoliths/ 入力が だいたい一緒ですね

  46. Lokiのアーキテクチャ(簡易) • “Promtail”をdeamonsetで各ノードに配置してログを収集 を に置き換えることも可 参考 https://grafana.com/blog/2018/12/12/loki-prometheus-inspired-open-source-logging-for-cloud-natives/ 上のコンテナのメタデータも が集めて ログに付与してくれる

  47. Lokiの操作 (1/4) 接続先を設定

  48. Lokiの操作 (2/4) で操作

  49. Lokiの操作 (3/4) 表示したい条件を入力 時系列で表示

  50. Lokiの操作 (4/4) 割合も表示してくれる 現時点の印象:kubectl logsをGUIでできるツールっぽい

  51. Lokiの今後について思うこと • 機能面に対する要望 – ダッシュボード • メトリクスと同じダッシュボードにログも載せたい – アラート •

    “error”って文字列を見つけたらSlackのチャネルに通知して欲しい • 公式のGitHubに期待すること – ドキュメントをもう少しなんとか・・ • “prometheus.io”みたいな公式サイトを作る話もある – Helmをもう少し整備して欲しい・・ • “ksonnet”のメンテはもういいから、Helmをもう少しメンテして欲しい • KubeCon 2019 North America(11/18–21)でGAになることを期待
  52. 参考:LokiのGUIに興味が沸いたら 参考 https://grafana.com/blog/2019/01/02/closer-look-at-grafanas-user-interface-for-loki/ • Grafana Labsのこの記事がおすすめ

  53. 参考:Lokiのメトリクスがある 参考 https://grafana.com/blog/2019/07/18/lokis-path-to-ga-loki-canary-early-detection-for-missing-logs/ • Loki自身のメトリクスが取れる

  54. 参考:もっとLokiを知りたくなったら 参考 https://grafana.com/categories/loki/   • 公式のGitHubがGrafanaLabsのBlogがおすすめ(正直、他に情報がない)

  55. • Helmの環境構築 1-1 helmのinit – 1-2 helm(tiller)へ権限を付与 実践 の詳しい話はこちら 参考:簡単!Lokiの環境構築

    -Helm-
  56. 2-3 namespaceの作成 2-2 helmのレポジトリのアップデート 2-1 Lokiのレポジトリの登録 • Lokiの環境構築 参考 https://github.com/grafana/loki/tree/master/production/helm

      2-4 Lokiのデプロイ 参考:簡単!Lokiの環境構築 -Loki-
  57. 3-4 ブラウザで「http://localhost:3000/」にアクセス • Grafanaの環境構築 3-3 port-forward 3-2 Grafanaのadminのパスワードの確認 3-1 Grafanaのインストール

    参考:簡単!Lokiの環境構築 -Grafana-
  58. 先ほど確認した パスワードを入力 参考:簡単!Lokiの環境構築 GUI操作 (1/5)

  59. クリック 参考:簡単!Lokiの環境構築 GUI操作 (2/5)

  60. クリック 参考:簡単!Lokiの環境構築 GUI操作 (3/5)

  61. クリック を入力 参考:簡単!Lokiの環境構築 GUI操作 (4/5)

  62. クリック 参考:簡単!Lokiの環境構築 GUI操作 (5/5)

  63. None
  64. コンテナ コンテナ そもそもKubernetesの全体はこんな感じ 経由で の操作を行い、 の状態に応じてアクションする

  65. コンテナ コンテナ System Component Logsの範囲 経由で の操作を行い、 の状態に応じてアクションする コンテナ以外全部

  66. ▪ API Server ▪ Controller Manager ▪ Scheduler etcdへのwrite、readを行うAPIサーバ 複数台配置して冗長化構成をとることができる

    デプロイするコンテナの個数等を管理する 複数台配置できるがリーダは1つだけ コンテナをどのNodeにデプロイするか決める 複数台配置できるがリーダは1つだけ 参考:Control Plane Components (1/2)
  67. ▪ Container runtime ▪ Kubelet ▪ Kube-proxy 文字通りコンテナのランタイム Docker以外を使用することもできる Node上に配置されるエージェント

    コンテナの起動停止等を行う コンテナとの接続を保証するためにNodeのNWを管理する 参考:Control Plane Components (2/2)
  68. “kube-system”のnamespaceを確認する 以外が全部いる 補足 この クラスタは 製です

  69. Master Nodeの中身 も実はコンテナ

  70. systemctlで“kubelet”を確認する (1/4) └─ └─                               起動時にこの を読んでる

  71. systemctlで“kubelet”を確認する (2/4) 参考 https://kubernetes.io/docs/tasks/administer-cluster/static-pod/ Static Pods機能を使うと 起動時に指定したmanifestに書かれたPodを 起動することができる

  72. systemctlで“kubelet”を確認する (3/4) 起動時に で指定した の が立つことで として機能している 参考 https://kubernetes.io/docs/tasks/administer-cluster/static-pod/

  73. systemctlで“kubelet”を確認する (4/4) 中身は普通の

  74. Application Logsと同じように扱える 「クラスタ単位での出力」のログ収集基盤を構築しておくと も集まるのでおすすめ System Component Logsの見方

  75. 参考:kubectl logsで確認する System Component Logsが“kubectl logs”で確認できる

  76. kubeletのログを確認する (1/2) 最後にkubeletのログを確認する

  77. kubeletのログを確認する (2/2) コンテナの知識はいらず、 の知識で確認できる

  78. • 結局、見るべきログは2種類 コンテナの ログファイル コンテナ “kubectl logs” kubeletの ログファイル “journalctl

    -u kubelet” Kubernetes Loggingのまとめ
  79. Special Thanks!! https://cnd.connpass.com/