このページでは、AWS アプリケーション ロードバランサ(ALB)の設定方法について説明します。
GKE on AWS がサポートするほかのタイプのロードバランサについては、ロードバランサの概要をご覧ください。
準備
GKE on AWS で ALB を作成するには、まず次の作業を行う必要があります。
- GKE on AWS クラスタを作成し、
kubectl
を使用してクラスタへのアクセスを構成します。 - クラスタの OIDC プロバイダを AWS に登録します。
概要
クラスタで初めての ALB を作成するには、次の手順を行います。
- ALB をプロビジョニングさせるサブネットを VPC 内で特定し、タグ付けする、またはアノテーションを付けます。
- AWS リソースへのアクセス権を ALB コントローラに付与する AWS のロールを作成します。
- オープンソースの
aws-load-balancer-controller
をインストールします。 - ALB 構成を作成してデプロイします。
これ以降の ALB を作成するには、別の ALB 構成を作成してデプロイするだけです。
アプリケーション ロードバランサを作成する
ALB のサブネットにタグを付ける
ALB を作成する前に、どのサブネットで実行するかを AWS に伝える必要があります。通常の方法は、自動検出プロセスで使用できるようにサブネットを識別するタグを使用して、サブネットにタグ付けすることです。または、Ingress オブジェクトにアノテーションを追加して、実行するサブネットを明示的に一覧表示することもできます。
選択したサブネットを自動検出に利用できるようにタグ付けするには、サービス ロードバランサのサブネットにタグを付けるをご覧ください。
サブネットのリストで Ingress オブジェクトにアノテーションを付けるには、alb.ingress.kubernetes.io/subnets
という名前のアノテーションを Kubernetes Ingress オブジェクトに追加します。アノテーションの値を、サブネット ID またはサブネット名のカンマ区切りのリストに設定します(例: subnet-012345678abcdef,subnet-
abcdef123456789,subnet-123456789abcdef
)。
AWS IAM 権限を作成する
AWS Load Balancer コントローラの IAM ポリシーをダウンロードします。このポリシーは、ロードバランサ コントローラが機能するために必要な権限を列挙します。ポリシーは GitHub で確認できます。 このコマンドは、ポリシーを iam_policy.json
という名前のファイルに保存します。
curl -Lo iam_policy.json \
https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.4.4/docs/install/iam_policy.json
このファイルを使用して、
AWSLoadBalancerControllerIAMPolicy
という名前の IAM ポリシーを作成します。aws iam create-policy \ --policy-name AWSLoadBalancerControllerIAMPolicy \ --policy-document file://iam_policy.json
ロードバランサへのアクセス権を付与する
AWS IAM ロールを作成するの手順に沿って、コントローラのサービス アカウントの AWS IAM ロールを作成します。この手順では、以下の項目を置き換えます。
AWS_POLICY_ARN
: 前の手順で作成した AWSLoadBalancerControllerIAPolicy の ARNKSA_NAME
:"aws-load-balancer-controller"
K8S_NAMESPACE
:"kube-system"
AWS_ROLE_NAME
:"AWSLBControllerRole"
ポリシーの ARN を取得するには、次のコマンドを実行します。
aws iam list-policies \
--query 'Policies[?PolicyName==`AWSLoadBalancerControllerIAMPolicy`].Arn' \
--output text
AWS ロードバランサ コントローラをインストールする
以下の手順を完了するには、次の値を抽出して保存します。これらは後で必要になります。
次のコマンドを実行して、クラスタの UID を確認します。
gcloud container aws clusters describe CLUSTER_NAME \ --location GOOGLE_CLOUD_LOCATION \ --format "value(uid)"
次のコマンドを実行して、クラスタの VPC ID を確認します。
gcloud container aws clusters describe CLUSTER_NAME \ --location GOOGLE_CLOUD_LOCATION \ --format "value(networking.vpcId)"
次のコマンドを実行して、
AWSLBControllerRole
という名前のロールの ARN を確認します。aws iam get-role --role-name AWSLBControllerRole --query Role.Arn --output text
次のコマンドを実行して、クラスタの AWS リージョンを確認します。
gcloud container aws clusters describe CLUSTER_NAME \ --location GOOGLE_CLOUD_LOCATION \ --format "value(awsRegion)"
次のように置き換えます。
GOOGLE_CLOUD_LOCATION
は、クラスタに関連付けられている Google リージョンの名前に置き換えます。CLUSTER_NAME
は、使用するクラスタの名前に置き換えます。
次のコマンドで
cert-manager
をインストールします。kubectl apply \ --validate=false \ -f https://github.com/jetstack/cert-manager/releases/download/v1.10.0/cert-manager.yaml
次のコマンドで
aws-load-balancer-controller
のマニフェストをダウンロードし、ローカル ファイルv2_4_4_full.yaml
に保存します。curl -Lo v2_4_4_full.yaml https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.4.4/v2_4_4_full.yaml
ファイル
v2_4_4_full.yaml
を編集してkind: Deployment
を検索します。Deployment
オブジェクトは、この変更したバージョンに置き換えます。kind: Deployment metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: aws-load-balancer-controller name: aws-load-balancer-controller namespace: kube-system spec: replicas: 1 selector: matchLabels: app.kubernetes.io/component: controller app.kubernetes.io/name: aws-load-balancer-controller template: metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: aws-load-balancer-controller spec: containers: - args: - --cluster-name=CLUSTER_UID - --aws-region=AWS_REGION - --aws-vpc-id=AWS_VPC_ID - --ingress-class=alb - --disable-restricted-sg-rules=true image: amazon/aws-alb-ingress-controller:v2.4.4 env: - name: AWS_ROLE_ARN value: AWS_ROLE_ARN - name: AWS_WEB_IDENTITY_TOKEN_FILE value: /var/run/secrets/aws-load-balancer-controller/serviceaccount/token livenessProbe: failureThreshold: 2 httpGet: path: /healthz port: 61779 scheme: HTTP initialDelaySeconds: 30 timeoutSeconds: 10 name: controller ports: - containerPort: 9443 name: webhook-server protocol: TCP resources: limits: cpu: 200m memory: 500Mi requests: cpu: 100m memory: 200Mi securityContext: allowPrivilegeEscalation: false readOnlyRootFilesystem: true runAsNonRoot: true volumeMounts: - mountPath: /tmp/k8s-webhook-server/serving-certs name: cert readOnly: true - mountPath: /var/run/secrets/aws-load-balancer-controller/serviceaccount name: aws-iam-token readOnly: true priorityClassName: system-cluster-critical securityContext: fsGroup: 1337 serviceAccountName: aws-load-balancer-controller terminationGracePeriodSeconds: 10 volumes: - name: cert secret: defaultMode: 420 secretName: aws-load-balancer-webhook-tls - name: aws-iam-token projected: defaultMode: 420 sources: - serviceAccountToken: audience: sts.amazonaws.com expirationSeconds: 86400 path: token ---
次のように置き換えます。
CLUSTER_UID
: クラスタの UID(例:bbc7d232-21f6-4bb1-90dd-4b064cf8ccf8
)。AWS_VPC_ID
: AWS VPC の ID(例:vpc-1234567890abc
)。AWS_ROLE_ARN
:AWSLBControllerRole
という名前のロールの ARN。AWS_REGION
: クラスタの AWS リージョン(例:us-east-1
)
次のコマンドを使用して、変更したマニフェストをクラスタに適用します。
kubectl apply -f v2_4_4_full.yaml
次のコマンドを使用して、ロードバランサ コントローラが実行されていることを確認します。
kubectl get deployment -n kube-system aws-load-balancer-controller
出力は次のようになり、
aws-load-balancer-controller
Deployment が利用可能であることが示されます。NAME READY UP-TO-DATE AVAILABLE AGE aws-load-balancer-controller 1/1 1 1 51s
サンプルの ALB を作成する
このセクションでは、ゲーム 2048 のリメイクを配信するサンプル ALB を作成する方法を説明します。
次の YAML 構成を
2048.yaml
というファイルにコピーします。この構成により、Kubernetes の Namespace、Service、Deployment が作成されます。Deployment は Ingress ALB を通じて公開されます。apiVersion: v1 kind: Namespace metadata: name: game-2048 --- apiVersion: apps/v1 kind: Deployment metadata: namespace: game-2048 name: deployment-2048 spec: selector: matchLabels: app.kubernetes.io/name: app-2048 replicas: 5 template: metadata: labels: app.kubernetes.io/name: app-2048 spec: containers: - image: alexwhen/docker-2048 imagePullPolicy: Always name: app-2048 ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: namespace: game-2048 name: service-2048 spec: ports: - port: 80 targetPort: 80 protocol: TCP type: NodePort selector: app.kubernetes.io/name: app-2048 --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: namespace: game-2048 name: ingress-2048 annotations: alb.ingress.kubernetes.io/scheme: internet-facing spec: ingressClassName: alb rules: - http: paths: - path: / pathType: Prefix backend: service: name: service-2048 port: number: 80
次のコマンドを使用して、クラスタに構成を適用します。
kubectl apply -f 2048.yaml
次のコマンドを使用して Ingress リソースのステータスを確認します。
kubectl get ingress -n game-2048 ingress-2048
コマンドの出力は次のようになります。
ADDRESS
列には Ingress リソースのエンドポイントが含まれます。NAME CLASS HOSTS ADDRESS PORTS AGE ingress-2048 <none> * k8s-game2048-ingress2-e2c347319a-1195690687.us-west-2.elb.amazonaws.com 80 2m19s ```
ブラウザで ALB エンドポイントに移動します(例:
http://k8s-game2048-ingress2-e2c347319a-1195690687.us-west-2.elb.amazonaws.com
)。2048 ゲームが表示され、ALB ロードバランサが正常にデプロイされて構成されていることが示されます。
クリーンアップ
前の手順で作成したサンプル ALB と Deployment を削除するには、次のコマンドを使用してマニフェストを削除します。
kubectl delete -f 2048.yaml
次のステップ
- Ingress アノテーションについて学習する。
- AWS Load Balancer Controller のドキュメントについて学習する。