皆様、こんにちは!
アイレット株式会社 DX開発事業部の楊林と申します。
前回の投稿では、Google Cloud のコンピューティングオプションとマネージドインスタンスグループについて紹介しました。
今回の投稿からは、数回に分けて Google Cloud のもう一つ重要な環境構築の選択肢 ― Google Kubernetes Engine(GKE) を紹介していこうと思います。
GKE は Compute Engine のように「個別の仮想マシンを立ててアプリを動かす」のではなく、コンテナ化されたアプリケーションをクラウド上で動かすためのサービスです。
ということで、今回はその前提となるコンテナの話から始めます。
コンテナとは
コンテナとは、アプリケーションとその実行に必要な依存関係をひとまとめにパッケージ化したもので、独立したユーザー空間で動作します。
PaaS が得意とする「ワークロードの独立したスケーラビリティ」と、IaaS が提供する「OS・ハードウェアの抽象化」を、より軽量な形で実現するのがコンテナです。
コンテナは、まるで「コードと依存関係を入れた見えない箱」を動かすようなイメージで、数回のシステム呼び出しのみで作成でき、プロセスと同じくらい迅速に起動します。各ホストに必要なのはコンテナをサポートするOSカーネルとコンテナランタイムだけです、端的にいうとOSが仮想化されるようなものです。
その結果、コンテナは非常にポータブルで、OSとハードウェアをブラックボックスのように扱えます。開発からステージング、本番環境まで、またノートパソコンからクラウドへの移動時にも、変更や再構築の必要がありません。
コンテナを利用することで、開発者はコードを中心とした方法で高性能かつ高拡張性のアプリを配布できる上、信頼性の高い基盤となるハードウェアとソフトウェアにアクセスできます。そしてイメージに基づいて、ファイルコピーだけで迅速にデプロイし、開発期間を短縮できます。
コンテナイメージ
コンテナで動くアプリと依存関係をまとめたものが コンテナイメージ です。
イメージは設計図、コンテナはその実行中インスタンスという関係です。
コンテナイメージを使えば、アプリがどの OS で動くのかを気にせず、同じ方法でパッケージ化・実行できます。
イメージをビルドして動かすための代表的なツールが Docker です。
ただし Docker コンテナにアプリを作成して実行できますが、Kubernetesのようにこれらのアプリを大規模にオーケストレートすることはできません。
コンテナ起動の仕組み
コンテナイメージは複数の読み取り専用レイヤの積み重ねによってできています。
コンテナイメージをビルドするために、コンテナマニフェストというファイルを使い、手順を読み取ります。
Dockerイメージの場合、その手順はDockerfileに記述します。
Dockerfileを作成するとき、変更頻度が低いレイヤを上に、変更頻度が高いレイヤを下に配置する必要があります。
コンテナを起動すると、これらのレイヤに加えて書き込み可能なコンテナレイヤが作成されます。コンテナイメージに対して、ファイルの追加・変更・削除はすべてコンテナレイヤに書き込まれます。
コンテナレイヤはエフェメラルで、コンテナを削除すると一緒に消えます。したがって、アプリの永続データは外部ストレージに保存する必要があります。
また、アプリのビルド環境と実行環境を同じにすると、不要なツールが本番イメージに残ってしまうことがあります。これを避けるために、マルチステージのビルドプロセスでパッケージ化し、ビルド用と実行用に最小化されたコンテナを分けるのがベストプラクティスです。
コンテナイメージの取得と作成
一般的に、開発者は公開されているオープンソースのコンテナイメージをベースにし、それをカスタマイズして独自のイメージを作成します。
Google は Artifact Registry を提供しており、自分のプロジェクト専用のプライベートイメージ置き場として利用できます。もちろん Docker Hub や GitLab Registry などの外部レジストリからプルすることも可能です。
また、Google Cloud にはコンテナビルド専用サービス Cloud Build があり、GitHub・Bitbucket・Cloud Source Repositories などからソースコードを取得して、イメージをビルドできます。
Cloud IAM と統合されているため、アクセス制御も行いやすく、CI/CD と相性の良いサービスです。
最後に
今回は、Google Kubernetes Engine を理解する前提として、まずコンテナの基礎について紹介しました。
次回は、GKE の本題に入る前に、もう一歩踏み込んで Kubernetes とは何かを整理していきます。
ぜひ続けて読んでいただけると嬉しいです!
以前の投稿
【Google Cloud入門】クラウドサービスの特徴とGoogle Cloudの触り方
【Google Cloud入門】リソースマネージメント
【Google Cloud入門】アクセス管理の基本 - IAM
【Google Cloud入門】サービスアカウントとCloud Identity
【Google Cloud入門】Compute Engineの基礎
【Google Cloud入門】コンピューティングオプションとマネージドインスタンスグループ