このトピックでは、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
を使用して、コンテキストをユーザー クラスタに切り替えている。cd anthos-aws env HTTPS_PROXY=http://localhost:8118 \ anthos-gke aws clusters get-credentials CLUSTER_NAME
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=products
Deployment に
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: 50001
kubectl apply
を使用して Service を作成します。env HTTPS_PROXY=http://localhost:8118 \ kubectl apply -f my-lb-service.yaml
kubectl 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 Console から外部に公開する Classic ELB を作成する。
GKE on Google Cloud のドキュメントで Service を使用したアプリケーションの公開を確認する。