Cloud Native Computing Foundation (CNCF) のプロジェクトの一覧

2017年12月時点で [Cloud Native Computing Foundation](https://www.cncf.io/) (CNCF) がホストするプロジェクトについて簡単にまとめてみました。自分が [KubeCon 2016 @ Seattle に参加した時点](https://speakerdeck.com/tksm/kubecon-2016-at-seattle)では 4 プロジェクトでしたが、そこから約1年で **14 プロジェクト**と大きく増加しました。

# Cloud Native Computing Foundation (CNCF)とは

[Cloud Native Computing Foundation](https://www.cncf.io/) (以下 CNCF) は Kubernetes や Prometheus といったクラウドネイティブな OSS 技術の推進を行う団体です。2015 年に Linux Foundation 傘下に設立され、一つ目のプロジェクトとして Kubernetes が Google から寄贈されました。AWS、Google Cloud, Microsoft などクラウド大手や、Red Hat, Docker, CoreOS といったクラウド技術に関連する主要な企業が CNCF に参画しています ([メンバー企業一覧](https://www.cncf.io/about/members/))。

CNCF では他にも [Certified Kubernetes](https://www.cncf.io/certification/software-conformance/) という Kubernetes クラスタの適合性の認定や [Certified Kubernetes Administrator (CKA)](https://www.cncf.io/certification/expert/) という Kubernetes 管理者の認定試験なども行っています。[KubeCon + CloudNativeCon](http://events.linuxfoundation.jp/events/cloudnativecon-and-kubecon-north-america) というイベントの主催もしており、KubeCon + CloudNativeCon 2017 には 4000 人以上が参加しました。([Z Lab](https://zlab.co.jp/) からも 4名参加しました)

![KubeCon 2017](https://qiita-image-store.s3.amazonaws.com/0/100377/49e6cd26-ae07-7b3d-6bf5-89d6e5adb16b.png)


# プロジェクト一覧 (2017年12月時点)

![CNCF Projects](https://qiita-image-store.s3.amazonaws.com/0/100377/b07e5151-a77d-110a-6cb7-5b8eba756199.png)
引用: https://www.cncf.io/

2017年12月時点では下記の 14 プロジェクトが CNCF でホストされています。プロジェクトは CNCF の [Technical Oversight Committee (TOC)](https://github.com/cncf/toc) に Proposal を上げて受理されたらホストされるという流れになっています。[Pull Request で挙がっている Proposal](https://github.com/cncf/toc/pulls) を見ると他にどんなプロジェクトが候補にあるかがわかります。

プロジェクト名 | 種類 | 受理
--- | --- | ---
[Kubernetes](https://kubernetes.io/) | コンテナオーケストレーション | [#1 (2016年3月)](https://www.cncf.io/announcement/2016/03/10/cloud-native-computing-foundation-accepts-kubernetes-as-first-hosted-project-technical-oversight-committee-elected/)
[Prometheus](http://prometheus.io/) | モニタリング | [#2 (2016年5月)](https://www.cncf.io/announcement/2016/05/09/cloud-native-computing-foundation-accepts-prometheus-as-second-hosted-project/)
[OpenTracing](http://opentracing.io/) | 分散トレーシング API | [#3 (2016年10月)](https://www.cncf.io/blog/2016/10/11/opentracing-joins-the-cloud-native-computing-foundation/)
[Fluetnd](https://www.fluentd.org/) | ログコレクタ | [#4 (2016年11月)](https://www.cncf.io/blog/2016/11/09/fluentd-joins-cloud-native-computing-foundation/)
[linkerd](https://linkerd.io/) | サービスメッシュ | [#5 (2017年1月)](https://www.cncf.io/blog/2017/01/23/linkerd-project-joins-cloud-native-computing-foundation/)
[gRPC](https://grpc.io/) | Remote Procedure Call | [#6 (2017年3月)](https://www.cncf.io/blog/2017/03/01/cloud-native-computing-foundation-host-grpc-google/)
[CoreDNS](https://coredns.io/) | サービスディスカバリ | [#7 (2017年3月)](https://www.cncf.io/blog/2017/03/02/cloud-native-computing-foundation-becomes-steward-service-naming-discovery-project-coredns/)
[containerd](http://containerd.io/) | コンテナランタイム | [#8 (2017年3月)](https://www.cncf.io/announcement/2017/03/29/containerd-joins-cloud-native-computing-foundation/)
[rkt](https://github.com/rkt/rkt) | コンテナランタイム | [#9 (2017年3月)](https://www.cncf.io/blog/2017/03/29/rkt-pod-native-container-engine-launches-cncf/)
[CNI](https://github.com/containernetworking/cni) | ネットワーク API | [#10 (2017年5月)](https://www.cncf.io/blog/2017/05/23/cncf-hosts-container-networking-interface-cni/)
[Envoy](https://www.envoyproxy.io/) | サービスメッシュ | [#11 (2017年9月)](https://www.cncf.io/blog/2017/09/13/cncf-hosts-envoy/)
[Jaeger](https://uber.github.io/jaeger/) | 分散トレーシング | [#12 (2017年9月)](https://www.cncf.io/blog/2017/09/13/cncf-hosts-jaeger/)
[Notary](https://github.com/theupdateframework/notary) | セキュリティ | [#13 (2017年10月)](https://www.cncf.io/announcement/2017/10/24/cncf-host-two-security-projects-notary-tuf-specification/)
[TUF](https://theupdateframework.github.io/) | ソフトウェア・アップデート仕様 | [#14 (2017年10月)](https://www.cncf.io/announcement/2017/10/24/cncf-host-two-security-projects-notary-tuf-specification/)

# 各プロジェクト


## Kubernetes

[<img src="https://qiita-image-store.s3.amazonaws.com/0/100377/eca05e37-cf05-7e09-0875-723958158c5c.png" height="130">](https://kubernetes.io/)

[Kubernetes](https://kubernetes.io/) はコンテナのオーケストレーションツールです。Kubernetes によって数台から数千台のサーバーが一つのクラスタとして管理され、シンプルなインタフェースを通してその中に効率良くコンテナを配置し管理することができます。これにより数百のサーバー台数が必要なアプリケーションのデプロイもコマンド一つで簡単に行うことができます。コンテナを採用することで PaaS と比べて高い柔軟性を持っており、IaaS レイヤを抽象化しマルチクラウドを実現する点も注目されています。

元々は Google が社内のオーケストレーションツール [Borg](https://research.google.com/pubs/pub43438.html) で得た 10 年以上の経験を元に開発を始めたプロジェクトで、最初に CNCF に寄贈されたプロジェクトになります。CNCF プロジェクトの中でも圧倒的に規模が大きく、CNCF 主催の [KubeCon + CloudNativeCon](http://events.linuxfoundation.jp/events/cloudnativecon-and-kubecon-north-america) というイベント名でも Kubernetes の名前を全面に押し出していることから CNCF の中心プロダクトと言ってよいでしょう。

## Prometheus

[<img src="https://qiita-image-store.s3.amazonaws.com/0/100377/032b0ab2-b4a1-ab43-55d8-2b5ee5cf2cdf.png" height="130">](http://prometheus.io/)

[Prometheus](http://prometheus.io/) は Pull 型のメトリクス監視システムです。多彩なサービスディスカバリを特徴としており、Kubernetes のように監視対象が動的に変化する環境に適したシステムです。PromQL という独自のクエリ言語によって柔軟に可視化やアラートルールの設定を行うことができます。2015 年から [PromCon](https://promcon.io/) というイベントが毎年開催されています。

Z Lab でも [Prometheus を Kubernetes のメトリクス監視として利用](https://speakerdeck.com/tksm/kubernetes-with-prometheus)しており Grafana の可視化やアラーティングを行っています。

<img src="https://qiita-image-store.s3.amazonaws.com/0/100377/16059fb3-1df4-8981-ee4b-50efc2b35de5.png" width="600">


## OpenTracing

[<img src="https://qiita-image-store.s3.amazonaws.com/0/100377/5e834360-1a9d-f4b1-b67c-a91fbddbe741.png" height="130">](http://opentracing.io/)

[OpenTracing](http://opentracing.io/) は分散トレーシングのための[オープンな仕様](http://opentracing.io/documentation/pages/spec)と[各言語のライブラリ](https://github.com/opentracing) (Tracer) を提供しています。マイクロサービスではどのサービスでどれだけの時間がかかっているかがパフォーマンスを分析する上で重要となるため、このような分散トレーシングの技術が必要とされます。分散トレーシングのシステムは Google 社内の分散トレーシングシステム [Dapper の論文](https://research.google.com/pubs/pub36356.html)が 2010 年に発表されたこをきっかけに Zipkin、 Jaeger、LightStep など様々なシステムが実装されています。トレーシングシステムの間で API の互換性がないと多くのソフトウェアに組み込んでもらうのは難しいため、ベンダに依存しない標準 API を提供することを目標としているようです。

プロジェクトの目的についてはプロジェクトコミッタの Ben Sigelman 氏の [Towards Turnkey Distributed Tracing](https://medium.com/opentracing/towards-turnkey-distributed-tracing-5f4297d1736) という記事がまとまっています。Ben Sigelman 氏は Google 在籍時に Dapper の開発者かつ論文の著者の一人で、現在は [LightStep](https://lightstep.com/) というモニタリング技術の会社の CEO です。

<img src="https://qiita-image-store.s3.amazonaws.com/0/100377/544272f6-3a8d-57ac-49af-d70e10e1b70b.png" width="400"><img src="https://qiita-image-store.s3.amazonaws.com/0/100377/09f045f1-55a0-a55c-5bfa-0ecc364a356d.png" width="400">
引用: 図(左)[Dapperの論文](https://research.google.com/pubs/pub36356.html) よりリクエストのトレースツリー、図(右)[OpenTracing の Overview](https://docs.google.com/presentation/d/1kQkmJtT0bjSRvUTP5YFTKaXSfIM3aL7zxja_KtZtbgw/edit#slide=id.g15fc45ec1a_0_15)

## Fluentd

[<img src="https://qiita-image-store.s3.amazonaws.com/0/100377/94dfe50e-795b-4278-a5db-19c0448c6add.png" height="130">](https://www.fluentd.org/)

[Fluetned](https://www.fluentd.org/) は Treasure Data が開発したログコレクタです。プラグインも充実しており様々な入力・出力に対応できます。[2011 年にリリース](http://frsyuki.hatenablog.com/entry/20110929/p1)されており、現在の CNCF のプロジェクトの中でも歴史があるプロダクトだと思われます。

Z Lab でも Kubernetes のコンテナログやシステムのログ収集に Fluentd を利用しています。また [fluent-plugin-prometheus](https://github.com/fluent/fluent-plugin-prometheus) を用いて、[nghttpx ingress controller](https://github.com/zlabjp/nghttpx-ingress-lb/) のログを Prometheus のメトリクスに変換して HTTP トラフィックのリクエスト数やレスポンスタイムの可視化を行っています。

## linkerd

[<img src="https://qiita-image-store.s3.amazonaws.com/0/100377/fb3b0a0e-ea6f-1fdb-6edf-eabeab01f9a5.png" height="130">](https://linkerd.io/)

[linkerd](https://linkerd.io/) は HTTP Proxy として動作しサービスメッシュを実現するシステムです。サービスメッシュとして下記のような機能を担います。

- 負荷分散
- サーキットブレーカー
- サービスディスカバリ
- リクエストルーティング
- リトライ
- メトリクス

アプリケーション側では上記機能を linkerd を HTTP Proxy として設定するだけで利用ことができます。Kubernetes で利用する場合はノードごとに DaemonSet で配置する方式とサイドカーとして Pod ごとに配置する方式の二つが用意されています。

なお、linkerd の作者による新しいサービスメッシュ [Conduit](https://buoyant.io/2017/12/05/introducing-conduit/) も開発が始まっています。linkerde は JVM 言語の Scala で書かれていましたが、Conduit は Rust で書き直されており軽量化を実現しているようです。

## gRPC
[<img src="https://qiita-image-store.s3.amazonaws.com/0/100377/4a388217-387c-7b6b-6804-8eb7f49a43ed.png" height="130">](https://grpc.io/)

[gRPC](https://grpc.io/) は Google が開発した HTTP/2 をベースとした RPC フレームワークです。[Google 内で 15 年以上使われてきた Stubby](https://cloudplatform-jp.googleblog.com/2016/09/grpc-rpc-10.html) という RPC フレームワークの経験を元に作られています。gRPC は下記のような特徴があります。

- Protocol Buffers (v3) をベースとしている
  - バイナリ形式のためデータ量が少なく、高速にパースを行える
  - IDL(Interface Definition Language) を定義することで、各種言語のライブラリを生成できる
  - proto3 という最新バージョンで、serviceというRPCの定義や、JSONへの相互変換ができるようになった
- 通信プロトコルは HTTP/2
  - コネクションの多重化とバイナリプロトコルで効率よく通信可能
  - 双方向でのストリーム通信が可能
- 多言語に対応
  - C, C++, Java, Go, Node.js, Python, Ruby, Objective-C, PHP, C#

Kubernetes でも etcd (v3) との通信などで使われており、Microservice 間の RPC として大きな注目を浴びています。

## CoreDNS
[<img src="https://qiita-image-store.s3.amazonaws.com/0/100377/8cda8776-7efd-6574-c0d3-066dc8624918.png" height="130">](https://coredns.io/)

[CoreDNS](https://coredns.io/) はプラグイン機構を特徴とした軽量な DNS サーバーです。Kubernetes (~v1.8) でも使われている SkyDNS の後継に当たるプロジェクトで、コア開発者も同じ [Miek Gieben](https://github.com/miekg)氏です。Kubernetes v1.9 では KubeDNS を置き換えるようになるようです。KubeDNS は SkyDNS, dnsmasq などを組み合わせた複雑な構成になっていましたが、CoreDNS では[プラグイン機構を使ってシンプルに実装](https://github.com/coredns/coredns/tree/master/plugin/kubernetes)されています。

## containerd
[<img src="https://qiita-image-store.s3.amazonaws.com/0/100377/115ff742-731c-789a-857d-19c8696d0885.png" height="130">](http://containerd.io/)

[containerd](https://containerd.io/) は Docker が寄贈したコンテナランタイムです。containerd は gRPC のインタフェースを持ったデーモンでコンテナのライフサイクルを管理しています。もともとは Docker Engine の一部だったコンテナランタイム部分を分離したもので、現在は Docker Engine が containerd を利用する形になっています。Docker Engine はコンテナランタイム以外にも多くの機能を統合する形で開発が進められていますが、containerd として切り離されたことによってコンテナランタイム部分だけをシンプルに利用できるようになりました。Docker と containerd、 runC の関係については [containerd の公式ページ](https://containerd.io/) に詳しくかかれています。

Kubernetes でも [cri-containerd](https://github.com/kubernetes-incubator/cri-containerd) という containerd をランタイムとして使うプロジェクトが進められています。CRI は [Container Runtime Interface](https://github.com/kubernetes/community/blob/master/contributors/devel/container-runtime-interface.md) の略でKubernetes とコンテナランタイムのインタフェースを Protocol Buffers の API として定義したものです。

<img src="https://qiita-image-store.s3.amazonaws.com/0/100377/d269cb4b-ee9d-9a64-273c-1e21304bdb86.png" width="700">
引用: [Containerd Brings More Container Runtime Options for Kubernetes](http://blog.kubernetes.io/2017/11/containerd-container-runtime-options-kubernetes.html) より。cri-containerd で Docker のレイヤが不要になる。

## rkt
[<img src="https://qiita-image-store.s3.amazonaws.com/0/100377/4f4f9bb0-fc8b-8bf7-7e76-25a5af43af75.png" height="130">](https://github.com/rkt/rkt)

[rkt](https://github.com/rkt/rkt) は CoreOS が開発したコンテナランタイムです。rkt リリース時(2014年12月)の [CoreOS の blog ポスト](https://coreos.com/blog/rocket.html)では、Docker のセキュリティモデルを批判し rkt の開発を発表して話題になりました。Pod をネイティブで扱うことができる点や管理用デーモンが不要な点などコンテナオーケストレーションと相性の良いアーキテクチャになっています。

<img src="https://coreos.com/rkt/docs/latest/rkt-vs-docker-process-model.png">
引用: [rkt vs other projects](https://coreos.com/rkt/docs/latest/rkt-vs-other-projects.html) より rkt と Docker のプロセスモデルの比較

## CNI
[<img src="https://qiita-image-store.s3.amazonaws.com/0/100377/4a857706-0ada-e6e7-cbe7-0c25d9beda6b.png" height="130">](https://github.com/containernetworking/cni)

[CNI](https://github.com/containernetworking/cni) は Container Network Interface の略でコンテナのネットワークインタフェースを抽象化する仕様です。[Project Calico](https://github.com/projectcalico/calico-cni) や [Weave Net](https://github.com/weaveworks/weave) といった様々なコンテナネットワークが CNI プラグインとして対応しており、CNI に対応した Kubernetes や rkt で簡単に利用することができます。CNI プラグインは実行可能なバイナリとして実装する形となっており、起動時に渡される環境変数などが [CNI の仕様書](https://github.com/containernetworking/cni/blob/master/SPEC.md) で定義されています。

## Envoy
[<img src="https://qiita-image-store.s3.amazonaws.com/0/100377/f9b143f5-ca4f-6ada-5248-20bce4b88990.png" height="130">](https://www.envoyproxy.io/)

[Envoy](https://www.envoyproxy.io/) は Lyft が開発したサービスメッシュです。下記のような特徴があります

- C++ で書かれており高パフォーマンス
- サービスディスカバリ
- 負荷分散
- リトライ
- サーキットブレーカー
- メトリクス

マイクロサービス向けのセキュアなサービスメッシュ [Istio](https://github.com/istio/istio) でも Envoy を拡張したものをデータプレーンのコンポーネントとして利用しています。

## Jaeger
[<img src="https://qiita-image-store.s3.amazonaws.com/0/100377/f3a11372-070f-479e-2230-98188ca8a8a0.png" height="130">](https://uber.github.io/jaeger/)

[Jaeger](https://uber.github.io/jaeger/) (\ˈyā-gər\ イエーガーに近い発音) は Uber が開発した分散トレーシングシステムです。CNCF のプロジェクトである OpenTracing に対応しています。

<img src="https://qiita-image-store.s3.amazonaws.com/0/100377/47ecca43-2d74-6b17-978b-4a64d5b12ed0.png" width="600">
* https://jaeger.readthedocs.io/en/latest/ より引用

## Notary

[<img src="https://qiita-image-store.s3.amazonaws.com/0/100377/b9e4edeb-3a52-f356-172a-e4a0bf951311.png" height="130">](https://github.com/theupdateframework/notary)

[Notary](https://github.com/theupdateframework/notary) は 任意のコンテントの正当性の検証をするためのサーバー、クライアントの実装です。The Update Framework (TUF) 共に CNCF に寄贈されました。TUF はソフトウェア・アップデートのためのセキュリティの仕様であり Notary は TUF の仕様を実装しています。Docker イメージが正当な提供者が作成したか検証を行う [Docker Content Trust](https://docs.docker.com/engine/security/trust/content_trust/) のコンポーネントとして Notary が使われています。

<img src="https://camo.githubusercontent.com/a40da92732d07d53796e267665410c30c6871cbb/68747470733a2f2f63646e2e7261776769742e636f6d2f646f636b65722f6e6f746172792f323734363966303166653234346264663730663334323139363136363537623333363732346263332f646f63732f696d616765732f6d657461646174612d73657175656e63652e737667" width="700">
引用: [Understand the Notary service architecture](https://github.com/theupdateframework/notary/blob/master/docs/service_architecture.md) より。クライアントとサーバーのシーケンス図

## TUF
[<img src="https://qiita-image-store.s3.amazonaws.com/0/100377/cf5a1a87-4a04-3a43-c516-1210e745d037.png" height="130">](https://theupdateframework.github.io/)

[The Update Framework](https://theupdateframework.github.io/) (TUF) はセキュアなソフトウェアのアップデートを配布するための仕様です。2009 年にニューヨーク大学の [Justin Cappos](https://ssl.engineering.nyu.edu/personalpages/jcappos/) 教授らによって仕様が書かれました。ファイルの署名による正当性の検証だけでなく、[ロールごとの鍵](https://github.com/theupdateframework/notary/blob/master/docs/service_architecture.md#brief-overview-of-tuf-keys-and-roles)とタイムスタンプや有効期限などの[メタデータ](https://github.com/theupdateframework/specification/blob/master/tuf-spec.md#4-document-formats)を持つことで正当ではあるが脆弱な古いファイルによるリプレイ攻撃を防ぐといった、安全に最新のアップデートを配布する仕組みを提供しています。TUF を実装したものとして共に CNCF に寄贈された Notary があります。