Cloud Nativeについて

2023年1月24日

定義

CNCF(Cloud Native Computing Fundation)によるCloud Nativeの定義は下記の通り

クラウドネイティブ技術は、パブリッククラウド、プライベートクラウド、ハイブリッドクラウドなどの近代的でダイナミックな環境において、スケーラブルなアプリケーションを構築および実行するための能力を組織にもたらします。 このアプローチの代表例に、コンテナ、サービスメッシュ、マイクロサービス、イミュータブルインフラストラクチャ、および宣言型APIがあります。

これらの手法により、回復性、管理力、および可観測性のある疎結合システムが実現します。 これらを堅牢な自動化と組み合わせることで、エンジニアはインパクトのある変更を最小限の労力で頻繁かつ予測どおりに行うことができます。

https://github.com/cncf/toc/blob/main/DEFINITION.md

つまりどういうことか

上記の定義から、Cloud Native技術が提供する環境のイメージを図示した。

Cloud Native Computing環境のイメージ

上図に示したように、コンテナ(Container)、サービスメッシュ(Service mesh)、マイクロサービス(Microservice architechture)、イミュータブルインフラストラクチャ(Immutable infrastructure)、宣言型API(Declarative APIs)といった技術を用いてアプリケーションを構築することで、
障害などが起きた時にでもContainer上に容易にServiceを再配置できるなど回復性が高く
Declarative APIsによってシステムを記述したコードが可読性が高くなるなど管理力もあり
Service meshによりService間通信なども可観測性のある
Microservice architectureを用いた疎結合なシステムを実現することができる。
これらを、Container orchestration、CI/CDツール等の堅牢な自動化と組み合わせることで、システムの変更を最小限の労力で何度でも、Immutable infrastructureの考え方に基づいてDeployすること予測どおりに行うことができる。

上記のようなアプリケーションを構築できる環境が、Cloud Native技術が提供する環境といえる。

(CNCFは、上記のようなアプリケーションを、パブリッククラウド、プライベートクラウド、ハイブリッドクラウドなど、どんな環境においても、構築および実行するための能力を組織にもたらすことをミッションとしている)

以降、定義で用いられた用語の詳細をまとめた。

用語詳細

クラウドの種類

  • パブリッククラウド
    • パブリック クラウドは、リソースがインターネット経由でサードパーティ プロバイダから提供され、そのリソースの使用や購入を希望する組織や個人で共有するコンピューティングの一種です

      https://cloud.google.com/learn/what-is-public-cloud
    • 主なパブリッククラウドのプロバイダはAWS、Google Cloud、Microsoft Azure等
    • 利用者にとって、環境構築などの導入のための負担が少なく、多くの場合利用した分だけ従量課金制でコストがかかる仕組みになっている。
    • 一方で、障害が発生した場合やプロバイダーが提供するサービスの範囲外のカスタマイズが必要だった場合に自社で対応できないことが出てくるなどのデメリットもある。サードパーティの管理下に自社のプログラムやデータを置くことに一部企業ではクラウドサービスの導入に慎重になっている。
  • プライベートクラウド
    • プライベート クラウド モデルではリソースを 1 つの組織でのみ使用でき、データセンターはオンプレミスまたはベンダーによってオフサイトで管理されます。

      https://cloud.google.com/learn/what-is-public-cloud
    • 主なプライベートクラウドの製品としてVMWare社のvSphereが挙げられる
    • 自組織が管理するためセキュリティ・カスタマイズ性が高いといえる
    • ただし、パブリッククラウドでは不要であり、従来のオンプレミス環境でも必要だった継続的なメンテナンス、容量のスケーリングも含めたアップグレード、OS のパッチ適用、ミドルウェア・ソフトウェアの管理等のためのコストが必要になってくる。
  • ハイブリッドクラウド
    • ハイブリッド クラウドとは、複数の異なる環境を組み合わせてアプリケーションを実行している環境を指します。

      https://cloud.google.com/learn/what-is-hybrid-cloud
    • パブリッククラウド、プライベートクラウド等の環境を組み合わせることで、お互いの良いとこどりをする環境(複数のパブリッククラウドを利用する場合はマルチクラウドと呼ばれる)
    • 負荷・リスク分散ができるほか、要件に合わせて柔軟に対応が可能になる
    • しかし、システム構成が複雑になるため、学習コストや運用コストは高くなるといえる

技術

コンテナ

A container is a running process with resource and capability constraints managed by a computer’s operating system.

https://glossary.cncf.io/container/
  • コンテナはアプリケーションの動作環境を仮想的に構築する技術
  • Hypervisorを用いる従来の仮想マシンとは異なり、コンテナランタイムエンジンを用いることで、より軽量に仮想環境が動作する
  • 仮想化を行うことで、動作環境・ライブラリのバージョンの不整合・競合などの問題がなくなりつつ、コンテナとしてアプリケーションをパッケージ化することで移行性が高く、サービスの切り分けができるなど様々なメリットを享受できる
  • 主なコンテナランタイムエンジンはDocker、Podman等
従来の仮想マシンとDockerコンテナの動作イメージ
https://www.nakivo.com/blog/docker-vs-kubernetes/

マイクロサービス

A microservices architecture is an architectural approach that breaks applications into individual independent (micro)services, with each service focused on a specific functionality.

https://glossary.cncf.io/microservices-architecture/

Microservices – also known as the microservice architecture – is an architectural style that structures an application as a collection of services that are

  • Independently deployable
  • Loosely coupled
  • Organized around business capabilities
  • Owned by a small team
  • Highly maintainable and testable
https://microservices.io/
  • マイクロサービス(マイクロサービスアーキテクチャと同義)は、サービスのコレクションとしてアプリケーションを構築するスタイル(サービスとは、アプリケーションの一部のことを指す)
    • このとき、サービスのコレクションは下記の要件を満たす
      • 各サービスが独立にデプロイできる
      • 各サービスは疎結合(別のサービスに依存しない)
      • ビジネス機能を中心に編成される
      • 小さなチームにより保有される
      • メンテナンス性が高く、テストしやすい
  • マイクロサービスアーキテクチャが、上記の通り独立してデプロイ可能な小規模なサービスの集合体であるのに対し、単一の統合ユニットとして構築されるスタイルはモノリシックアーキテクチャと呼ばれる
  • モノリシックアーキテクチャで構築された場合、大規模なアプリケーションほど構成が複雑になることによる開発スピードの低下や、すでに利用している環境やライブラリーによる制約などによるスケーラビリティの低下(新しく追加したいライブラリーが現在動いているプログラムに影響する可能性がある場合はライブラリーの追加を見送らざるを得ないなど)といった課題がでてくる
  • マイクロサービスアーキテクチャでは、前述のような特徴からそのような課題を克服し、開発が効率化される(ただし、インフラコストの増大などのデメリットもあり、なんでもマイクロサービスにすればよいというものではないため、アプリケーションやプロジェクトの状況によって適切な選択が必要となる)
マイクロサービスアーキテクチャのイメージ図
https://microservices.io/

サービスメッシュ

Service meshes address this new set of challenges by managing traffic (i.e., communication) between services and adding reliability, observability, and security features uniformly across all services.

https://glossary.cncf.io/service-mesh/

A service mesh is a dedicated infrastructure layer that you can add to your applications.

https://istio.io/latest/about/service-mesh/
  • サービスメッシュは、主にマイクロサービスアーキテクチャのアプリケーションで、各サービス間通信を担うなんらかの専用インフラストラクチャ(厳密には、軽量のネットワークプロキシ群)
  • サービスメッシュによりマイクロサービスアーキテクチャに対して、下記のような利点が挙げられる
    • サービス間通信によるネットワークへの負荷の最適化(負荷分散を担うサービスを用いる必要がなくなる)
    • サービス間の相互トランスポート層セキュリティ (mTLS) 接続が可能となり、セキュアな通信を実現する
    • サービスメッシュはコードにより管理されるインフラであるため、バージョン管理や継続的な更新が容易である
  • 主なサービスメッシュは、Istioである
サービスメッシュとしてIstioを用いた場合のサービス間通信イメージ
https://istio.io/latest/about/service-mesh/

イミュータブルインフラストラクチャ

Immutable Infrastructure refers to computer infrastructure (virtual machines, containers, network appliances) that cannot be changed once deployed.

https://glossary.cncf.io/immutable-infrastructure/
  • 一度デプロイしたら変更しないインフラ(仮想マシン、コンテナ、ネットワーク等)のこと
  • ミュータブルインフラストラクチャと呼ばれる、アップデートや変更が必要になった場合は現行のインフラを更新するという方式ではなく、テスト環境でテスト済みの新しいインフラと入れ替える(現行のコンテナを新しいコンテナに入れ替えるというイメージ)
  • 誰がどういう変更をしたかが明確であり、不正な変更がないためセキュリティが高く、コード化可能な部分が多くなるため保守性が高く管理しやすい

宣言型API

An API is a way for computer programs to interact with each other. Just as humans interact with a website via a web page,

https://glossary.cncf.io/application-programming-interface/

In computer science the declarative programming is a style of building programs that expresses logic of computation without talking about its control flow.

https://www.geeksforgeeks.org/introduction-of-programming-paradigms/
  • 宣言型API(Declarative API)は、Declarative Programming Paradigmに基づいたAPI。ざっくり言うと、途中の細かい処理については命令することなく、最終目的(状態)を宣言することで所望の結果を得るAPI。
    • Declarative Programming Paradigmは、宣言型プログラミングパラダイム(パラダイム:範例。志向の方法論、ものの見方)と言われ、制御フローについて言及することなくロジックを表現するプログラミングスタイル
    • Declarative Programming Paradigmの対義語として、Imperative Programming Paradigm(命令型プログラミングパラダイム)という一つ一つのタスクを命令するプログラミングスタイルが存在する
  • 抽象化が可能で、マイクロサービスとの相性がよく、コードがシンプルになり可読性が高くなるという利点がある
  • 一般的に、命令型APIを利用する環境よりもメモリ消費量が多く、関数の呼び出しが多くなるためトラブルシューティングのためのトレースが大変になる