このトピックでは、GKE on AWS で AWS Elastic Load Balancer(ELB)を設定する方法について説明します。
LoadBalancer タイプの Service を作成すると、GKE on AWS コントローラは AWS に Classic または Network ELB を構成します。
また、クイックスタートに従って Google Cloud コンソールから外部に公開する Classic ELB を作成したり、AWS Application Load Balancer(ALB)を作成することもできます。
始める前に
GKE on AWS の使用を始める前に、次のことを確認してください。
- 前提条件を満たしている。
- 管理サービスをインストールしている。
- ユーザー クラスタを作成している。
anthos-awsディレクトリからanthos-gkeを使用して、コンテキストをユーザー クラスタに切り替えている。 CLUSTER_NAME はユーザー クラスタ名に置き換えます。cd anthos-aws env HTTPS_PROXY=http://localhost:8118 \ anthos-gke aws clusters get-credentials CLUSTER_NAME
curlコマンドライン ツールまたは同様のツールがインストールされている。
外部または内部ロードバランサの選択
GKE on AWS は、LoadBalancer リソースへのアノテーションに基づいて、外部(パブリック サブネット内)または内部(プライベート サブネット内)のロードバランサを作成します。
外部ロードバランサを選択すると、ノードプールのセキュリティ グループと、サブネットのネットワーク アクセス制御リスト(ACL)で許可されている IP アドレスからアクセスできます。
ロードバランサのタイプの選択
Classic Load Balancer(Classic ELB)と Network Load Balancer(NLB)のどちらを作成するかを選択します。ロードバランサのタイプの違いについては、AWS ドキュメントのロードバランサの種類をご覧ください。
LoadBalancer の作成
ロードバランサを作成するには、Deployment を作成して Service で公開します。
Deployment を作成します。この Deployment のコンテナは、ポート 50001 でリッスンします。次の YAML を
my-deployment-50001.yamlという名前のファイルに保存します。apiVersion: apps/v1 kind: Deployment metadata: name: my-deployment-50001 spec: selector: matchLabels: app: products department: sales replicas: 3 template: metadata: labels: app: products department: sales spec: containers: - name: hello image: "gcr.io/google-samples/hello-app:2.0" env: - name: "PORT" value: "50001"kubectl applyを使用して Deployment を作成します。env HTTPS_PROXY=http://localhost:8118 \ kubectl apply -f my-deployment-50001.yaml次のようにして、3 つの Pod が実行中であることを確認します。
env HTTPS_PROXY=http://localhost:8118 \ kubectl get pods --selector=app=productsDeployment に
LoadBalancerタイプの Service を作成します。パブリック サブネットまたはプライベート サブネットのいずれかに、Classic ELB または Network ELB を作成できます。次のいずれかを選択します。- パブリック サブネット上の Classic ELB
- パブリック サブネット上の NLB
- プライベート サブネット上の Classic ELB
- プライベート サブネット上の NLB
次に、以下のマニフェストを
my-lb-service.yamlという名前のファイルにコピーします。パブリック サブネット上の Classic ELB
apiVersion: v1 kind: Service metadata: name: my-lb-service spec: type: LoadBalancer selector: app: products department: sales ports: - protocol: TCP port: 60000 targetPort: 50001パブリック サブネット上の NLB
アノテーション
service.beta.kubernetes.io/aws-load-balancer-typeをnlbに設定して、NLB を作成します。次の YAML にはこのアノテーションが含まれています。apiVersion: v1 kind: Service metadata: name: my-lb-service annotations: service.beta.kubernetes.io/aws-load-balancer-type: nlb spec: type: LoadBalancer selector: app: products department: sales ports: - protocol: TCP port: 60000 targetPort: 50001プライベート サブネット上の Classic ELB
アノテーション
service.beta.kubernetes.io/aws-load-balancer-internalを"true"に設定して、プライベート LoadBalancer を作成します。次の YAML にはこのアノテーションが含まれています。apiVersion: v1 kind: Service metadata: name: my-lb-service annotations: service.beta.kubernetes.io/aws-load-balancer-internal: "true" spec: type: LoadBalancer selector: app: products department: sales ports: - protocol: TCP port: 60000 targetPort: 50001プライベート サブネット上の NLB
次のようにアノテーションを設定して、プライベート サブネットに NLB を作成します。
service.beta.kubernetes.io/aws-load-balancer-internalを"true"service.beta.kubernetes.io/aws-load-balancer-typeをnlb
次の YAML には、この両方のアノテーションが含まれています。
apiVersion: v1 kind: Service metadata: name: my-lb-service annotations: service.beta.kubernetes.io/aws-load-balancer-internal: "true" service.beta.kubernetes.io/aws-load-balancer-type: nlb spec: type: LoadBalancer selector: app: products department: sales ports: - protocol: TCP port: 60000 targetPort: 50001kubectl applyを使用して Service を作成します。env HTTPS_PROXY=http://localhost:8118 \ kubectl apply -f my-lb-service.yamlkubectl get serviceで Service のホスト名を表示します。env HTTPS_PROXY=http://localhost:8118 \ kubectl get service my-lb-service \ --output jsonpath="{.status.loadBalancer.ingress..hostname}{'\n'}"出力は
elb-id.elb.aws-region.amazonaws.comのようになります。外部に公開されているロードバランサを作成済みで、パブリック VPC サブネットにアクセスできる場合は、
curlを使用してロードバランサに接続できます。external-ip は、前の手順のkubectl get serviceの出力にある IP に置き換えます。curl external-ip:60000出力は次のようになります。
Hello, world! Version: 2.0.0 Hostname: my-deployment-50001-84b6dc5555-zmk7q
クリーンアップ
Service と Deployment を削除するには、kubectl delete を使用します。
env HTTPS_PROXY=http://localhost:8118 \
kubectl delete -f my-lb-service.yaml
env HTTPS_PROXY=http://localhost:8118 \
kubectl delete -f my-deployment-50001.yaml
トラブルシューティング
ロードバランサのエンドポイントにアクセスできない場合は、サブネットのタグ付けを試してください。
次のステップ
クイックスタートに従って Google Cloud コンソールから外部に公開する Classic ELB を作成する。
GKE on Google Cloud のドキュメントで、Service を使用したアプリケーションの公開を確認する。