1 of 95

CNCF サンドボックスプロダクト

1517本ノック!

Cloud Native Developers JP

1

CloudNative Days Tokyo 2019

2 of 95

CNCF Sandboxとは?

  • CNCFはプロジェクトをその成熟度に応じて3段階に分けている
    • Sandbox: 最も初期段階。知名度の向上やプロジェクト体制の構築、法的な課題の解消を図る

2

Image source: https://www.cncf.io/projects/

3 of 95

CNCF Sandbox プロジェクト https://www.cncf.io/sandbox-projects/

3

4 of 95

  • KubeEdgeとは
    • Kubernetesをエッジコンピューティングに利用する。エッジノードの管理やアプリ(コンテナ)の配布を、1つのKubernetesクラスターと同様の感覚で透過的に行えるようにする
  • 用途
    • エッジコンピューティング全般が対象。エッジの管理やアプリの配布を省力化する
  • GitHub
    • 1,375 | https://github.com/kubeedge
  • 開発主体
    • 中国Huawei社(Huawei Cloud IEFがルーツ)
  • 類似/関連プロダクト
    • k3s

4

5 of 95

KubeEdgeのしくみ

5

https://github.com/kubeedge/kubeedge

エッジを制御するためのController

CloudHubとEdgeHubがクラウドとエッジの通信を担う

エッジ側で動作するオーケストレーター。

エッジ側のアプリケーン的処理はここで可動するコンテナで実行

HTTP/MQTTからの入力を仲介するServiceBus/EventBus

デバイスのステータスをクラウド側と同期

クラウドパート

エッジパート

6 of 95

KubeEdgeの少し詳しい話

  • インテリジェントなエッジ
    • エッジ側でビジネスロジックを実行
    • セキュリティや帯域節約のための加工をデータの生成側で
  • シンプルな開発
    • コンテナ化したHTTP/MQTTベースのアプリケーションを、エッジに簡単に配布
  • Kubernetesネイティブ
    • アプリケーションやデバイスの管理、監視を従来のKubernetesと同じように実施可能
    • エッジの物理的位置を意識せず透過的にオペレーション可能
  • アプリケーションに対応
    • 機械学習、画像認識、イベント処理等がすでに実装済みであれば、コンテナとして簡単に導入可能

6

7 of 95

  • Virtual Kubeletとは
    • Kubernetesクラスターを他サービスのAPIに接続するための、kubelet互換の実装。Azure Container Instance, AWS Fargate等をバックエンドとして利用したNodeを実現する
  • 用途
    • サーバーレスなコンテナ基盤の管理にk8sを利用
  • GitHub
    • ★2,081 | https://github.com/virtual-kubelet/
  • 開発主体
    • Microsoft(Microsoftによって開発が開始され、2018年12月にCNCFに寄贈)
  • 類似/関連プロダクト
    • N/A

7

8 of 95

Virtual Kubeletのしくみ

  • Virtual Kubeletがkubeletとして振る舞うことで、バックエンドを1つのNodeとして扱うことができる

  • MasterはPodのスケジューリングなどを通常のNodeに対して行うのと同じように実行

  • 実際のワークロードはバックエンドのサービス上で動作

8

https://github.com/virtual-kubelet/virtual-kubelet

9 of 95

Virtual Kubeletの少し詳しい話

  • プラグインを開発することで、任意のサービスをバックエンドとして利用できる仕組みになっている
    • 公式リポジトリから参照されているプロバイダ
      • Alibaba Cloud ECI Provider
      • Azure Container Instances Provider
      • Azure Batch GPU Provider
      • AWS Fargate Provider
      • HashiCorp Nomad
      • OpenStack Zun
    • プラグインの開発ガイドも一応リポジトリで公開されている

9

10 of 95

  • Fluxとは
    • GitOpsによるCI/CDで、manifestをホストするリポジトリとKubernetesクラスターの同期を行うためのツール
  • 用途
    • GitOpsシナリオにおけるCD
  • GitHub
    • ★2,495 | https://github.com/fluxcd/flux
  • 開発主体
    • 英Weave Works
  • 類似/関連プロダクト
    • Spinnaker, Argo CD

10

11 of 95

GitOpsとは

  • Gitリポジトリのmanifestを起点にして、システムの実行環境やアプリケーションの変更をおこなう手法
  • 差分検出とConversionのためにFluxを利用する

11

https://speakerdeck.com/hhiroshell/ochacafe-number-1

ここにFluxを使う

12 of 95

Fluxの特長

  • GitOps専用ツールなので、その用途であれば他のCDツールよりシンプルですぐ導入できる

  • インストールから導入までの手順
    • Flux用のCRDを追加(Manifestを一枚適用)
    • HelmでFluxをKubernetesにインストール(ここで同期相手のリポジトリなどを設定)
    • ローカルPCにfluxctlをインストール
    • fluxがリポジトリにアクセスするためのキーペアを生成(fluxctl一発)
    • Gitリポジトリに公開鍵を設定

12

13 of 95

  • Buildpackとは
    • PaaS向けパッケージビルドツール。PivotalやKnativeに対応。
  • 用途
    • 従来のコンテナ技術ベースでのCaaSのオペレーションを簡素化する。
  • GitHub
  • 類似/関連プロダクト
    • google/ko
    • Source-to-Image (OpenShift)

13

14 of 95

この@jacopenさんの図が全てを物語ってる。

14

15 of 95

実際Dockerfileはアプリのレポジトリに当然入ると思いますが、

これにより、Dockerfileを書く責務(+CI/CD)がアプリエンジニアの責務になりがち、

だけどこのフローは本当に正しいのか?とはnnao45も思う。

コンテンツデリバリの簡素化、高速化を邪魔したくない。

15

16 of 95

そこで、

16

17 of 95

Knativeの例

17

apiVersion: build.knative.dev/v1alpha1

kind: Build

metadata:

name: cnb-example-build

spec:

source:

git:

url: https://github.com/my-user/my-repo

revision: master

template:

name: buildpacks-cnb

arguments:

- name: IMAGE

value: us.gcr.io/my-project/my-app

- name: BUILDER_IMAGE

value: cloudfoundry/cnb:bionic

- name: CACHE

value: my-cache

volumes:

- name: my-cache

persistentVolumeClaim:

claimName: my-volume-claim

コードのレポジトリを指定する。

コードをどうビルドするか、どの言語化はbuild packsが検知してやってくれる。

コンテナのビルドフェーズで、

レジストリ登録もする。

build packsはビルダーイメージを使ってビルドを行う。

18 of 95

参考資料

  • knative/build-templates: A library of build templates.
  • https://github.com/knative/build-templates

18

19 of 95

  • Brigadeとは
    • Kubernetes上で展開される。CI/CDパイプライン・・・というより、思考的にはタスクランナーに近い。

特徴

    • Javascriptで記述し、パイプラインをプログラマブルに管理できる。Kubernetesリソース(pod,node)などを指定してのワーカー起動を行える。
  • GitHub
  • 類似/関連プロダクト
    • Argo, Tekton, Flux

19

20 of 95

アーキテクチャ

20

21 of 95

21

ジョブの発行を定義した関数。

リソースを引数に持ち、この場合はGithubのPushイベント

Brigadeのplaybookの例

CIを走らせるジョブを作る。

このジョブはBrigadeが走るクラスタのジョブ

CIジョブのイメージを設定することができる。

このイメージの記法はOCIに準ずる(今回はDocker)。

今回はPython3のCIなので、

それをするようなタスクを組むと、上から実行してくれる。

ランナーのtasksで実行された時のログは、

kubeletが拾えてストリームとしてkubectl logsなどで閲覧可

設定したCICDジョブを実行できる。

22 of 95

22

BrigadeのProjectsの例

GitHubやGitLabなどからのWebhookによる発火も便利だが、

ジョブは、brigというCLIツールから発火もできる。

他のCICDパイプラインのような、if thenなworkflowもサポートしており、それもJSとして記述できる。

例えば特定のノードで(例えばCICDを動かす時にだけ起動させるVirtual kubeletとか)、リソースを指定して、などkubeのリソースを指定してタスクを動かすことも可能。

23 of 95

参考資料

ソースコード

23

24 of 95

24

Network Service Mes….

25 of 95

  • Network Service Meshとは
    • L2/L3レイヤーのIstioインスパイアなサービスメッシュ。VNFの思想を強く受けている。

用途

    • kubeのリソースにユーザが使いたいL2/L3Network Serviceを与えるのが主な目的
  • GitHub
  • 類似/関連プロダクト
    • Istio, Envoy

25

26 of 95

L2/L3サービスメッシュ?

🤔

26

27 of 95

L2/L3サービスメッシュ?

(個人的にはCloud Native Network Functionの方がイメージにあっている)

🤔

27

28 of 95

Network Service Mesh全体像

28

Network Service

Network Service Endpoint

L2/L3 Connection

Object

Of

Interest

特定のKubernetesリソースに与えたいL2/L3サービス全体。以後NS。

例えば、セキュアなイントラネット接続。

特定のKubernetesリソースに与えたいL2/L3サービス終端。以後NSE。

例えば、VPNのトンネル終端とか、VXLANのVTEP。

特定のKubernetesリソースとNSEを繋ぐ、L2/L3のコネクティビティ。

要はルーティングなのだが、Network Service Meshの場合はそれを「Kubernetesのラベル」で表現する。

29 of 95

Network Service Mesh設定例

29

Network Service

Network Service Endpoint

Object

Of

Interest

Firewall Service

Network Service Endpoint

VPN Service

Secure Intranet Service

30 of 95

Network Service Mesh設定例

30

Network Service

Network Service Endpoint

Object

Of

Interest

L2/L3 Connection

Firewall Service

Network Service Endpoint

VPN Service

Secure Intranet Service

app:firewall

app:vpn

31 of 95

Network Service Mesh設定例

31

Network Service

Network Service Endpoint

Object

Of

Interest

L2/L3 Connection

Firewall Service

Network Service Endpoint

VPN Service

Secure Intranet Service

kind: NetworkService

apiVersion: V1

metadata:

name: secure-intranet-connectivity

spec:

payload: IP

matches:

- match:

sourceSelector:

app: firewall

route:

- destination:

destinationSelector:

app: vpn-gateway

app:firewall

app:vpn

32 of 95

Network Service Mesh設定例

32

Network Service

Network Service Endpoint

Object

Of

Interest

L2/L3 Connection

Firewall Service

Network Service Endpoint

VPN Service

Secure Intranet Service

app:firewall

app:vpn

L2/L3 Connection

33 of 95

Network Service Mesh設定例

33

Network Service

Network Service Endpoint

Object

Of

Interest

L2/L3 Connection

Firewall Service

Network Service Endpoint

VPN Service

Secure Intranet Service

app:firewall

app:vpn

L2/L3 Connection

kind: NetworkService

metadata:

name: secure-intranet-connectivity

spec:

payload: IP

matches:

- match:

sourceSelector:

app: firewall

route:

- destination:

destinationSelector:

app: vpn-gateway

- match:

route:

- destination:

destinationSelector:

app: firewall

34 of 95

Network Service Meshまとめ

  • NFVの技術をKubeに落としたら案外マッチしたかしらって雰囲気

  • まだまだ発展途上だけど、実際本当にノードを気にせず、しかも専用のCNIを追加しないでラベルベースでNFV付与できるのは結構筋が良く感じる。

  • 大規模なエンタープライズに需要を感じた。

34

35 of 95

Network Service Meshまとめ

  • NFVの技術をKubeに落としたら案外マッチしたかしらって雰囲気

  • まだまだ発展途上だけど、実際本当にノードを気にせず、しかも専用のCNIを追加しないでラベルベースでNFV付与できるのは結構筋が良く感じる。

  • 大規模なエンタープライズに需要を感じた。

35

36 of 95

参考資料

36

37 of 95

  • Falcoとは
    • Linux上のアプリ、クラスタの異常な振る舞いの検知
  • 特徴
    • Linuxカーネルモジュールを利用し、�システムコールベースのルールを設定
    • KubernetesのAudit Eventsもソースにできる
  • GitHub
  • 言語
    • C++, Lua, Python, Go
  • 開発主体
    • Sysdig社
  • 関連/類似プロダクト
    • Sysdig: システムコールのログを取って解析
    • Auditd: 同様に振る舞いを監査

37

38 of 95

Falcoのしくみ

k8s API Server

eBPF

Kernel

User

falcosecurity/falco

ルールファイル(YAML)

falco-probe�kernel module

sysdig/�falco-event-generator

  • sysdig/falco-nats
  • sysdig/falco-sns
  • sysdiglabs/falco-pubsub
  • stdout
  • file
  • Syslog
  • launch program
  • HTTP(S); webhook

(テスト用イベントの生成)

38

Container-�Optimized OS

Kubernetes Response Engine

🚨

39 of 95

GKE (Container-Optimized-OS) へのHelmでのインストール

  • Helm chartでeBPFを有効にするだけではうまくいかない
    • Issue #650 に示された環境変数を追加するワークアラウンドが必要
      • helm fetch で チャートをダウンロードしてhelm templateYAMLに出力し、環境変数を追加した
      • Falco DaemonSetは起動時にCOSカーネルのバージョンに応じてeBPFバイナリをコンパイルするが、上記の対応をしないと途中でエラーで止まる
      • /usr/src/falco-0.15.3/bpf/fillers.h:2052:26: error: no member named 'loginuid' in 'struct task_struct'
  • 2019/07/23時点では�DockerHubにv0.16.0のイメージは置かれていない
  • /etc/falco/falco.yamlのrules_fileにルールファイルのパスの配列を設定するが、ファイルが見つからなくても単にスルーされる。�読み込まれたルールファイルのパスはログに出る

39

40 of 95

Falcoルールファイルの構成

Falcoのルールファイルは下記の3種類の要素からなるYAML

  • rule
    • 検出する条件: and, or, not により複数条件の組み合わせ可能
    • 検出時に出力するメッセージ: 変数の埋め込み可能
    • 優先度:�emergency, alert, critical, error, warning, notice, informational, debug
    • オプション: タグや無効化フラグ
  • list
    • ディレクトリやファイル名等を列挙して再利用する
  • macro
    • 検出条件に名前を付けて再利用する

40

41 of 95

⚠︎早速イベントが検出されました

Warning Log files were tampered (user=root command=pos_writer.rb:* -Eascii-8bit:ascii-8bit /usr/sbin/google-fluentd --under-supervisor file=/var/log/gcp-journald-kubelet.pos) k8s.ns=kube-system k8s.pod=fluentd-gcp-v3.1.1-snn2q container=118edbfb76d8

/var/log/gcp-journald-node-problem-detector.posについても同様に検出対応するルール Clear Log Activities を確認する

41

42 of 95

- rule: Clear Log Activities� desc: Detect clearing of critical log files� condition: >� open_write and access_log_files and evt.arg.flags contains "O_TRUNC"� output: >� Log files were tampered (user=%user.name command=%proc.cmdline file=%fd.name)� priority:� WARNING� tags: [file, mitre_defense_evasion]

- macro: open_write

condition: (evt.type=open or evt.type=openat) and evt.is_open_write=true and fd.typechar='f' and fd.num>=0

- macro: access_log_files

condition: (fd.directory in (log_directories) or fd.filename in (log_files))

- list: log_directories

items: [/var/log, /dev/log]

- list: log_files

items: [syslog, auth.log, secure, kern.log, cron, user.log, dpkg.log, last.log, yum.log, access_log, mysql.log, mysqld.log]

42

is_open_writeはFalcoの関数だが、それ以外は open(at) システムコールの仕様に沿って書かれている

43 of 95

Clear Log Activitiesルールの構成

rule:�Clear Log Activities

macro:�open_write

macro:access_log_files

list:�log_directories

list:�log_files

evt.arg.flags contains "O_TRUNC"

43

and

or

44 of 95

Position fileの書き換え誤検出対策

devブランチのルールファイルを参考に、ホワイトリストを追加する

- rule: Clear Log Activities

condition: >

open_write and access_log_files and evt.arg.flags contains "O_TRUNC" and not allowed_clear_log_files

- macro: allowed_clear_log_files

condition: (fd.name in (gke_pos_files))

- list: gke_pos_files� items: [/var/log/gcp-journald-node-problem-detector.pos, /var/log/gcp-journald-kubelet.pos]

別の指定方法として proc.cmdline startswith pos_writer.rb も考えられる

44

45 of 95

  • Telepresenceとは
    • クラスタ内アプリのデバッグツール
  • 特徴
    • ローカルプロセスとKubernetesクラスタをプロキシし統合
  • GitHub
  • 言語
    • Python 3
  • 開発主体
    • 国 Datawire社
  • 類似/関連プロダクト
    • ローカル開発クラスタ: minikube, Docker compose
    • リモートコンテナへ接続: VS Code Remote Development
    • クラスタへプロキシ: kubectl port-forward

45

46 of 95

前提とするアプリケーション構成

  • クラスタ内の他のAPIと依存関係がある
  • ロードバランサやストレージはマネージドサービスを活用

46

マネージドDB

このアプリをデバッグしたい

🐳

47 of 95

Kubernetesにおける開発環境の選択肢

47

💻 ローカル

☁ クラウド

1

minikubeや�Docker Compose

-

2

-

開発用クラスタ�全てのアプリを含む

3

開発中のアプリと�Telepresence

開発用クラスタ�他の依存アプリはこちら

🐳

🐳

🐳

48 of 95

開発環境の比較

48

開発中のアプリの差し替え

クラスタ内の他のAPI、�マネージドサービスへのアクセス

minikube, Composeの�ローカルクラスタ

○ ローカルで完結

△ エミュレータがない、機能が限定されるサービスがある

マネージドKubernetes�開発用クラスタ

× CIやリモートのレジストリを経由する必要あり

○ アクセス可能

開発用クラスタと�Telepresence

○ ローカルで完結

○ アクセス可能

49 of 95

検証シナリオ

  • nginxリバースプロキシをローカルのDockerコンテナに差し替える
    • 他のAPIから呼ばれ、バックエンドへAPIコールするAPIサーバを模擬

49

curl

nginx (reverse proxy)

nginx.conf�proxy_pass http://backend-1:8080;

backend-1�nginx (server)

backend-2�Apache

50 of 95

Telepresenceでコンテナを差し替える

50

curl

datawire/telepresence-k8s

ラベルやポートは元のDeployから�引き継がれServiceの設定変更は不要

🍎

🐳

nginx.conf�proxy_pass http://backend-2:8080;

backend-1�nginx (server)

backend-2�Apache

ローカルコンテナから�クラスタ内DNS名の名前解決も可能

元のDeployment (replicas=0)

51 of 95

コマンド実行例

$ telepresence --swap-deployment devapp --docker-run demoapp:backend2 nginx -g "daemon off;"

T: Volumes are rooted at $TELEPRESENCE_ROOT. See https://telepresence.io/howto/volumes.html for

T: details.

T: Starting network proxy to cluster by swapping out Deployment devapp with a proxy

T: Forwarding remote port 8080 to local port 8080.

T: Setup complete. Launching your container.

51

差し替えたいDeployment名

基本はdocker runと同様にオプションを記述

  • -dをつけない(即、元のDeployに戻される)
  • DockerfileにCMDが指定してあっても、明示的に�実行ファイル名を指定する必要がある
  • 利用者がsudoできることが必要
  • 差し替え完了(最後のSetup completeが出る)までは16秒前後
  • Ctrl-Cを入力すると、クラスタ側は元のDeploymentに戻され、ローカルのコンテナは終了する

  • プロキシの方法が複数ある(共有ライブラリ、sshuttleの擬似VPN)ので使い分けが必要。例:Goは後者
  • 現状UDPは非対応

52 of 95

  • Dragonflyとは
    • P2P技術によるイメージ、ファイル配信
  • 用途
    • 効率的なイメージやファイルの配信、�帯域コントロール
  • GitHub
    • ★3,894 | https://github.com/dragonflyoss/
  • 言語
    • Go (v0.4.0+), Java (v0.4.0 <)
  • 開発主体
    • 中国 Alibaba Group
  • 類似プロダクト
    • beiran(CREATIONLINE, rainlab)

52

53 of 95

Dragonflyを使ったイメージのPull

53

image source: https://d7y.io/img/architecture.png, Apache License 2.0

大元のイメージレジストリ

レジストリにアクセスするのはSupernodeに限定し、上流への負荷を軽減

dfget, daemonがdockerd / pouchd(Alibabaのコンテナランタイム)の代わりにイメージレイヤをダウンロード

54 of 95

  • SPIFFE (SPIRE(参照実装)とは
    • Secure Production Identity Framework For Everyone (SPIFFE)
    • セキュアにサービス間認証するための標準仕様�(識別子の統一、データフォーマット、API)
  • 用途
    • 多数のサービスから成るマイクロサービスや、あらゆる環境における通信
  • GitHub
  • 開発主体
    • Scytale
  • 類似/関連プロダクト
    • SPIFFEの実装: SPIRE/Istio/Consul Connect/Athenz

54

55 of 95

SPIFFE(SPIRE)で何を解決したいか?

55

56 of 95

56

57 of 95

SPIFFE(SPIRE)で何を解決したいか?

簡単に言うと・・・

⇒ クラウドネイティブ(スケーラブル)な環境でセキュアな認証を実現

※頻出キーワード: Zero Trust Network

57

58 of 95

SPIFFE が定義する標準仕様

  • SPIFFE ID
    • 統一された識別子
    • A standard defining how services identify themselves to each other. These are called SPIFFE IDs and are implemented as Uniform Resource Identifiers (URIs).
  • SVID
    • = SPIFFE Verifiable Identity Document
    • Identity を証明するデータ形式
    • A standard for encoding SPIFFE IDs in a cryptographically verifiable document called a SPIFFE Verifiable Identity Document (SVID).
  • Workload API
    • 自身の "Idenittyと証明書" バンドルを発行、取得するためのAPI
    • ベンダーニュートラル�(GCPやAWSなど環境問わない)
    • An API specification for issuing and retrieving SVIDs, called the SPIFFE workload API.

58

URI形式を使ってシステムを表す

X.509形式のTLS証明書

59 of 95

59

@hiyosiさんの資料、KubeCon EU@Barcelonaでも紹介されてました!�

60 of 95

ご参考) KubeCon EU 2019 @Barcelona

  • Zero Trust Service Mesh with Calico, SPIRE and Envoy

  • Deep Dive: SPIFFE

  • Securing Multi-Cloud Cross-Cluster Communication with SPIFFE and SPIRE

60

61 of 95

  • OpenEBSとは
    • Container Attached Storage(CAS)をリードするオープンソースプロジェクト
    • コンテナ化されたストレージをKubernetes上で利用可能にする分散ストレージ
  • 用途
    • 永続化ストレージ、サービス拡大におけるストレージのスケーリングが必要、その他多数・・
  • GitHub
  • 開発主体
    • MayaData
  • 類似/関連プロダクト
    • Ceph (Rook/Ceph)、Cinder

61

62 of 95

62

63 of 95

63

64 of 95

Container Attached Storage (CAS)

  • ストレージ機能をコンテナ内に内包
    • = Cloud Native Storage

  • 一例
    • OpenEBS
    • Rook/Ceph
    • Portworks
    • StorageOS
    • etc.

64

65 of 95

Container Attached Storage (CAS) / OpenEBS

  • K8s上でCAS Podとして動作
    • マイクロサービス動作
    • アプリと同様に利用可能

  • 柔軟なポリシー設定
      • PV毎に専用コントローラ
      • ストレージリソースの管理・監視
        • パラメータ監視
        • ポリシーの動的更新を細かく設定・反映

65

CASのアーキテクチャ

66 of 95

OpenEBS アーキテクチャ

  • コントロールプレーン
    • Provisioner
    • API
    • Volume exports
    • Volume sidecars
  • データプレーン
    • Jiva
    • cStor
    • Local PV (new: 0.9~)
  • ノードディスクマネージャ
    • Discover, monitor, manage
    • 異なるディスクをK8sオブジェクト�として統合管理
  • Cloud Nativeツール 連携
    • Prometheus, Grafana, Weave Scope, etc.

66

CAS(ストレージ)エンジンの種類

67 of 95

CASエンジン - cStor

  • エンタープライズストレージ機能
    • データ一貫性
    • スナップショット、クローン
    • ストレージプール

==> 包括的なストレージ管理� (K8sのCRで実現)

67

68 of 95

CAS メリット

68

Non CAS Storage

CAS Storage

Kubernetesの管理対象としてアプリ,ストレージを同様に扱える

ワークロード毎に

独自のコントローラ

I/O負荷を軽減

ロックイン回避

69 of 95

OpenEBS コントロールプレーンの動作

69

PVCの生成を検出

メトリクスの�エンドポイントを提供

etcdと連携する�サイドカー

PVの作成

を要求

Pod(Controller/Replica)�を作成

70 of 95

MayaOnline

  • PV関連のK8sリソースのトポロジーを可視化
  • スナップショット、クローン操作
  • OpenEBS Volumeの�モニタリング、ロギング
  • etc.

70

71 of 95

  • CloudEventsとは
    • イベントスキーマ標準化のための共通仕様
  • 用途
    • 特定のデータの形に依存せず標準化することでサービス、プラットフォーム、システム間の連携、相互運用を実現する
  • GitHub
  • 開発主体
    • CNCF Serverless WGを中心に議論が行われている
    • Google, Microsoft, IBM/Red Hat, Oracle, Alibabaといった様々なベンダーが参加
  • 類似/関連プロダクト
    • Serverless, Knative

71

72 of 95

CloudEventsが目指す世界

72

ServerlessをBorderlessへ

73 of 95

CloudEventsのコア仕様(v0.3)

  • データの相互運用を確保するため�スキーマ定義の仕様が決められている
  • どんなイベントが発生したか�メタデータに属性を定義
    • specversion:CloudEventのVersion
    • type:イベントの種類
    • source:イベント発生元コンテキスト
    • id:イベントの識別(一意)
  • JSONフォーマットの実装が必須

73

{

"specversion" : "0.3",

"type" : "com.github.pull.create",

"source" : "https://github.com/cloudevents/spec/pull",

"subject" : "123",

"id" : "A234-1234-1234",

"time" : "2018-04-05T17:31:00Z",

"comexampleextension1" : "value",

"comexampleextension2" : {

"othervalue": 5

},

"datacontenttype" : "text/xml",

"data" : "<much wow=\"xml\"/>"

}

データ

メタデータ

74 of 95

CloudEventsの少し詳しい話

  • 様々な実装にマッピングするための定義が拡充されている
    • HTTP, MQTT, NATS
    • AMQPフォーマット
    • Webhook�

  • 公式が提供するSDK
    • C#
    • Go
    • Java
    • Javascript
    • Python

  • 対応しているプロダクト
    • Event Gateway(v0.1)
    • Azure Event Grid(v0.1)
    • Knative(v0.2)

74

75 of 95

  • OpenTelemetryとは
    • トレーシング、メトリックの標準化を目的としたAPIとライブラリのセット
  • 用途
    • マイクロサービスなどのトレーシング、メトリックデータの収集を標準化
  • GitHub
    • ★〜200(projectによる) | https://github.com/open-telemetry
  • 開発主体
    • CNCF
  • 類似/関連プロダクト
    • OpenCensus, OpenTracing

75

76 of 95

OpenTracing+OpenCensus=OpenTelemetry

  • 背景
    • OpenTracing(CNCF)とOpenCensus(Google)は似ている機能を持っており、使い分けるのはユーザにとって使いやすくないことから統合することに
    • 2019年5月に発表
  • 後方互換性
    • 統合後2年間はOpenTracingやOpenCensusのAPIを使用可能にして、後方互換性を維持

76

77 of 95

OpenTelemetryが目指す世界

77

Prometheus

Datadog

New Relic

mackerel

Stackdriver

CloudWatch

OpenTelemetryに対応しておけば�どの監視ツールでも対応できるようになる

※2019年9月末 v1.0 リリース予定

78 of 95

言語実装

78

79 of 95

  • OpenMetricsとは
    • Prometheusで取得しているMetricsのフォーマットの標準化
  • 用途
    • Metricsを提供するAPI作成時
  • GitHub
  • 開発主体
    • SpaceNet AG, Robust Perception, InfluxData,

Google, Uber

  • 類似/関連プロダクト
    • Prometheus

79

80 of 95

OpenMetricsのしくみ

  • Text Representation”とProtocol Buffers”の2つの形式が定義されている

80

# HELP http_requests_total The total number of HTTP requests.�# TYPE http_requests_total counter�http_requests_total{method="post",code="200"} 1027 1395066363000�http_requests_total{method="post",code="400"} 3 1395066363000

message Person {� required string name = 1;� required int32 id = 2;� optional string email = 3;�}

Text Representation

Protocol Buffers

81 of 95

OpenMetricsがあると嬉しいこと

81

Prometheus

Datadog

New Relic

mackerel

Stackdriver

CloudWatch

OpenMetrics

OpenMetricsに対応しておけば�どの監視ツールでも対応できるようになる

82 of 95

  • Cortexとは
    • Prometheusに水平スケール、高可用性、マルチテナント、長期保管の機能を追加するために開発されたプロダクト
  • 用途
    • PrometeusのRemote writeの宛先として使用
  • GitHub
  • 開発主体
    • Grafana Labs, weaveworks
  • 類似/関連プロダクト
    • Prometheus, Thanos, M3, VictoriaMetrics

82

83 of 95

Cortexのしくみ

  • PrometheusのRemote write機能を使用して、Cortexにデータを書き出す

  • Cortex側の各コンポーネントが水平スケール出来るようになっているため、負荷に応じてスケールする

  • AlertやGrafanaのバックエンドをCortex側にすることによりPrometheusの負荷が軽くなる

83

Distributor

Ruler

Ingester

Querier

Proxy

84 of 95

Cortexのアーキテクチャ

84

85 of 95

  • Thanosとは
    • 複数のPrometheusを跨いだGlobal query view、長期保管、高可用性を実現するためにPrometheusを内包したプロダクト
  • 用途
    • Prometheusをスケールさせたい時に使う
  • GitHub
  • 開発主体
    • Improbableイギリスに本社を構えるゲームのプラットフォームの会社
  • 類似/関連プロダクト
    • Prometheus, Cortex, M3, VictoriaMetrics

85

86 of 95

Thanosのしくみ

86

Prometheusに対して

Thanos Sidecarをつける

Querier経由で参照のリクエストを投げる

Thanos Sidecarが、Prometheusが�集めたmetricsをBucketにアップロードする

Storeを経由することで

Bucketのデータを時系列データとして扱える

Bucketのデータの

圧縮とダウンサンプリングをする

87 of 95

Thanosのアーキテクチャ

87

88 of 95

88

Fin.

89 of 95

以降はスライドのテンプレ

89

90 of 95

(これは中扉)

90

91 of 95

91

92 of 95

92

93 of 95

93

94 of 95

94

95 of 95

95