クイックスタート: ウェブアプリケーションをデプロイしてデータを保存する - Amazon EKS

このページの改善にご協力ください

本ユーザーガイドの改善にご協力いただけませんか? このページの下部までスクロールし、[GitHub でこのページの編集] を選択します。皆さまにご協力いただくことで、あらゆる人々に使いやすいユーザーガイドになります。

クイックスタート: ウェブアプリケーションをデプロイしてデータを保存する

このクイックスタートチュートリアルでは、eksctl を使用して 2048 ゲームサンプルアプリケーションをデプロイし、そのデータを Amazon EKS クラスターに保持する手順を示します。eksctl は、AWS CloudFormation を利用する Infrastructure as Code ユーティリティであり、すべての必須コンポーネントを備えた完全に機能するクラスターをセットアップできます。これらのコンポーネントには、Amazon VPC と、定義された AWS サービスにアクセス許可を付与するようにカスタマイズされた IAM ロールが含まれます。進行したら、クラスターのセットアッププロセスについて説明します。Amazon EKS Amazon EKS アドオン を組み込み、運用機能でクラスターを強化します。最後に、AWS サービスとの完全統合に必要なカスタム注釈を含むサンプルワークロードをデプロイします。

このチュートリアルでは、次の作業を行いました。

以下の eksctl クラスターテンプレートを使用して、マネージド型ノードグループを持つ Amazon EKS クラスターを構築します。これは次のコンポーネントで構成されます。

VPC 設定

以下の eksctl クラスターテンプレートを使用すると、eksctl はクラスターの IPv4 仮想プライベートクラウド (VPC) を自動的に作成します。デフォルトでは、eksctl はパブリックエンドポイントとプライベートエンドポイントの両方を作成するだけでなく、すべてのネットワーク要件に対応する VPC を設定します。

インスタンスタイプ

t3.medium インスタンスタイプを使用します。このインスタンスタイプは、コンピューティング、メモリ、ネットワークリソースのバランスが取れた組み合わせを提供します。需要が時折急増する可能性のある、CPU 使用率が中程度のアプリケーションに最適です。

認証

IRSA マッピングを確立して、Kubernetes ポッドと AWS サービス間の通信を容易にします。テンプレートは、認証と認可のために OpenID Connect (OIDC) エンドポイント をセットアップするように設定されています。また、アプリケーションの公開とトラフィックの管理を担当するコントローラーである AWS Load Balancer Controller (LBC) のサービスアカウントも確立します。

データの永続性

AWS EBS CSI ドライバーマネージドアドオンを統合して、ポッドの再起動や障害が発生するシナリオでも、アプリケーションデータの永続性を確保します。テンプレートは、アドオンをインストールしてサービスアカウントを確立するように設定されています。

外部アプリケーションアクセス

AWS Load Balancer Controller (LBC) アドオンをセットアップして統合し、2048 ゲームアプリケーションを公開し、LBC を使用して Application Load Balancer (ALB) を動的にプロビジョニングします。

前提条件

ステップ 1: クラスターを設定する

このセクションでは、2 つのノードを含む t3.medium インスタンスを使用して、マネージドノードグループベースのクラスターを作成します。設定には、AWS Load Balancer Controller (LBC) アドオンのサービスアカウントと、最新バージョンの AWS Amazon EBS CSI ドライバーのインストールが含まれます。利用可能なすべての eksctl アドオンについては、eksctl ドキュメントの「Discovering addons」を参照してください。

  • cluster-config.yaml ファイルを作成して、次の内容を貼り付けます。region-code を、us-east-1 などの有効なリージョンに置き換えます。

    次に出力例を示します。

    apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: web-quickstart region: region-code managedNodeGroups: - name: eks-mng instanceType: t3.medium desiredCapacity: 2 iam: withOIDC: true serviceAccounts: - metadata: name: aws-load-balancer-controller namespace: kube-system wellKnownPolicies: awsLoadBalancerController: true addons: - name: aws-ebs-csi-driver wellKnownPolicies: # Adds an IAM service account ebsCSIController: true cloudWatch: clusterLogging: enableTypes: ["*"] logRetentionInDays: 30

ステップ 2: クラスターを作成する

これで、Amazon EKS クラスターを作成する準備が整いました。このプロセスが完了するまでに数分かかります。ステータスをモニタリングする場合は、AWS CloudFormation コンソールを参照してください。

  • Amazon EKS クラスターを作成し、cluster-config.yaml を指定します。

    eksctl create cluster -f cluster-config.yaml
    注記

    レスポンスで Error: checking STS access を受け取った場合は、現在のシェルセッションに正しいユーザー ID を使用しているか確認してください。また、名前付きプロファイル (--profile clusteradmin など) を指定するか、AWS CLI の新しいセキュリティトークンを取得する必要がある場合があります。

    完了すると、以下のようなレスポンス出力が表示されます。

    2024-07-04 21:47:53 [✔] EKS cluster "web-quickstart" in "region-code" region is ready

ステップ 3: AWS Load Balancer Controller (LBC) を使用してアプリケーションへの外部アクセスをセットアップする

クラスターが運用可能になったら、次のステップとして、コンテナ化されたアプリケーションを外部からアクセスできるようにします。これは、Application Load Balancer (ALB) をデプロイして、クラスター外のトラフィックをサービス、つまりアプリケーションに転送することで実現されます。クラスターを作成したときに、ALB を動的に作成するために必要なアクセス許可を持つ Load Balancer Controller (LBC)サービスアカウントの IAM ロール (IRSA) を確立し、Kubernetes サービスへの外部トラフィックルーティングを容易にしました。このセクションでは、クラスターに AWS LBC をセットアップします。

環境変数を設定するには

  1. Amazon EKS クラスターの CLUSTER_REGION 環境変数を設定します。region-code のサンプル値を置き換えます。

    export CLUSTER_REGION=region-code
  2. Amazon EKS クラスターの CLUSTER_VPC 環境変数を設定します。

    export CLUSTER_VPC=$(aws eks describe-cluster --name web-quickstart --region $CLUSTER_REGION --query "cluster.resourcesVpcConfig.vpcId" --output text)

AWS Load Balancer Controller (LBC) をインストールするには

AWS Load Balancer Controller (LBC) は、Kubernetes のカスタムリソース定義 (CRD) を活用して AWS Elastic Load Balancer (ELB) を管理します。これらの CRD は、ロードバランサーや TargetGroupBindings などのカスタムリソースを定義し、Kubernetes クラスターがそれらを認識および管理できるようにします。

  1. Helm を使用して、Amazon EKS チャートリポジトリを Helm に追加します。

    helm repo add eks https://aws.github.io/eks-charts
  2. リポジトリを更新して、Helm がチャートの最新バージョンを認識していることを確認します。

    helm repo update eks
  3. 次の Helm コマンドを実行して、カスタムリソース定義 (CRD) と AWS Load Balancer Controller (AWS LBC) のメインコントローラーを同時にインストールします。CRD のインストールをスキップするには、--skip-crds フラグを渡します。これは、CRD が既にインストールされている場合や、特定のバージョンの互換性が必要な場合、あるいはアクセスコントロールとカスタマイズのニーズが厳しい環境において便利です。

    helm install aws-load-balancer-controller eks/aws-load-balancer-controller \ --namespace kube-system \ --set clusterName=web-quickstart \ --set serviceAccount.create=false \ --set region=${CLUSTER_REGION} \ --set vpcId=${CLUSTER_VPC} \ --set serviceAccount.name=aws-load-balancer-controller

    以下のようなレスポンス出力が表示されます。

    NAME: aws-load-balancer-controller LAST DEPLOYED: Wed July 3 19:43:12 2024 NAMESPACE: kube-system STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: AWS Load Balancer controller installed!

ステップ 4: 2048 ゲームサンプルアプリケーションをデプロイする

ロードバランサーがセットアップされたので、クラスター内のコンテナ化されたアプリケーションの外部アクセスを有効にします。このセクションでは、人気のある「2048 ゲーム」をクラスター内のサンプルアプリケーションとしてデプロイする手順について説明します。提供されるマニフェストには、Application Load Balancer (ALB) のカスタム注釈、具体的には「scheme」の注釈「target-type」の注釈が含まれています。これらの注釈は AWS Load Balancer Controller (LBC) と統合され、受信 HTTP トラフィックを「internet-facing」として処理し、ターゲットタイプ「ip」を使用して「game-2048」名前空間の適切なサービスにルーティングするように指示します。その他の注釈については、AWS LBC ドキュメントの「Annotations」を参照してください。

  1. --save-config フラグを付けて game-2048 という Kubernetes 名前空間を作成します。

    kubectl create namespace game-2048 --save-config

    以下のようなレスポンス出力が表示されます。

    namespace/game-2048 created
  2. 2048 ゲームサンプルアプリケーションをデプロイします。

    kubectl apply -n game-2048 -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.8.0/docs/examples/2048/2048_full.yaml

    このマニフェストは、game-2048 名前空間の Kubernetes デプロイ、サービス、およびイングレスをセットアップし、クラスター内で game-2048 アプリケーションをデプロイして公開するために必要なリソースを作成します。これには、ポート 80 でのデプロイを公開する service-2048 という名前のサービスの作成と、受信 HTTP トラフィックのルーティングルールと internet-facing Application Load Balancer (ALB) の注釈を定義する ingress-2048 という名前のイングレスリソースの作成が含まれます。以下のようなレスポンス出力が表示されます。

    namespace/game-2048 configured deployment.apps/deployment-2048 created service/service-2048 created ingress.networking.k8s.io/ingress-2048 created
  3. 次のコマンドを実行して、game-2048 名前空間のイングレスリソースを取得します。

    kubectl get ingress -n game-2048

    以下のようなレスポンス出力が表示されます。

    NAME CLASS HOSTS ADDRESS PORTS AGE ingress-2048 alb * k8s-game2048-ingress2-eb379a0f83-378466616.region-code.elb.amazonaws.com 80 31s

    Application Load Balancer (ALB) がプロビジョニングされるまで数分待ってから、次のステップを開始する必要があります。

  4. ウェブブラウザを開き、前のステップの ADDRESS を入力してウェブアプリケーションにアクセスします。例えば、k8s-game2048-ingress2-eb379a0f83-378466616.region-code.elb.amazonaws.com と指定します。ブラウザに 2048 ゲームが表示されるはずです。プレイしてください!

    2048 ゲームをプレイする

ステップ 5: Amazon EBS CSI ドライバーノードを使用してデータを保持する

2048 ゲームが Amazon EKS クラスターで稼働しているので、Amazon EBS CSI ドライバーマネージドアドオンを使用してゲームデータが安全に保持されるようにします。このアドオンは、作成プロセス中にクラスターにインストールされました。この統合は、Kubernetes ポッドまたはノードが再起動された場合や置き換えられた場合にも、ゲームの進行状況とデータを保持するのに不可欠です。

  1. EBS CSI ドライバーのストレージクラスを作成します。

    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-ebs-csi-driver/master/examples/kubernetes/dynamic-provisioning/manifests/storageclass.yaml
  2. ゲームデータのストレージをリクエストするには、永続ボリュームのクレーム (PVC) を作成します。ebs-pvc.yaml という名前のファイルを作成し、そのファイルに以下の内容を追加します。

    apiVersion: v1 kind: PersistentVolumeClaim metadata: name: game-data-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: ebs-sc
  3. PVC をクラスターに適用します。

    kubectl apply -f ebs-pvc.yaml

    以下のようなレスポンス出力が表示されます。

    persistentvolumeclaim/game-data-pvc created
  4. 次に、データの保存にこの PVC を使用するように 2048 ゲームデプロイを更新する必要があります。次のデプロイは、ゲームデータの保存に PVC を使用するように設定されています。ebs-deployment.yaml という名前のファイルを作成し、そのファイルに以下の内容を追加します。

    apiVersion: apps/v1 kind: Deployment metadata: namespace: game-2048 name: deployment-2048 spec: replicas: 3 # Adjust the number of replicas as needed selector: matchLabels: app.kubernetes.io/name: app-2048 template: metadata: labels: app.kubernetes.io/name: app-2048 spec: containers: - name: app-2048 image: public.ecr.aws/l6m2t8p7/docker-2048:latest imagePullPolicy: Always ports: - containerPort: 80 volumeMounts: - name: game-data mountPath: /var/lib/2048 volumes: - name: game-data persistentVolumeClaim: claimName: game-data-pvc
  5. 更新されたデプロイを適用します。

    kubectl apply -f ebs-deployment.yaml

    以下のようなレスポンス出力が表示されます。

    deployment.apps/deployment-2048 configured

これらのステップで、Amazon EKS の 2048 ゲームが Amazon EBS CSI ドライバーを使用してデータを保持するようにセットアップされました。これにより、ポッドやノードに障害が発生した場合でも、ゲームの進行状況とデータは安全になります。このチュートリアルが気に入った場合は、フィードバックを提供してお知らせください。これにより、このようなユースケース固有のクイックスタートチュートリアルをより多く提供できるようになります。

ステップ 6: クラスターとノードを削除する

このチュートリアルのために作成したクラスターとノードの使用が終了したら、クリーンアップのために、次のコマンドを使用してそれらのクラスターとノードを削除する必要があります。クリーンアップする前にこのクラスターでやることがある場合は、「次のステップ」を参照してください。

eksctl delete cluster -f ./cluster-config.yaml

完了すると、以下のようなレスポンス出力が表示されます。

2024-07-05 17:26:44 [✔] all cluster resources were deleted

次のステップ

以下のトピックは、クラスターの機能を拡張するのに役立ちます。

さまざまなタイプのクラスターを作成する方法を調べるには: