メインコンテンツまでスキップ

アプリケーションの更新

新しいリソースが作成または更新されると、アプリケーション設定はこれらの新しいリソースを利用するために調整する必要があることがよくあります。Kubernetesでは、環境変数は設定を保存するための一般的な選択肢であり、デプロイメントを作成する際にcontainer specenvフィールドを通じてコンテナに渡すことができます。

これを実現するための主な方法は2つあります:

  1. Configmaps:これはKubernetesのコアリソースで、環境変数やテキストフィールド、その他のアイテムなどの設定要素をキーバリュー形式でポッドスペックに渡すことができます。

  2. Secrets:これはConfigmapsに似ていますが、機密情報を扱うことを意図しています。Secretsはデフォルトでは暗号化されていないことに注意してください。

ACK FieldExport カスタムリソースは、ACKリソースのコントロールプレーンの管理と、それらのリソースの_プロパティ_をアプリケーションで使用することの間のギャップを埋めるように設計されています。ACKリソースから任意のspecまたはstatusフィールドをKubernetes ConfigMapまたはSecretにエクスポートするようにACKコントローラを設定します。これらのフィールドは、値が変更されると自動的に更新され、ConfigMapまたはSecretをKubernetesポッドに環境変数としてマウントできます。

このラボでは、カートコンポーネントのConfigMapを直接更新します。ローカルDynamoDBを指すように設定を削除し、ACKによって作成されたDynamoDBテーブルの名前を使用します:

~/environment/eks-workshop/modules/automation/controlplanes/ack/app/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../../../../base-application/carts
patches:
- path: carts-serviceAccount.yaml
configMapGenerator:
- name: carts
namespace: carts
env: config.properties
behavior: replace
options:
disableNameSuffixHash: true

また、カートPodにDynamoDBサービスにアクセスするための適切なIAM権限を提供する必要があります。IAMロールはすでに作成されており、IAM Roles for Service Accounts(IRSA)を使用してこれをカートPodsに適用します:

~/environment/eks-workshop/modules/automation/controlplanes/ack/app/carts-serviceAccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: carts
namespace: carts
annotations:
eks.amazonaws.com/role-arn: ${CARTS_IAM_ROLE}

IRSAの仕組みについて詳しく知るには、こちらをご覧ください。

この新しい設定を適用しましょう:

~$kubectl kustomize ~/environment/eks-workshop/modules/automation/controlplanes/ack/app \
| envsubst | kubectl apply -f-

新しいConfigMapの内容を取り込むためにcartsのPodsを再起動する必要があります:

~$kubectl rollout restart -n carts deployment/carts
deployment.apps/carts restarted
~$kubectl rollout status -n carts deployment/carts --timeout=40s
Waiting for deployment "carts" rollout to finish: 1 old replicas are pending termination...
deployment "carts" successfully rolled out

アプリケーションが新しいDynamoDBテーブルで動作していることを確認するために、ブラウザを通じてそれと対話することができます。サンプルアプリケーションをテスト用に公開するためにNLBが作成されています:

~$LB_HOSTNAME=$(kubectl -n ui get service ui-nlb -o jsonpath='{.status.loadBalancer.ingress[*].hostname}{"\n"}')
~$echo "http://$LB_HOSTNAME"
http://k8s-ui-uinlb-647e781087-6717c5049aa96bd9.elb.us-west-2.amazonaws.com
備考

このコマンドを実行すると、新しいネットワークロードバランサーエンドポイントがプロビジョニングされるため、実際のエンドポイントは異なります。

ロードバランサーのプロビジョニングが完了するまで待つには、次のコマンドを実行できます:

~$wait-for-lb $(kubectl get service -n ui ui-nlb -o jsonpath="{.status.loadBalancer.ingress[*].hostname}{'\n'}")

ロードバランサーがプロビジョニングされたら、URLをWebブラウザに貼り付けてアクセスできます。Webストアのユーザーインターフェイスが表示され、ユーザーとしてサイト内を移動することができます。

http://k8s-ui-uinlb-a9797f0f61.elb.us-west-2.amazonaws.com

Cartsモジュールが確かに先ほどプロビジョニングしたDynamoDBテーブルを使用していることを確認するために、カートにいくつかのアイテムを追加してみてください。

これらのアイテムがDynamoDBテーブルにも存在することを確認するには、次のコマンドを実行します:

~$aws dynamodb scan --table-name "${EKS_CLUSTER_NAME}-carts-ack"

おめでとうございます!KubernetesのAPIを離れることなく、AWSリソースの作成に成功しました!