part1(前回)は compute engineに関する用語について一覧形式で解説した。今回は IaaS, PaaS, SaaSから app Engine, Kubernetes, Cloud function, Cloud Run, Cloud Storageまで Google Cloudの主要なサービスとその専門用語について紹介する。
IaaS, PaaS, SaaS
IaaSとは?
Infrastructure as a Service/サービスとしてのインフラの略。Google Cloudではcompute engineであり、AWSではEC2である。仮想マシンを作成し、手動でアプリをデプロイしたりデータベースを仮想マシンにセットアップする。クラウド・プロバイダーは、物理的なハードウェアやネットワークを提供し、仮想マシンインスタンスを作成できるように仮想化ソフトウェアにアクセスできるようにする責任がある。残りのことについては、 すべて自分に責任がある。アプリケーションが適切にデプロイされていることを確認し、 オートスケーリングやロードバランシングの世話をする責任がある。
PaaSとは?
Platform as a Service/ サービスとしてのプラットフォーム。AWSのElastic Beanstalk、 AzureのApp Service、 Google App Engineが該当する。クラウドの責任範囲が IaaSより広いが自由度は低い。クラウドプロバイダーはOSやオートスケーリングや可用性などに責任を負う。ユーザーはアプリのコードだけに集中できる。PaaSでは、顧客はVM instancesにアクセスできず、カスタム・ソフトウェアをインストールできずOSにもアクセスできない。
SaaSとは?
Software as a Service/ サービスとしてのソフトウェア。必要な機能を必要な分だけ利用できるソフトウェアのこと。Gmailや Slackなどが代表例だ。端末へのダウンロードが要らずインターネット環境があればどこからでも利用できる。背後のアプリの設計や詳細を気にする必要はない。
コンテナとは?
異なる言語で構築されたマイクロサービスを1つの方法でデプロイすることができる。様々な言語で開発されうるマイクロサービスではデプロイが複雑になるが、それを解決できる。人気のあるコンテナ関連ツールがDockerである。コンテナを使うためには、マイクロサービスごとにdocker imageを作成する。コンテナの利点は3つ。⑴コンテナは軽量である。⑵コンテナがすべて互いに隔離されている。⑶クラウドニュートラルである(どこでも実行できる)。
コンテナ・オーケストレーション(kubernetes)とは?
複数あるコンテナのデプロイを実際に管理したり、負荷に応じて稼働するコンテナ・インスタンスの数をオートスケールできるようにしたい。 複数コンテナのクラスタへのデプロイを管理する。これらのクラスタはそれぞれ複数のサーバーを持つことができる。コンテナ・オーケストレーターは以下の機能を提供する。⑴オートスケーリング。⑵サービス・ディスカバリー。⑶ロードバランシング。⑷ヘルスチェック(自己治癒力)。⑸ダウンタイムなしのデプロイメント。
サービス・ディスカバリーとは?
100のマイクロサービスがあるかもしれない。各マイクロサービスのURLを別のマイクロサービスにハードコードしたくない。各マイクロサービスは、 コンテナ・オーケストレーターに他のマイクロサービスの場所を尋ねることができるので、URLをハードコーディングする必要はない。
docker imageとは?
docker imageには、 マイクロサービスを実行するために必要なものがすべて含まれている。 たとえばdocker imageにはプログラミング言語に対応するランタイムが含まれている。なので JavaアプリやPythonアプリを実行できる。また docker imageにはアプリが必要とする依存関係も含まれている。 docker imageさえあれば、ローカルマシンでもクラウドでも同じように実行でき、コンテナを作成することができる。ローカルマシンとデプロイで同じ docker imageを使用できる。
CaaSとは?
Container as a Service(サービスとしてのコンテナ)。PaaSの種類の1つ。アプリの代わりにコンテナをプラットフォーム上で実行させる。
FaaSとは?
Function as a Service (サービスとしての機能)。PaaSの種類の1つ。アプリの代わりに機能を実行する。
サーバーレスとは?
サーバーレスとはサーバーがないという意味ではない。サーバーレスを使用している場合でも、バックグラウンドでサーバーを使用している。サーバーレスとは、サーバーがないのではなく、”サーバーについて気にする必要がない”ということを意味する。サーバーレスでは、サーバーの設定や可用性のスケーリングを心配する必要がなく、コードに集中できる。特徴は2つ。⑴インフラを気にしなくて良い。⑵関数やアプリの呼び出し回数に対して支払が発生する。
共有責任モデルとは?
クラウドにおけるセキュリティは共有責任である。 Googleとユーザーはそれぞれ特定の事柄について責任を負う。Google Cloudと顧客の間で責任を共有するのである。それぞれの責任の範囲はPaaSや IaaSなど利用するモデルによって頃なる。
app engine
App Engineにて覚えておきたい特徴には以下のようなものがある。
- デプロイの容易性
PaaSのサービス。App Engineは、 JavaやPython、Goなどで作られたアプリをGoogle Cloudに非常に簡単にデプロイできる。 App EngineはGCPでアプリケーションをデプロイし、スケーリングする最もシンプルな方法である。
- コンテナの実行もサポートしている
コンテナさえあれば、 シンプルなコンテナをApp Engineにデプロイすることもできる。Kubernetesのような複雑なコンテナ・オーケストレーション機能は提供しないが、コンテナを実行するためのいくつかのシンプルな機能は提供する。App Engineはコンテナの実行もサポートしているので、コンテナを作成し、 カスタムランタイムを使用して、 特定の言語でコードを書くことができる。App Engineは、サービスとしてのコンテナ(CaaS)の特性をいくつか提供しているのだ。
- サーバーレスである
App EngineはGoogleによってサーバーレスと呼ばれている。
- StandardとFlexibleが選択できる
リクエストが来ない時間帯がある場合、インスタンスをゼロにすることができる App Engine Standardを使うことを勧める。Flexibleではインスタンスをゼロにすることはできない。
- 他サービス( Cloud SQLなど)との接続に優れている
App Engineは、 他のGoogleクラウド・サービスとの接続性が実に優れている。Cloud SQLのようなデータベースと話したり、クラウドストレージのようなオブジェクトストレージと話したり、 キューと話したりしたい場合、そのようなオプションもApp Engineが提供している。App Engine自体の利用料は無料である。ただし、 リソースの提供には費用がかかる。App Engineを通じてコンピュート・インスタンスを提供する場合は、 その分の料金を支払うことになる。
- さまざまなオート機能が備わっている
⑴オート・スケーリング。⑵オート・ロードバランシング。⑶プラットフォームのアップデート / アプリケーションの健全性の監視。⑷アプリケーションのバージョン管理。不健全な(ダウンしている)場合、そのインスタンスを自動的に健全なインスタンスに置き換える。顧客に責任はない。
覚えておくべき新しい単語は以下の様なものがある。
app.yaml (yamlファイル)
アプリの設定を含むファイル。デフォルトの設定に使われる。これがdescriptor (プログラムからファイルを操作する際、操作対象のファイルを識別・同定するために割り当てられる番号)になる。
Deployment package
デプロイするときバックグラウンドで作成されるパッケージ。パッケージ作成には継続的インテグレーションと継続的デプロイのツールが使われる。このパッケージは Cloud Storageに送られる
Cloud Build
Cloud Storageにアップロードされた Deployment packageにアクセスして、それを基にデプロイを実際におこなう。
IAM ( identity and management)
さまざまなもののアクセス許可を設定する場所。ロール(役割)を与えられる。ロールは3種類。ベーシックロール、定義済みのロール、カスタムロール。part.3で詳しく解説する。
継続的デプロイ、継続的インテグレーション
継続的インテグレーションは、ユニットテストとパッケージングを継続的に実行すること。継続的デプロイは本番環境に近い環境でソフトウェアを継続的にテストする。part.3で詳しく解説する。
サービスアカウント
アクセス権を持つ者。デプロイを開始したときに自動的に作成される。このサービスアカウントに Cloud Storageにあるデータへのアクセス権( viewerの permission)を与える。part.3で詳しく解説する。
Cloud Storage
Google Cloudのストレージサービス。詳しくは今回後半で解説する。
Kubernetes
Kubernetesにて覚えておくべき特徴には以下のものがある。
- 概要
Kubernetesは最も人気のあるコンテナ・オーケストレーター・ツールだ。
- すべてのクラウドプロバイダーがKubernetesサービスを提供している。
AWSではElastic Kubernetes Service (EKS)、 AzureではKubernetes Service (AKS)、 Google CloudではGoogle Kubernetes Engine (GKE)。
- Kubernetesにはクラスタが必要である
Kubernetesでは、クラスタを作成し、クラスタにアプリをデプロイする。クラスタにはノード数(インスタンス数)が含まれる。クラスタ内の異なるノードは、 異なるハードウェアおよびソフトウェア構成を持つことができる。単一のクラスタで、異なるタイプの仮想マシンを持つことができる。クラスタ上でアップグレード含めて管理する。Kubernetesは CaaSの一種である。
- Kubernetesの重要な機能
自動修復機能(ノードが故障するたびに自動的に修復される)、自動アップグレード機能、Podオートスケーリング(オートスケーリング)、サービス・ディスカバリー、ロードバランシング、ダウンタイムなしのデプロイメントを提供する。ロードバランシングは実際に確認できる。
- 他 Google Cloudサービスと手軽に統合できる
Cloud Logging(ログ記録)やCloud Monitoring(監視)とよく統合されている。簡単な設定で手軽に有効にして、 ログやKubernetesクラスタ周辺のメトリクスを見ることができる。
- KubernetesのOS
Google Kubernetes Engineは、 Container Optimized OSと呼ばれるOSを使用している。これは、 コンテナの実行に最適化されたハードエンドOSで、 Googleによって構築された。クラスタの一部であるノードに永続ディスクとローカルSSDをアタッチできる。
覚えておくべき新しい単語は以下の様なものがある。
Podオートスケーリング
特定のマイクロサービスのインスタンス数を増やせる。マイクロサービスAのインスタンス数を増やしたければ、マイクロサービスAに属するポッドの実行数(Kubernetesクラスタのノード数)を増やす必要がある。そこでクラスターの自動スケーリングが必要になる。
クラスタとは?
複数のコンピュータやサーバーが連携して一つのシステムとして動作する集合体。Kubernetesは、クラスター上でコンテナ化されたマイクロサービス(アプリ)をデプロイ、管理するためのオーケストレーションツール。クラスターのリソースを効果的に活用し、アプリケーションのスケーラビリティや可用性を向上させる。クラスタは “Master Node”, “Worker Node”, “etcd”から構成される。
ノードとは?
クラスタの中に複数個作成できる。各ノードにはそれぞれvCPUとメモリ(GB)がある。ノード数=インスタンス数である。クラスタのノード数を増やすには”gcloud container cluster”でリサイズする(クラスタのサイズを直接変更せず、ノードプールのサイズを変更する)。そうすればインスタンス数の制限を超えてさらにインスタンスを作れる。
ノードプールとは?
ノードが入ってるプールのこと。クラスタ内にノードプールが複数個あって、ノードプールの中にノード(インスタンス)が複数ある。このノードはクラスタ内ではレプリカやポッドと呼ばれる。
マスターノード(Master Node)とは?
クラスター全体を管理する中央の制御ノード。マスターノードには、クラスター内のワーカーノードの管理やスケジューリング、全体的なクラスターの状態を管理する “kube-controller-manager” や “kube-scheduler”などのコンポーネントが含まれる。
ワーカーノード(Worker Node)とは?
実際にアプリやサービスが動作するノード。ワーカーノード上には、コンテナランタイム(Docker)が実行され、クラスター内でデプロイされたコンテナ化されたアプリが動作する。ワーカーノード上には「kubelet」などのコンポーネントが実行され、マスターノードの指示に従ってコンテナを起動・停止・監視する。
etcdとは?
クラスターの永続的なデータを保存するための分散型キー・バリューストア。etcdはKubernetesクラスターのコンフィグや状態を保持し、全体の一貫性を確保する。
“gcloud container”とは?
Kubernetesクラスターを作成する場合、コマンド名はgcloud containerで始まる。Kubernetesクラスタに接続するときにもこれを使って”gcloud container clusters get credentials”とする。つまり、 クラスタを直接操作したい場合、クラスタのノード数を増やしたい場合、 クラスタにノード・プールを追加したい場合は、”gcloud container clusters”コマンドを使う必要がある。gcloudは、 クラスタを作成するためのGoogle Cloud特有のものだ。クラスターを作成するには、Google Cloudにアクセスする。クラスタの削除には”gcloud”を使う。
“kubectl”ってなに?
クラスタに何かをデプロイしたい場合、 マイクロサービスをクラスタにデプロイしたい場合、マイクロサービスを外部に公開したい場合、”kubectl”コマンドを使うことになる。つまり”kubectl”は、Google CloudにデプロイされたKubernetesクラスターであろうと、あるいはローカル・マシンやデータ・センターにデプロイされたKubernetesクラスターであろうと、Kubernetesが存在する場所であればどこでも、 マイクロサービスをデプロイしたいのであれば、 “kubectl”を使うことができるKubernetes専用のコマンド・ラインなのだ。クラスタに何かをデプロイするには”kubectl”を使うことになるだろう。
replica(レプリカ)ってなに?
インスタンスのこと。replica=3ならインスタンス数が3つ。それぞれのインスタンスはpodと呼ばれる。つまり、replica数=インスタンス数=pod数。”kubectl”ではポッドの数を取得できる。
マニュアルスケーリングとは?
クラスターのマニュアルスケーリングはリサイズによって行われる。ポッドのマニュアルスケーリングは、Kubectlを使ってスケールをデプロイする。ただしこれは望ましくない。”kubectl autoscale”でオートスケーリングを設定すべきである。
Cloud function
Cloud Functionには以下のような特徴がある。
- 概要
Cloud functionはイベントに応じてコードを実行する機能だ。イベントが発生したときに何らかのコードを実行したい状況で使用する。FaaS(Function as a Service)に分類される。
- サーバーレスである
サーバーレスなのでサーバーについて考える必要はない。スケーリングや可用性など考えなくて良い。自分のコードだけを心配すればいい。Cloud Functionは何百万通ものリクエストに対応できるようにコードをスケールアップする責任を負う。この関数がどこで実行されているかを気にする必要はない。
- 呼び出しがあったときだけ料金を支払う
最も重要なことは、 クラウドへの呼び出しがあったときだけその料金を支払うという事である。呼び出しの計算時間に対して料金を支払い、各呼び出しに設定されたメモリとCPUの量に対して料金を支払う。
- 各呼び出しや各実行が別々のインスタンスで実行される。
つまり、 呼び出しの間で共有されるものは何もない。
- 第一世代では最大9分のタイムアウトが第二世代では60分まで大幅に伸びた。
- Cloud Functionをデプロイするためには、Cloud build (CI/CDツールであるCONGEST Integration CANESのデプロイツール)を使う。
覚えておくべき新しい単語は以下の様なものがある。
トリガーとは?
Web上でのHTTPリクエストが何らかのアクションを引き起こす仕組みやプロセスを指す。HTTPからトリガーするか、Cloud Pub/subやCloud Storageからトリガーするか。
Cloud Run
Cloud Runには以下のような特徴がある。
- 概要
Googleの提供するコンテナ周辺サービスの1つ。シンプルなコンテナを実行することができる。コンテナ化されたアプリケーションをより簡単にデプロイする方法に”Cloud Run”がある。Cloud Runでは、コンテナをデプロイすれば数秒で本番環境に移行できる。
- 他社類似サービス
AWSはECS(Elastic Container Service)を提供している。
- CaaSである
Cloud Runは、高度にスケーラブルなコンテナ化されたアプリケーションの開発とデプロイに使用できる。つまり、 Cloud Runはサービスとしてのコンテナ(CaaS)でもあるのだ。
- KubernetesとCloud Runの違い
Cloud Runはクラスタを必要としない。Kubernetesは複雑なマイクロサービス・アーキテクチャに推奨される。Cloud Runはもっとシンプルなアーキテクチャに推奨される。単純なコンテナアプリを実行したい場合はCloud Runが推奨される。Kubernetesを使うときはクラスタを作ってからマイクロサービスをデプロイする必要があった。Cloud Runでは”create service”をクリックすれば良いだけだ。
- コンテナイメージをビルドして利用する
通常、 アプリケーション用にコンテナ・イメージを構築(ビルド)し、それをコンテナ・レジストリにプッシュしてそこから利用する。
- Knativeというオープンスタンダード上で構築されている
Cloud RunはKnativeと呼ばれるオープンスタンダードの上に構築されている。これはコンテナ化されたアプリケーションのための Fill Managed Serverless Platformで、インフラ管理はゼロだ。
- クラスタを作成する必要はない
コンテナを直接作成し、 直接デプロイした。
- 料金体制
利用ごとの支払いである。使用したCPUのメモリ要求とネットワークの使用料を支払う。
- コンテナの利点がある
コンテナを使っているので、 言語、バイナリ、 依存関係に制限はない。簡単に持ち運びができる。コンテナを実行しているので、 Cloud RunやKubernetesやApp Engineにコンテナをデプロイできる。だから非常にポータブルで、 他のクラウド環境にもコンテナをデプロイできる。
- 他サービスとうまく統合されている
Cloud CodeやCloud Build, Cloud Monitoring, Cloud Loggingと非常にうまく統合されている。
- AnthosとCloud Runの違い
Anthosはデータセンターやマルチクラウドを活用している状況で、ノードの一部がオンプレミスにあったり、いくつかのノードがそれぞれのクラウド環境にあるとき、それらの組み合わせを使ってKubernetesクラスタを実行できるもの。もしコンテナを持っていて、 サーバーの管理をまったく気にしたくないのであれば Cloud runを使う。クラウド、 マルチクラウド、オンプレミスのどこでもKubernetesクラスタを実行できるようにしたいならAnthosを使う。Anthosにデプロイできるようにしたい場合は、 Cloud Run for Anthosを使ってAnthosクラスタにデプロイする。
覚えておくべき新しい単語は以下の様なものがある。
cold startsとは?
リクエストが入ってきてそれを処理するコンテナが無い場合、Cloud Runは新しいコンテナを立ち上げるが、その立ち上げに時間がかかるとリクエストがその分遅れる。これがcold startsである。なので、最低限コンテナインスタンスを1つ稼働させておくことが推奨される。
Revisionとは?
“Cloud Run”の中には”Revisions”というタブがある。サービスの中で複数のRevisionを持つことができる。複数のバージョンをリリースすれば、 ここには複数のリージョンが存在することになる。
ストレージ
ブロックストレージ(block storage)
VM(仮想マシン)にハードディスクをアタッチする際にはブロックストレージが使われる。Google Cloudのブロックストレージは永続ディスクである。ラップトップやコンピュータにはハードディスクが接続されている。このハードディスクのストレージの種類は Block Storageである。通常、 1つの仮想サーバーに複数の異なるブロック・ストレージ・デバイスを接続できる。ノートパソコンには、 いくつものハードディスクを取り付けられる。同様に、仮想サーバーや仮想マシンに複数のブロック・ストレージ・デバイスをアタッチできる。作成する仮想マシンは特定のホスト上にあり、この仮想マシンをネットワーク上の別の場所にあるブロック・ストレージに接続する。仮想マシンを作成するとき、 Block Storage Deviceでは永続ディスクかローカルSSDを取り付けられる。これは”boot disk”で選択する。ブートディスクは、 OSがロードされる場所であり、パーシステント・ディスクタイプである。 仮想マシンを作成すると、ブートディスクが自動的に仮想マシンにアタッチされる。ローカルSSDは仮想マシンと同じホスト上に存在するローカルなものである。
ゾーン型永続ディスクとリージョナル型永続ディスク
永続ディスクには、ゾーン型とリージョナル型の2種類がある。違いは、 永続ディスクからのデータがゾーン間でどのようにレプリケートされるかにある。ゾーナルでは、 データは1つのゾーンにのみ複製される。しかし、 地域のデータは複数のゾーンで複製される。
ファイルストレージ(file storage)
複数の仮想マシン間で共有するファイルを作成したい場合は、ファイルストレージを使用する。ファイル・ストアは、 Google Cloudのファイルストレージである。同僚とあるファイルを共有したい場合、File Storageを使用する。複数人が共通したファイルに取り組む場合、共有ストレージに置きたい。安全で整理された方法でファイルを共有する方法が望ましい。 File Storageを使えば、これらのファイルは複数の仮想サーバーで共有される。Google Cloudの File Storageは File Storeのみである。HHDかSSDを選ぶ。
Cloud Storage
Cloud Storageには以下のような特徴がある。
- 概要
柔軟で安価なストレージサービスである。サーバーレスであり、 自動スケーリングであり、 無限スケールである。 Cloud Storageに好きなだけオブジェクトを追加することができ、ニーズに応じて自動的に拡張される。オートスケーリングと無限スケーリングである。
- 特徴
⑴高耐久性がある。⑵低レイテンシーである。⑶オートスケールである。
- オブジェクト単位
クラウドストレージはオブジェクト全体を1つの単位として扱うので、部分的な更新はできない。オブジェクト全体(course1.png)をひとつのユニットとしてアップロードするような場合、Cloud Storageが推奨される。 オブジェクトレベルでのアクセス制御も可能だ。クラウドストレージでは、オブジェクトごとに異なるアクセスを指定できるので、オブジェクトストレージと言われる。オブジェクト全体を1つの単位として扱っている。
- REST API
Cloud Storageでは、オブジェクトにアクセスしたり変更したりするためのREST APIも提供している。なので”Authenticated URL”をクリックすればオブジェクトの中身が表示される。
- コマンドライン
Cloud Storageでは”gsutil”(google storage util)がコマンドラインであることが重要だ。”gcloud”ではない。これはコマンドラインからクラウドストレージを操作するために使われる。 Goアプリなどからクラウドストレージとやり取りしたい場合は、このライブラリを使えばクラウドストレージにリクエストを送ることができる。
- Cloud Storageで保存するデータ種類
クラウドストレージは、テキストファイル、 バイナリファイル、 バックアップ、 アーカイブなど、あらゆる種類のファイルを保存するために使用される。Cloud Storageにはメディアファイルやアーカイブやアプリパッケージなどさまざまな種類のデータを保存できる。バックアップやデータベース、一時的なストレージも有り得る。これらの中には、毎日アクセスしたいものも、まったくアクセスしないものも含まれる。あまり頻繁にアクセスしないデータについては安い料金にしたい。それが”storage class”であり、アクセス量に応じてコストを最適化する。
オブジェクト・ストレージ(object storage)
Google Cloudのオブジェクト・ストレージ・サービスは、 Cloud Storageである。Google Cloudの object storage serviceは Cloud storageである。クラウドストレージに何かを保存する前に、 バケットを作成する必要がある。データは2地域以上で保存すると高可用性と低遅延を実現できる。ストレージのサイズは自動的にリサイズされる。
ストレージ・クラス(storage class)とは?
Cloud Storageで選ぶ。”standard”, “nearline”, “coldline”, “archive”から選ぶ。短期間の保管や頻繁にアクセスするデータには”standard”を選ぶ。最低保存期間はなし。データへのアクセスが月に1回以下であれば、”nearline”を選ぶ。最低保存期間は30日間。データへのアクセスが四半期に1回以下の場合は”coldline”を選ぶ。最低保存期間は90日間。もし長期間のバックアップがあり、 アクセス頻度が1年に1回以下であれば”archive”を選ぶ。最低保存期間は365日間。Google Classのすべての”storage class”は99%超の高い耐久性を持つ。重要なのはbucketレベルでストレージクラスを設定できるということ。同じbucketの中に、 異なるストレージクラスを持つ異なるオブジェクトを持つことができる。Google Cloudの約束しているSLAは99%であり、”standard”, “nearline”, “coldline”にのみ適用される。”archive”にはコミットされたSLAはない。
Bucket(バケット)とは?
バケットは、 クラウド・ストレージに置きたいすべてのオブジェクトを入れるコンテナのようなものだ。 Cloud Storageでは選ぶ。buket名はグローバルで一意でないといけない。buket内のファイルはオブジェクトと呼ぶ。
オブジェクトのライフサイクル管理とは?
ファイルは作成時に頻繁にアクセスされる。一般的に、 使用量は時間とともに減少する。ストレージクラス間でファイルを自動的に移動することでコストを削減する。不要になったファイルを自動的に削除するにはオブジェクトのライフサイクル管理を行う。条件を使ってオブジェクトを特定することができる。これらの条件は、 オブジェクトが生きているかどうか、 特定のストレージクラスであるかどうか、作成された時期に基づくことができる。起こりうるアクションは2種類ある。⑴ストレージクラスを変更する。⑵削除する。オブジェクト・ライフサイクル管理ではすべて自動化される。
コメント