Amazon EKS でコンテナウェブアプリケーションをデプロイする

入門ガイド

モジュール 3: デプロイを作成する

このモジュールでは、デプロイを作成し、アプリケーションを起動します

はじめに

このモジュールでは、AWS CDK8s を使用してアプリケーション向けにサービスとデプロイの設定を作成します。AWS CDK8s では、Kubernetes API オブジェクトはコンストラクトとして表されます。これらのコンストラクトを使用して、サービスとデプロイを定義できます。CDK8s によって生成される出力は、Kubernetes 設定ファイルです。このモジュールの出力を使用し、それを前のモジュールの AWS CDK コードと統合して、アプリケーションをデプロイします。

学習内容

  • CDK8s コンストラクトを使用して Kubernetes API オブジェクトを定義する
  • CDK8s を使用してサービスと展開を定義する
  • CDK8s を使用して Kubernetes 設定を生成する

 所要時間

5 分

 モジュールの前提条件

  • 管理者レベルのアクセス権を持つ AWS アカウント**
  • 推奨ブラウザ: Chrome または Firefox の最新バージョン

[**] 過去 24 時間以内に作成されたアカウントは、このチュートリアルに必要なサービスへのアクセス権限がまだ付与されていない可能性があります。

実装

アプリケーションを定義する

このステップから、main.py を変更して CDK8s アプリケーションを定義します。初期化すると、次のようになります。

#!/usr/bin/env python
from constructs import Construct
from cdk8s import App, Chart

class MyChart(Chart):
    def __init__(self, scope: Construct, id: str):
        super().__init__(scope, id)

        # define resources here

app = App()
MyChart(app, "cdk8s")

app.synth()

アプリケーションをデプロイするには、次の 4 つの手順に従います。

  1. YAML 設定ファイルの文字列の生成に役立てるために、k8s ライブラリをインポートします。
  2. サービスルックアップで使用するポッドに適用するラベルセットを定義します。
  3. デプロイを定義します。これにより、クラスター上のコンテナが起動しますが、ロードバランサーからトラフィックを受信するように設定されることはありません。
  4. デプロイをロードバランサーに公開するサービスを定義します。

ラベルは、Kubernetes オブジェクトにアタッチされるキー/値のペアです。デプロイの一部としてポッドにタグを付けて実行します。ReplicationController は、サービスを作成するときに同じラベルを使用してポッドを選択し、ロードバランサーに公開します。これを行うには、label = {"app": "cdk8s"} コードを使用します。

その後、これらのラベルをデプロイで使用します。Kubernetes でのデプロイは、デプロイユニットと目的の状態に関する明示的な宣言です。このガイドでは、Amazon ECR Public Gallery でホストされるサンプルアプリケーションを使用します。プルするコンテナイメージの URL は、public.ecr.aws/s9u7u6x1/sample app 001:no-db です。

デプロイとサービスを作成するには、他のインポートの下のファイルの先頭に from imports import k8s を追加し、以下の # define resources here の下のコードを貼り付けて、main.py を更新します。ファイルは次のようになります。

#!/usr/bin/env python
from constructs import Construct
from cdk8s import App, Chart
from imports import k8s

class MyChart(Chart):
    def __init__(self, scope: Construct, id: str):
        super().__init__(scope, f"{id}-deployment")

        # define resources here

        # Label used for tagging pods to link in the service
        label = {"app": "cdk8s"}

        # Creates the deployment to spin up pods with your container
        k8s.KubeDeployment(self, 'deployment',
            spec=k8s.DeploymentSpec(
                replicas=2,
                selector=k8s.LabelSelector(match_labels=label),
                template=k8s.PodTemplateSpec(
                metadata=k8s.ObjectMeta(labels=label),
                spec=k8s.PodSpec(containers=[
                    k8s.Container(
                    name='cdk8s',
                    image='public.ecr.aws/s9u7u6x1/sample_app_001:no-db',
                    ports=[k8s.ContainerPort(container_port=80)])]))))

        # Creates the service to expose the pods to traffic from the loadbalancer
        super().__init__(scope, f"{id}-service")
        k8s.KubeService(self, 'service',
            spec=k8s.ServiceSpec(
            type='LoadBalancer',
            ports=[k8s.ServicePort(port=80, target_port=k8s.IntOrString.from_number(80))],
            selector=label))

app = App()
MyChart(app, "cdk8s")

app.synth()

お気付きのとおり、このメソッドでは super() が 2 回呼び出されています。このメソッドは、指定された名前で YAML ファイルを作成し、このクラスの継承元である親クラスのコンストラクターを呼び出すことで、当該作成後に生成された設定を追加します。サービス設定用のファイルと、デプロイ用の 2 つ目のファイルを生成します。 

これで、cdk8s synth を実行して設定ファイルを生成できるようになりました。出力は、次のようになります。

cdk8s synth

dist/cdk8s-deployment.k8s.yaml
dist/cdk8s-service.k8s.yaml

まとめ

このモジュールでは、CDK8s を使用して Kubernetes 設定ファイルを生成する方法を学習しました。アプリケーションはデプロイとサービスに分割され、それぞれが独自の設定ファイルを備えています。

これで、CDK プロジェクトを更新してこれらのファイルを参照し、kubectl を使用してそれらを EKS クラスターにデプロイする準備が整いました。

次のステップ: CDK を使用してデプロイする

当社のサービスについてご意見をお聞かせください。