Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

● 吉村 翔太 ● コミュニケーションズ所属 ● データサイエンスチーム ● インフラエンジニア データエンジニアリング ● 、   ● 趣味:ボードゲーム ● コミュニティ活動 自己紹介

Slide 3

Slide 3 text

• Kubernetesをはじめて困ること • KubernetesにおけるLoggingとは • どうしてコンテナのログは難しい? • kubectl logsコマンド  • Kubernetes Logging Architecture • System Component Logs 本日の目次

Slide 4

Slide 4 text

をはじめて困ること

Slide 5

Slide 5 text

• 最初に困ること – DeploymentとServiceを使ってコンテナにアクセスする・・よく分からない – ConfigMapを使って、パラメータを設定する・・・ギリギリわかる – PVCとPVを使ってディスクをマウントする・・・全く分からない • 次に困ること – CI/CDのパイプラインを作る – Kubernetesの監視基盤を作る 今日はこの中のログの話 K8sを触り始めた時の自分の感想 Kubernetesをはじめて困ること

Slide 6

Slide 6 text

• 一晩でKubernetesを覚えて帰ろう。 ワンナイトBootCamp! -- cndjp#10 • OCHaCafe2 #1-これからはじめる! Kubernetes基礎 参考 https://cnd.connpass.com/event/123046/ 参考 https://ochacafe.connpass.com/event/136115/ 参考: 初心者向けの資料

Slide 7

Slide 7 text

における とは

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

KubernetesにおけるLoggingとは (2/2) • 対象のログ – Application Logs • Kubernetes上にDeployしたコンテナのログ – System Component Logs • Control Planeと呼ばれるKuberntesのクラスタを支えるコンポーネントのログ • 目的 – プログラムのデバッグのため – クラスタの状態を把握するため 他にもAudit Logs(監査用)のログもあります。

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

どうしてコンテナのログは難しい?

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

物理&VMと比べた時のコンテナのログの難しさ • 物理&VMのログ – ログの出力先のファイルパスを理解しておく – ログを見たい時は対象のファイルパスを見ればよかった • コンテナのログ – コンテナが消えると、コンテナがDeployされる前の環境に戻る – ログに関するアーキテクチャを正しく理解した上で、 設計しておかないとログが追えない

Slide 20

Slide 20 text

コマンド

Slide 21

Slide 21 text

kubectl logs コマンド (1/2) • “kubectl logs”はKubernetes上のコンテナのログを確認するコマンド ログファイル コンテナ コンテナが“ ”に 出力したログを確認できる からのリクエストの受付 : 上のエージェント

Slide 22

Slide 22 text

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'] の定義 を の 先の を気にすることなく ログが確認できる ここで思考を止めずに このログが何か考える

Slide 23

Slide 23 text

Kubeletが見ているログファイル • “/var/logs/pods/コンテナ名”の配下のファイルを見てる ログファイル なぜかリンクになっている?

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

kubectl logsで困ること サーバ サーバ • コンテナをたくさんDeployした時にログを追いかけるのが大変 • サーバそのものが故障した場合にログが残らない可能性がある サーバ サーバがなくなると当然ログもない コンテナ

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

Sidecar経由での出力 • 方法 – Fluentdなどを使って、アプリケーションのログをログ収集基盤に出力する • 特徴 – Kubernetesに対する理解はSidecarの仕組みが分かればなんとかなる – ログの加工やログ収集基盤の情報をアプリケーションから剥がしてSidecarに持たせられる • 懸念点 – Sidecarが死ぬとメインのコンテナも一緒に死ぬ – Sidecarを仕込み忘れるとログが収集されない

Slide 33

Slide 33 text

コンテナ コンテナ の定義 の状態 の中にコンテナが 個あることが分かる 単位に が 個ある をデプロイすると 内のコンテナ間で ディスク領域を共有できる 参考:Sidecarとは

Slide 34

Slide 34 text

クラスタ単位での出力 その1 • 方法 – 各ノードにDeamonSetでFluentdなどをDeployしてログを収集する • 特徴 – Kubernetesのログの仕組みに対して理解が必要 – アプリケーション側で何もしなくてもログが収集できる • 懸念点 – コンテナが にログを出力しないと取れない

Slide 35

Slide 35 text

クラスタ単位での出力 その2 • 方法 – アプリケーションのログをFluentdなどのSidecarでつけて に出力する – 各ノードにDeamonSetでFluentdなどをDeployしてログを収集する • 特徴 – Kubernetesのログの仕組みに対して理解が必要 – アプリケーション側で何もしなくてもログが収集できる – 既存のコンテナが に出力しなくても使える • 懸念点 – Sidecarが死ぬとメインのコンテナも一緒に死ぬ – Sidecarを仕込み忘れるとログが収集されない

Slide 36

Slide 36 text

方法 特徴 アプリケーションからの直 接出力 Kubernetesのことが分からなくても良い アプリケーション側で好きにできる kubectl logsがあまり使えない Sidecar経由での出力 Kubernetesについてそこまで分からなくても良い FluentdなどのLogging Agentの機能を使えば柔軟に対応できる kubectl logsがあまり使えない クラスタ単位での出力 Kuberntesについては理解が必要 クラスタ単位で設定するためKubernetes上の全てのコンテナのログを収集できる kubectl logsが存分に使用できる 個人的には「クラスタ単位での出力」がおすすめ Logging Architectureのおさらい

Slide 37

Slide 37 text

• 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つ載ってる

Slide 38

Slide 38 text

完全ガイド 実践ガイド 実践入門 参考:書籍

Slide 39

Slide 39 text

No content

Slide 40

Slide 40 text

Lokiとは • Lokiとは – Prometheusのようにログを操作できる • 用途 – Grafana経由でLokiに接続することで Logを可視化できる • GitHub – ★6,609 | https://github.com/grafana/loki • 開発主体 – Grafana Labs 初心者向けにβ版のプロダクトを説明するってなんなの?って話はありますが そもそも、Lokiの話がしたくて前段としてログの説明をしてるので許して欲しい (CFP応募の2019/2時点でLokiは無名)

Slide 41

Slide 41 text

KubeConでの発表の歴史と個人的な感想 • KubeCon 2018 NA で発表 – 反響:あまりない – 出来栄え:α版、商用で絶対に使わないで • そもそも当時のGrafanaで使えない – 所感:無理矢理出した感あるけど期待したい – 参考:https://sched.co/GrXC • KubeCon 2019 EU で発表 – 反響:Keynoteで騒がれる – 出来栄え:β版 • でも機能がまだ足りない – 所感:いい感じに進化してる – 参考:https://sched.co/MPbj が変わった!

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

LokiとPrometheus、Cortexの関係性 のログ版 を 水平スケール 水平スケールの アーキテクチャを踏襲

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

Lokiの今後について思うこと • 機能面に対する要望 – ダッシュボード • メトリクスと同じダッシュボードにログも載せたい – アラート • “error”って文字列を見つけたらSlackのチャネルに通知して欲しい • 公式のGitHubに期待すること – ドキュメントをもう少しなんとか・・ • “prometheus.io”みたいな公式サイトを作る話もある – Helmをもう少し整備して欲しい・・ • “ksonnet”のメンテはもういいから、Helmをもう少しメンテして欲しい • KubeCon 2019 North America(11/18–21)でGAになることを期待

Slide 52

Slide 52 text

参考:LokiのGUIに興味が沸いたら 参考 https://grafana.com/blog/2019/01/02/closer-look-at-grafanas-user-interface-for-loki/ • Grafana Labsのこの記事がおすすめ

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

No content

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

■ API Server ■ Controller Manager ■ Scheduler etcdへのwrite、readを行うAPIサーバ 複数台配置して冗長化構成をとることができる デプロイするコンテナの個数等を管理する 複数台配置できるがリーダは1つだけ コンテナをどのNodeにデプロイするか決める 複数台配置できるがリーダは1つだけ 参考:Control Plane Components (1/2)

Slide 67

Slide 67 text

■ Container runtime ■ Kubelet ■ Kube-proxy 文字通りコンテナのランタイム Docker以外を使用することもできる Node上に配置されるエージェント コンテナの起動停止等を行う コンテナとの接続を保証するためにNodeのNWを管理する 参考:Control Plane Components (2/2)

Slide 68

Slide 68 text

“kube-system”のnamespaceを確認する 以外が全部いる 補足 この クラスタは 製です

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

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

Slide 71

Slide 71 text

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

Slide 72

Slide 72 text

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

Slide 73

Slide 73 text

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

Slide 74

Slide 74 text

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

Slide 75

Slide 75 text

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

Slide 76

Slide 76 text

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

Slide 77

Slide 77 text

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

Slide 78

Slide 78 text

• 結局、見るべきログは2種類 コンテナの ログファイル コンテナ “kubectl logs” kubeletの ログファイル “journalctl -u kubelet” Kubernetes Loggingのまとめ

Slide 79

Slide 79 text

Special Thanks!! https://cnd.connpass.com/