Amazon EKS クラスターをデプロイおよびデバッグ - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Amazon EKS クラスターをデプロイおよびデバッグ

作成者:Svenja Raether (AWS) と Mathew George (AWS)

環境:PoC またはパイロット

テクノロジー:コンテナとマイクロサービス、インフラストラクチャ、モダナイゼーション、サーバーレス、クラウドネイティブ

ワークロード:その他すべてのワークロード

AWS サービス:Amazon EKS; AWS Fargate

[概要]

コンテナはクラウドネイティブアプリケーション開発に欠かせないものになりつつあります。Kubernetes は、コンテナを効率的に管理およびオーケストレーションする方法を提供します。Amazon Elastic Kubernetes Service (Amazon EKS) は、Amazon Web Services (AWS)で、Kubernetes クラスターを構築、保護、運用、保守するための、完全マネージドの、認定の Kubernetes 準拠サービスです。AWS Fargate でポッドを実行できるため、適切なサイズのコンピューティングキャパシティをオンデマンドで提供できます。

開発者や管理者にとって、コンテナ化されたワークロードを実行する際のデバッグオプションを知ることは重要です。このパターンでは、AWS Fargate を使用して Amazon EKS にコンテナをデプロイし、デバッグする手順を順を追って説明します。これには、Amazon EKS ワークロードの作成、デプロイ、アクセス、デバッグ、クリーンアップが含まれます。

前提条件と制限

前提条件

機能制限

  • このパターンでは、開発環境に役立つデバッグ方法を開発者に提供します。実稼働環境のベストプラクティスが示されていません。

  • Windows を実行している場合は、オペレーティングシステム固有のコマンドを使用して環境変数を設定します。

使用している製品バージョン

アーキテクチャ

テクノロジースタック

  • Application Load Balancer

  • Amazon EKS

  • AWS Fargate

ターゲット アーキテクチャ

図に示されているすべてのリソースは、ローカルマシンから発行された eksctlkubectl コマンドを使用してプロビジョニングされます。プライベートクラスターは、プライベート VPC 内のインスタンスから実行する必要があります。

ターゲットアーキテクチャでは、Fargate 起動タイプを使用する EKS クラスターで構成されています。これにより、サーバータイプを指定しなくても、適切なサイズのコンピューティング能力をオンデマンドで提供できます。EKS クラスターには、クラスターノードとワークロードを管理するためのコントロールプレーンがあります。ポッドは、複数のアベイラビリティーゾーンにまたがるプライベート VPC サブネットにプロビジョニングされます。Amazon ECR パブリックギャラリーを参照して NGINX ウェブサーバーのイメージを取得し、クラスターのポッドにデプロイします。

この図表では、 kubectl コマンドを使用して Amazon EKS コントロールプレーンにアクセスする方法と、Application Load Balancer を使用してアプリケーションにアクセスする方法を示しています。

.

  1. AWS クラウド外部のローカルマシンは、Amazon EKS が管理する VPC 内の Kubernetes コントロールプレーンにコマンドを送信します。

  2. Amazon EKS は Fargate プロファイルのセレクターに基づいてポッドをスケジュールします。

  3. ローカルマシンは、ブラウザでApplication Load Balancer の URL を開きます。

  4. Application Load Balancer は、複数のアベイラビリティーゾーンにまたがるプライベートサブネットにデプロイされた Fargate クラスターノードの Kubernetes ポッド間のトラフィックを分割します。

ツール

AWS サービス

  • Amazon Elastic Container Registry (Amazon ECR) は、セキュリティ、スケーラビリティ、信頼性を備えたマネージドコンテナイメージレジストリサービスです。

  • Amazon Elastic Kubernetes Service (Amazon EKS)は、 で Kubernetes を実行する際に役立ちます。独自の Kubernetes コントロールプレーンまたはノードをインストールおよび維持する必要はありません。このパターンでは、eksctl コマンドラインツールを使用して Amazon EKS の Kubernetes クラスターと連携することもできます。

  • AWS Fargate を使用すると、サーバーや Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを管理する必要がないコンテナを実行できます。Amazon Elastic Container Service (Amazon ECS) と組み合わせて使用されます。

  • Elastic Load Balancing (ELB) は、受信するアプリケーションまたはネットワークのトラフィックを複数のターゲットに分散します。例えば、1 つ以上のアベイラビリティゾーンにある Amazon Elastic Compute Cloud (Amazon EC2) インスタンス、コンテナ、および IP アドレス間でトラフィックを分散できます。このパターンでは、Kubernetes ingress 入力がプロビジョニングされるときに、AWS Load Balancer Controller 制御コンポーネントを使用してApplication Load Balancer を作成します。Application Load Balancer は、受信トラフィックを複数のターゲットに分散します。

その他のツール

  • Helm は Kubernetes のオープンソースのパッケージマネージャーです。このパターンでは、Helm を使用して AWS Load Balancer コントローラーをインストールします。

  • Kubernetes は、コンテナ化されたアプリケーションのデプロイ、スケーリング、および管理を自動化するためのオープンソースシステムです。

  • NGINX は高性能なウェブおよびリバースプロキシサーバーです。

エピック

タスク説明必要なスキル

ファイルを作成します。

追加情報 セクションのコードを使用して、次のファイルを作成します。

  • clusterconfig-fargate.yaml

  • nginx-deployment.yaml

  • nginx-service.yaml

  • nginx-ingress.yaml

  • index.html

アプリ開発者、AWS 管理者、AWS DevOps

環境変数を設定する。

注:以前に完了していないタスクが原因でコマンドが失敗した場合、数秒待ってからコマンドを再実行します。

このパターンでは、 clusterconfig-fargate.yaml ファイルに定義されている AWS リージョンとクラスター名を使用します。環境変数と同じ値を設定して、以降のコマンドで参照できるようにします。

export AWS_REGION="us-east-1" export CLUSTER_NAME="my-fargate"
アプリ開発者、AWS DevOps、AWS システム管理者

EKS クラスターを作成します。

clusterconfig-fargate.yaml ファイルの仕様を使用する EKS クラスターを作成するには、次のコマンドを実行します。

eksctl create cluster -f clusterconfig-fargate.yaml

このファイルには、 us-east-1 リージョンで my-fargate-cluster という名前の新しい EKS クラスターと、1 つのデフォルトの Fargate プロファイル (fp-default) をプロビジョニングする ClusterConfig が含まれています。

デフォルトの Fargate プロファイルは 2 つのセレクター( defaultkube-system )で設定されます。

アプリ開発者、AWS DevOps、AWS 管理者

作成したクラスターを確認します。

続いて、次のコマンドを使用してクラスターを再起動します。

eksctl get cluster --output yaml

出力は、以下を返します。

- Name: my-fargate Owned: "True" Region: us-east-1

CLUSTER_NAME を使用して、作成した Fargate プロファイルを確認します。

eksctl get fargateprofile --cluster $CLUSTER_NAME --output yaml

このコマンドは、リソースに関する情報を表示します。この情報を使用して、作成したクラスターを検証します。出力は、以下を返します。

- name: fp-default podExecutionRoleARN: arn:aws:iam::<YOUR-ACCOUNT-ID>:role/eksctl-my-fargate-cluster-FargatePodExecutionRole-xxx selectors: - namespace: default - namespace: kube-system status: ACTIVE subnets: - subnet-aaa - subnet-bbb - subnet-ccc
アプリ開発者、AWS DevOps、AWS システム管理者
タスク説明必要なスキル

NGINX ウェブサーバーを起動します。

NGINX ウェブサーバーのデプロイをクラスターに適用するには、次のコマンドを実行します。

kubectl apply -f ./nginx-deployment.yaml

出力は、以下を返します。

deployment.apps/nginx-deployment created

デプロイには、Amazon ECR 公開ギャラリーから取得した NGINX イメージの 3 つのレプリカが含まれています。イメージはデフォルトの名前空間にデプロイされ、実行中のポッドのポート 80 に公開されます。

アプリ開発者、AWS DevOps、AWS システム管理者

デプロイとポッドを確認します。

(オプション) デプロイを確認します。クラスターのステータスのクエリを実行するには、次のコマンドを使用します。

kubectl get deployment

出力は、以下を返します。

NAME READY UP-TO-DATE AVAILABLE AGE nginx-deployment 3/3 3 3 7m14s

ポッドは Kubernetes 内のデプロイ可能なオブジェクトで、1 つ以上のコンテナが含まれています。すべてのポッドを一覧表示するには、以下のコマンドを使用します。 

kubectl get pods

出力は、以下を返します。

NAME READY STATUS RESTARTS AGE nginx-deployment-xxxx-aaa 1/1 Running 0 94s nginx-deployment-xxxx-bbb 1/1 Running 0 94s nginx-deployment-xxxx-ccc 1/1 Running 0 94s
アプリ開発者、AWS DevOps、AWS 管理者

ローカルデプロイ。

deployment.yaml で指定された 3 つのレプリカから 4 つのレプリカにデプロイをスケールするには、以下のコマンドを使用します。 

kubectl scale deployment nginx-deployment --replicas 4

出力は、以下を返します。

deployment.apps/nginx-deployment scaled
アプリ開発者、AWS DevOps、AWS システム管理者
タスク説明必要なスキル

環境変数を設定する。

クラスターの CloudFormation スタックを記述して、その VPC に関する情報を取得します。

aws cloudformation describe-stacks --stack-name eksctl-$CLUSTER_NAME-cluster --query "Stacks[0].Outputs[?OutputKey==\`VPC\`].OutputValue"

出力は、以下を返します。

[ "vpc-<YOUR-VPC-ID>" ]

VPC ID をコピーし、環境変数としてエクスポートします。

export VPC_ID="vpc-<YOUR-VPC-ID>"
アプリ開発者、AWS DevOps、AWS システム管理者

クラスターサービスアカウントの IAMを設定する

前のエピックから AWS_REGIONCLUSTER_NAME を使用して、クラスター用の IAM Open ID Connect プロバイダーを作成します。

eksctl utils associate-iam-oidc-provider \ --region $AWS_REGION \ --cluster $CLUSTER_NAME \ --approve
アプリ開発者、AWS DevOps、AWS システム管理者

IAM ポリシーをダウンロードして作成します。

ユーザーに代わって AWS API を呼び出すことを許可する、AWS Load Balancer Controller 用の IAM ポリシーをダウンロードします。

curl -o iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy.json

AWS CLI を使用して、AWS アカウントのポリシーを作成します。

aws iam create-policy \ --policy-name AWSLoadBalancerControllerIAMPolicy \ --policy-document file://iam-policy.json

次のような出力が表示されます。

{ "Policy": { "PolicyName": "AWSLoadBalancerControllerIAMPolicy", "PolicyId": "<YOUR_POLICY_ID>", "Arn": "arn:aws:iam::<YOUR-ACCOUNT-ID>:policy/AWSLoadBalancerControllerIAMPolicy", "Path": "/", "DefaultVersionId": "v1", "AttachmentCount": 0, "PermissionsBoundaryUsageCount": 0, "IsAttachable": true, "CreateDate": "<YOUR-DATE>", "UpdateDate": "<YOUR-DATE>" } }

ポリシーの Amazon リソースネーム (ARN)。

export POLICY_ARN=”arn:aws:iam::<YOUR-ACCOUNT-ID>:policy/AWSLoadBalancerControllerIAMPolicy”
アプリ開発者、AWS DevOps、AWS システム管理者

IAM サービスアカウントを作成します

aws-load-balancer-controller 名前空間の kube-system という名前のIAM サービスアカウントを作成する。以前に設定した CLUSTER_NAMEAWS_REGION 、及び POLICY_ARN を使用します。

eksctl create iamserviceaccount \ --cluster=$CLUSTER_NAME \ --region=$AWS_REGION \ --attach-policy-arn=$POLICY_ARN \ --namespace=kube-system \ --name=aws-load-balancer-controller \ --override-existing-serviceaccounts \ --approve

作成を検証します。

eksctl get iamserviceaccount \ --cluster $CLUSTER_NAME \ --name aws-load-balancer-controller \ --namespace kube-system \ --output yaml

出力は、以下を返します。

- metadata: name: aws-load-balancer-controller namespace: kube-system status: roleARN: arn:aws:iam::<YOUR-ACCOUNT-ID>:role/eksctl-my-fargate-addon-iamserviceaccount-ku-Role1-<YOUR-ROLE-ID> wellKnownPolicies: autoScaler: false awsLoadBalancerController: false certManager: false ebsCSIController: false efsCSIController: false externalDNS: false imageBuilder: false
アプリ開発者、AWS DevOps、AWS システム管理者

AWS Load Balancer コントローラをインストールします。

Helm リポジトリを追加します。

helm repo update

Amazon EKS チャートリポジトリを Helm リポジトリに追加します。 

helm repo add eks https://aws.github.io/eks-charts

AWS Load Balancer コントローラー eks-chart で使用されている Kubernetes カスタムリソース定義 (CRD) をバックグラウンドで適用します。

kubectl apply -k "github.com/aws/eks-charts/stable/aws-load-balancer-controller//crds?ref=master"

出力は、以下を返します。

customresourcedefinition.apiextensions.k8s.io/ingressclassparams.elbv2.k8s.aws created customresourcedefinition.apiextensions.k8s.io/targetgroupbindings.elbv2.k8s.aws created

以前に設定した環境変数を使用して Helm チャートをインストールします。

helm install aws-load-balancer-controller eks/aws-load-balancer-controller \ --set clusterName=$CLUSTER_NAME \ --set serviceAccount.create=false \ --set region=$AWS_REGION \ --set vpcId=$VPC_ID \ --set serviceAccount.name=aws-load-balancer-controller \ -n kube-system

出力は、以下を返します。

NAME: aws-load-balancer-controller LAST DEPLOYED: <YOUR-DATE> NAMESPACE: kube-system STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: AWS Load Balancer controller installed!
アプリ開発者、AWS DevOps、AWS システム管理者

サービスを作成します。

nginx-service.yaml ファイルを使用して NGINX ポッドを公開するサービスを作成します。

kubectl apply -f nginx-service.yaml

出力は、以下を返します。

service/nginx-service created
アプリ開発者、AWS DevOps、AWS システム管理者

Kubernetes イングレスリソースを作成します。

nginx-ingress.yaml ファイルを使用して Kubernetes NGINX イングレスを公開するサービスを作成します。

kubectl apply -f nginx-ingress.yaml

出力は、以下を返します。

ingress.networking.k8s.io/nginx-ingress created
アプリ開発者、AWS DevOps、AWS システム管理者

ロードバランサー URL を取得します。

入力情報を取得するには、次のコマンドを使用します。

kubectl get ingress nginx-ingress

出力は、以下を返します。

NAME CLASS HOSTS ADDRESS PORTS AGE nginx-ingress <none> * k8s-default-nginxing-xxx.us-east-1.elb.amazonaws.com 80 80s

出力から ADDRESS (たとえば k8s-default-nginxing-xxx.us-east-1.elb.amazonaws.com ) をコピーし、ブラウザに貼り付けて、index.html ファイルにアクセスします。

アプリ開発者、AWS DevOps、AWS システム管理者
タスク説明必要なスキル

ポッドを選択します。

すべてのポッドを一覧表示し、希望のポッドの名前をコピーします。 

kubectl get pods

出力は、以下を返します。

NAME READY STATUS RESTARTS AGE nginx-deployment-xxxx-aaa 1/1 Running 0 55m nginx-deployment-xxxx-bbb 1/1 Running 0 55m nginx-deployment-xxxx-ccc 1/1 Running 0 55m nginx-deployment-xxxx-ddd 1/1 Running 0 42m

このコマンドは、既存のポッドと追加情報を一覧表示します。

特定のポッドに関心がある場合、関心のあるポッドの名前を POD_NAME 変数に入力するか、環境変数として設定します。それ以外の場合、このパラメーターを省略して、すべてのリソースを検索します。

export POD_NAME="nginx-deployment-<YOUR-POD-NAME>"
アプリ開発者、AWS DevOps、AWS システム管理者

アクセスログの使用

デバッグするポッドからログを取得します。

kubectl logs $POD_NAME
アプリ開発者、AWS システム管理者、AWS DevOps

NGINX ポートを転送します。

ポート転送を使用して NGINX Web サーバにアクセスするためのポッドのポートをローカルマシンのポートにマップします。

kubectl port-forward deployment/nginx-deployment 8080:80

ブラウザで、次の URL を開きます。

http://localhost:8080

port-forward コマンドは、ロードバランサー経由で公開せずに index.html ファイルへのアクセスを提供します。これは、実行中のアプリケーションをデバッグ中にアクセスするのに役に立ちます。ポート転送を停止するには、キーボードコマンド Ctrl+C を押します。

アプリ開発者、AWS DevOps、AWS システム管理者

ポッド内でコマンドを実行します。

現在の index.html ファイルを確認するには、次のコマンドを使用します。 

kubectl exec $POD_NAME -- cat /usr/share/nginx/html/index.html

exec コマンドを使用して、ポッド内で任意のコマンドを直接発行できます。これは実行中のアプリケーションをデバッグするのに役に立ちます。

アプリ開発者、AWS DevOps、AWS システム管理者

ファイルをポッドにコピーします。

このポッドのデフォルト index.html ファイルを削除します。

kubectl exec $POD_NAME -- rm /usr/share/nginx/html/index.html

カスタマイズされたローカルファイル index.html をポッドにアップロードします。

kubectl cp index.html $POD_NAME:/usr/share/nginx/html/

cp コマンドを使用して、任意のポッドにファイルを直接変更または追加できます。

アプリ開発者、AWS DevOps、AWS システム管理者

ポート転送を使用して変更を表示します。

ポートフォワーディングを使用して、このポッドに加えた変更を確認します。

kubectl port-forward pod/$POD_NAME 8080:80

次の URL をブラウザで開きます。

http://localhost:8080

index.html ファイルに適用された変更がブラウザに表示されるはずです。

アプリ開発者、AWS DevOps、AWS システム管理者
タスク説明必要なスキル

ロードバランサーを削除するには、 を参照してください。

入力を削除します。

kubectl delete ingress/nginx-ingress

出力は、以下を返します。

ingress.networking.k8s.io "nginx-ingress" deleted

サービスを削除します。

kubectl delete service/nginx-service

出力は、以下を返します。

service "nginx-service" deleted

ロードバランサーコントローラーを削除します。

helm delete aws-load-balancer-controller -n kube-system

出力は、以下を返します。

release "aws-load-balancer-controller" uninstalled

サービスアカウントを削除します。

eksctl delete iamserviceaccount --cluster $CLUSTER_NAME --namespace kube-system --name aws-load-balancer-controller
アプリ開発者、AWS DevOps、AWS システム管理者

デプロイを削除します。

次のコマンドを使用して  リソースを削除します。

kubectl delete deploy/nginx-deployment

出力は、以下を返します。

deployment.apps "nginx-deployment" deleted
アプリ開発者、AWS DevOps、AWS システム管理者

クラスターを削除します。

次のコマンドを使用して、my-fargate が EKS クラスターのクラスター名を削除します。

eksctl delete cluster --name $CLUSTER_NAME

このコマンドは、関連するすべてのリソースを含むクラスター全体を削除します。

アプリ開発者、AWS DevOps、AWS システム管理者

IAM ポリシーを削除するには

AWS CLI を使用して、以前に作成したポリシーを削除します。

aws iam delete-policy --policy-arn $POLICY_ARN
アプリ開発者、AWS 管理者、AWS DevOps

トラブルシューティング

問題ソリューション

ターゲットのアベイラビリティーゾーンにはクラスターをサポートするのに十分な容量がないというクラスターの作成時のエラーメッセージ が表示されます。次の例に示すようなメッセージが表示されます。

Cannot create cluster 'my-fargate' because us-east-1e, the targeted availability zone, does not currently have sufficient capacity to support the cluster. Retry and choose from these availability zones: us-east-1a, us-east-1b, us-east-1c, us-east-1d, us-east-1f

エラーメッセージの推奨アベイラビリティーゾーンを使用してクラスターを再作成します。clusterconfig-fargate.yaml ファイルの最後の行にアベイラビリティーゾーンのリストを指定します (例: availabilityZones: ["us-east-1a", "us-east-1b", "us-east-1c"] )。

関連リソース

追加情報

clusterconfig-fargate.yaml

apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: my-fargate region: us-east-1 fargateProfiles: - name: fp-default selectors: - namespace: default - namespace: kube-system

nginx-deployment.yaml

apiVersion: apps/v1 kind: Deployment metadata: name: "nginx-deployment" namespace: "default" spec: replicas: 3 selector: matchLabels: app: "nginx" template: metadata: labels: app: "nginx" spec: containers: - name: nginx image: public.ecr.aws/nginx/nginx:latest ports: - containerPort: 80

nginx-service.yaml

apiVersion: v1 kind: Service metadata: annotations: alb.ingress.kubernetes.io/target-type: ip name: "nginx-service" namespace: "default" spec: ports: - port: 80 targetPort: 80 protocol: TCP type: NodePort selector: app: "nginx"

nginx-ingress.yaml

apiVersion: networking.k8s.io/v1 kind: Ingress metadata: namespace: "default" name: "nginx-ingress" annotations: kubernetes.io/ingress.class: alb alb.ingress.kubernetes.io/scheme: internet-facing spec: rules: - http: paths: - path: / pathType: Prefix backend: service: name: "nginx-service" port: number: 80

index.html

<!DOCTYPE html> <html> <body> <h1>Welcome to your customized nginx!</h1> <p>You modified the file on this running pod</p> </body> </html>