コンテナとは、アプリケーションとその実行に必要なライブラリや設定ファイルなどをまとめて、OS上で分離して動作させる技術です。仮想マシンと比べて軽量で、起動が速く、移植性が高いのが特徴です。 コンテナを使うことで開発環境と本番環境の差異を減らし、どこでも同じように動作させることができるため、開発・テスト・運用の効率化や信頼性向上につながります。 クラウドネイティブの文脈では、コンテナはアプリケーションを小さな単位(マイクロサービス)として分割し、独立してデプロイ・スケール・管理できるようにします。これにより、可用性や拡張性、運用の自動化が実現しやすくなり、クラウド環境の特性(弾力的なリソース利用や自動復旧など)を最大限に活かすことができます。
コンテナは「コンテナイメージ」と「コンテナランタイム」によって動作します。
- コンテナイメージは、アプリケーション本体や必要なライブラリ、設定ファイル、実行コマンドなどをまとめたファイルシステムのスナップショットです。Dockerイメージなどが代表例です。
- コンテナランタイムは、イメージからコンテナを作成・実行・管理するソフトウェアです。代表的なものにDocker Engineやcontainerd、CRI-Oなどがあります。ランタイムはOSのカーネル機能(名前空間やcgroupsなど)を利用して、プロセスを分離・制御します。
コンテナのエコシステムは、コンテナ技術を支えるさまざまな要素で構成されています。
- コンテナホスト: コンテナを実行するためのOSやハードウェア環境です。通常はLinuxベースのOSが使われますが、Windowsでもコンテナを実行できます。
- イメージレジストリ: コンテナイメージを保存・配布するためのサービスです。Docker HubやAmazon ECR、Google Container Registryなどが代表例です。開発者やCI/CDパイプラインは、ここからイメージを取得・登録します。
- オーケストレーター: 複数のコンテナを自動的に管理・運用する仕組みやツールです。KubernetesやDocker Swarmなどがあり、デプロイ、スケーリング、障害時の自動復旧などを担います。
これらの要素が連携することで、コンテナを用いたアプリケーションの開発・運用が効率的かつスケーラブルに行えるようになります。
Kubernetes(K8s)は、コンテナ化されたアプリケーションのデプロイ、スケーリング、管理を自動化するためのオープンソースのプラットフォームです。Googleが開発し、現在はCloud Native Computing Foundation(CNCF)によって管理されています。
Kubernetesの主な特徴は以下の通りです。
- 自動デプロイとローリングアップデート: アプリケーションの新バージョンをダウンタイムなく段階的にリリースできます。
- 自己修復機能: コンテナが異常終了した場合、自動的に再起動や再スケジューリングを行い、常に望ましい状態を維持します。
- スケーリング: トラフィックや負荷に応じて、コンテナの数を自動的に増減できます。
- サービスディスカバリとロードバランシング: クラスタ内のコンテナ間通信や外部からのアクセスを自動的に管理し、負荷分散も行います。
- 構成管理とシークレット管理: 設定情報や機密情報(パスワード等)を安全に管理できます。
- マルチクラウド・ハイブリッド対応: さまざまなクラウドやオンプレミス環境で同じように動作し、ベンダーロックインを回避できます。
Kubernetesは、クラウドネイティブなアプリケーションの運用基盤として事実上の標準となっており、マイクロサービスアーキテクチャやDevOpsの実践を支える重要な技術です。
Kubernetesの運用は複雑で、クラスタのセットアップや管理に多くの労力がかかります。そこで、主要なクラウドプロバイダはマネージドKubernetesサービスを提供しています。これにより、ユーザーはKubernetesのインフラ管理から解放され、アプリケーションの開発と運用に集中できます。 代表的なマネージドKubernetesサービスには以下があります。
- Amazon EKS (Elastic Kubernetes Service): AWSが提供するマネージドKubernetesサービス。クラスタのセットアップやスケーリング、セキュリティパッチの適用などを自動化します。
- Google Kubernetes Engine (GKE): Google Cloudが提供するマネージドKubernetesサービス。Googleのインフラを活用し、高い可用性とパフォーマンスを実現します。
本プラクティスではEKSを使用します。
自身のGitHubアカウントに作成したcloudnative-practiceリポジトリにIssueを作成します。issueを作成するスクリプトを用意しているためそれを使います。
-
まずはリポジトリのルートから以下コマンドで
scriptsディレクトリに移動cd scripts -
環境変数に値を設定
export GITHUB_TOKEN={あなたのGitHubのPAT} export GITHUB_REPO={あなたのGitHubアカウント名}/cloudnative-practice
-
スクリプト実行
python create_issues.py container
自身のGitHubアカウントのcloudnative-practiceリポジトリを開き、Issuesタブにコンテナのラベルがついたissueが作成されていることを確認してください。
注意: issue対応はDockerとK8sの基本的な使い方を理解していることが前提です。docker-practice、k8s-practiceを先に学習してください。
以下タイトルのissueを対応してください。issueを対応する流れはこちらを参照してください。コーディングルールはこちらを参照してください。もし詰まってしまった場合、exampleディレクトリにサンプルコードを用意していますので参考にしてください。
- EKSクラスタを作成する
- ECRを作成する
- サブネットにタグを追加する
- バックエンドのコンテナをデプロイする
- フロントエンドのコンテナをデプロイする
- バックエンドの公開ポートを環境変数で指定できるようにする
- フロントエンドのメッセージを変更する
作成する環境は以下のイメージ図です。
コンテナの更新はイメージをビルドし、レジストリにプッシュしてから、Kubernetesのマニフェストを更新する必要があり非常に手間がかかります。本プラクティスのコンテナイメージはかなり軽量なのでビルド時間もそこまでかかりませんでしたが、業務であつかうイメージとなるとそれなりに時間かかります。そこで、CI/CDツールを使って自動化することを推奨します。次のプラクティスではCI/CDを導入し作業を自動化します。