コンテナやサーバーレス・コンピューティングなどのクラウド・ネイティブ・テクノロジは、クラウドで移植性の高いアプリケーションを構築するために不可欠です。これらのテクノロジーを活用することで、より弾力性があり、スケーラブルで、環境の変化に適応できるアプリケーションを設計することができる。これら3つのメリットを一言で説明すると、「ポータブル」です。
管理が煩雑になり、ほとんど不可能になるモノリシックなモデルとは異なり、クラウドネイティブのマイクロサービス・アーキテクチャはモジュール化されています。このアプローチでは、仕事に適したツール、つまり特定の1つの機能をうまくこなすサービスを自由に選択することができます。クラウドネイティブアプローチは、ワークロード全体に影響を与えることなく、個々のコンポーネントを更新したり置き換えたりするための効率的なプロセスを提供するため、ここで輝きを放つのです。クラウドネイティブの考え方で開発すると、アプリケーション、サポートするソフトウェアスタック、システム構成など、デプロイメントに対する宣言的なアプローチになります。
なぜコンテナなのか?
コンテナは、ある特定のタスクのために設計された超軽量の仮想マシンだと考えてほしい。コンテナもまたエフェメラルである。永続性はない。その代わり、永続性はホスト・ファイルシステム内のブロック・ストレージやその他のマウントに結びつけられるが、コンテナ自体には結びつかない。
アプリケーションをコンテナ化することで、ポータブルにすることができます!コンテナイメージを渡せば、異なるオペレーティングシステムやCPUアーキテクチャ間でそれをデプロイして実行することができます。コンテナ化されたアプリケーションは、必要な依存関係、ライブラリ、設定ファイルをすべてパッケージ化した自己完結型のユニットであるため、異なるクラウド環境間でコードを変更する必要がない。このように、コンテナがクラウドネイティブデザインにおけるポータビリティにどのようにつながるかを説明します。
- 軽量な仮想化:コンテナは、ホストOSのカーネルを共有しながら、プロセス、ファイルシステム、ネットワークリソースを分離して、アプリケーションを実行する環境を提供します。
- ポータブルで一貫性がある:コンテナは、アプリケーションとその依存関係をまとめてパッケージ化し、開発環境から本番環境まで、異なる環境で一貫して動作することを保証します。
- リソース効率に優れています: コンテナは、プロセスを分離してホストOSのカーネルを共有するため、仮想マシンよりも少ないリソースを消費します。また、ホストOSの上で別の「ゲスト」OSを実行するオーバーヘッドも必要ありません。
- 迅速な起動とデプロイメントコンテナはOSを起動する必要がないため、起動が早く、迅速なデプロイメント、スケーリング、リカバリーシナリオに最適です。
- Immutableインフラ: コンテナは、一度構築されると変更されないイミュータブルな設計になっており、デプロイ、バージョン管理、ロールバックのプロセスを簡素化し、環境間で一貫した動作を保証するのに役立ちます。
コンテナを検討すべきタイミングは?
コンテナによって、一貫性を保つことができます。例えば、冗長なデバッグ出力など、開発のある側面はステージングやプロダクションでは省略されます。しかし、開発から出荷されたコードは、テストやデプロイのサイクルを通してそのまま残ります。
コンテナはリソース効率が非常に高く、超軽量だ。コンテナは仮想マシンに似ていると述べたが、巨大な(あるいはさらに小さいが無駄に利用される)VMで慣れ親しんでいるギガバイトとは対照的に、数十メガバイトになることもある。軽量であればあるほど起動が速くなり、これは動的なクラウド・コンピューティング環境で弾力性とパフォーマンスの高い水平スケールを実現するために重要だ。コンテナはまた、不変であるように設計されている。何かが変更された場合、コンテナ内に新しい変更を埋め込むのではなく、コンテナを取り壊して新しいコンテナを作成するだけだ。このことを念頭に置いて、コンテナをクラウド・ネイティブ・モデルの一部とすべきかどうかを決定する際のその他の考慮事項を以下に示す。
- デプロイの一貫性の向上:コンテナは、アプリケーションとその依存関係をまとめてパッケージ化するため、異なる環境でも一貫した動作を保証し、デプロイを簡素化し、設定に関連する問題のリスクを低減します。
- スケーラビリティの強化:コンテナは、需要の増加に対応するために新しいインスタンスを素早く立ち上げ、リソースの使用を最適化し、システム全体のパフォーマンスを向上させることにより、アプリケーションの迅速な拡張を可能にします。
- 費用対効果の高いリソース利用:コンテナは従来の仮想マシンに比べて消費するリソースが少ないため、企業は同じハードウェアでより多くのインスタンスを実行することができ、クラウドインフラ のコスト削減につながる。
- 開発・テストサイクルの高速化コンテナは、開発環境、テスト環境、本番環境間のシームレスな移行を容易にし、開発プロセスを合理化し、新機能やバグフィックスのリリースを迅速化します。
- アプリケーション管理の簡素化:コンテナオーケストレーションプラットフォームは、コンテナ化されたアプリケーションの展開、スケーリング、メンテナンスを管理し、多くの運用タスクを自動化してITチームの負担を軽減します。
コンテナのベストプラクティス
コンテナを実行する方法は数多くあり、それらはすべて相互運用可能だ。例えば、AWS から移行する場合、コンテナイメージを新しい環境に再デプロイするだけで、あなたとワークロードは移行できる。コンテナの実行に使用できるツールやエンジンはさまざまだ。どれもリソースの使用量や価格帯が異なります。Linode(アカマイのクラウドコンピューティングサービス)でホスティングしている場合は、Linode Kubernetes Engine(LKE)を使用してコンテナを実行できます。また、Podman、HashiCorp Nomad、Docker Swarm、または Compose を仮想マシン上で起動することもできます。
これらのオープンスタンダードなツールにより、LKEのようなサービスを利用する場合、管理が簡素化されるという付加価値とともに、開発とテストを迅速に進めることができます。Kubernetesは、オープンスタンダードで構築されたツールを使ってコンテナをオーケストレーションするための、すべてのノブやダイヤルを備えたコントロールプレーンとなる。さらに、AWS Elastic Container Service (ECS)のようなプラットフォームネイティブのサービスを利用することにした場合、別の種類の利用料金を支払うことになる。
コンテナのもう1つの重要な部分は、コンテナ・イメージの保存とアクセスに使用するレジストリを理解することである。我々はよくHarborの使用を推奨している。CNCFのプロジェクトであるHarborを使えば、自分専用のコンテナ・レジストリを実行することができ、その周辺のセキュリティを制御することができる。
常にテストを行い、非常に綿密な回帰テストスイートを用意し、コードがパフォーマンスとセキュリティのために最高品質であることを確認します。コンテナには、失敗に対する計画も必要です。コンテナが故障した場合、再試行の仕組みはどうなっているのでしょうか?どのように再起動させるのか?その場合、どのような影響があるのでしょうか?アプリケーションはどのように回復するのか?ステートフルなデータは、マップされたボリュームやバインドマウントに永続するのか?
ここでは、クラウドネイティブの開発モデルの一部としてコンテナを使用するための追加のベストプラクティスをいくつか紹介します。
- 軽量なベースイメージを使用する: Alpine LinuxやBusyBoxなど、軽量なベースイメージから始めることで、コンテナ全体のサイズを小さくし、攻撃対象領域を最小限に抑える。
- コンテナオーケストレーションを使用する: Kubernetes、HashiCorp Nomad、Docker Swarm、Apache Mesosなどのコンテナオーケストレーションツールを使用して、複数のホストでコンテナを管理および拡張します。
- コンテナレジストリを使用する:Docker Hub、GitHub Packages registry、GitLab Container registry、Harborなどのコンテナレジストリを使用して、コンテナイメージを保存およびアクセスします。これにより、複数のホストやコンピューティング環境でのコンテナイメージの共有やデプロイが容易になります。
- 容器の特権を制限する:コンテナの権限を、意図した目的に必要なものだけに制限する。可能な限りルートレスコンテナを導入し、コンテナが侵害された場合に悪用されるリスクを低減させる。
- リソース制約を実装する:CPUやメモリなどのリソース制限を設定し、コンテナがリソースを使いすぎてシステム全体のパフォーマンスに影響するのを防ぎます。
- コンテナを最新の状態に保つ:脆弱性のリスクを最小限に抑えるため、コンテナイメージを最新のセキュリティパッチとアップデートで最新の状態に保つ。
- コンテナを徹底的にテストする:本番環境にデプロイする前に、期待通りに動作すること、脆弱性がないことを確認する。CIパイプラインで各段階のテストを自動化し、人的ミスを減らす。
- コンテナのバックアップとリカバリを実装する:コンテナと相互作用する永続的なデータのバックアップとリカバリ戦略を実装し、障害や災害の際にワークロードが迅速に回復できるようにします。
コメント