このトピックでは、Alibaba Cloud 上で実行されるセルフマネージド Kubernetes クラスターで ALB イングレスを使用し、Application Load Balancer (ALB) によってトラフィックを管理する方法について説明します。
シナリオ例
このトピックでは、次の図に示すシナリオを使用します。このシナリオでは、Alibaba Cloud 上で実行されるセルフマネージド Kubernetes クラスターが ALB イングレスを使用してリクエストをルーティングします。
セルフマネージド Kubernetes クラスターに alb-ingress-controller をデプロイし、Ingress および Service リソースを作成できます。alb-ingress-controller は Ingress の設定を転送ルールとして ALB インスタンスに同期します。また、クラスターの API サーバーで Ingress の変更を監視し、更新内容を ALB インスタンスに同期します。ALB インスタンスはその後、クラスター内の対応する Pod にトラフィックを動的にルーティングします。詳細については、「ALB ingress management」をご参照ください。

注意事項
-
Flannel などのオーバーレイネットワークプラグインを使用する場合、ALB イングレスのバックエンド Service は NodePort Service または LoadBalancer Service である必要があります。
-
AlbConfig、Namespace、Ingress、Service リソースの名前は、
aliyunで始めることはできません。
前提条件
-
Alibaba Cloud 上で実行されるセルフマネージド Kubernetes クラスター (v1.20 以降) を用意していること。kubectl を使用してクラスターに接続できること。kubectl のダウンロードとインストール方法については、「Install and set up kubectl」をご参照ください。
-
セルフマネージドクラスターでインターネットアクセスを有効化するために、SNAT を設定していること。詳細については、「Use the SNAT feature of an Internet NAT gateway to access the Internet」をご参照ください。
-
セルフマネージドクラスターでコントローラーイメージを使用する場合は、次の点を考慮してください。
-
プライベートイメージを使用する場合は、Deploy the controller from source code の手順に従ってコンパイルし、アップロードできます。
-
汎用的な x86 アーキテクチャのクラスターでは、Alibaba Cloud が提供するパブリックイメージをテスト用に使用できます。
-
操作手順

次の手順では複数のファイルを変更します。以下の表に、各ファイルの目的を示します。
|
ステップ |
ファイル名 |
目的 |
|
load-balancer-controller.yaml テンプレートから変更 |
alb-ingress-controller をデプロイするため |
|
|
alb.yaml 作成して変更 |
AlbConfig および IngressClass リソースを作成するため (これにより ALB インスタンスが自動的に作成されます) |
|
|
test-service.yaml 作成して変更 |
テスト Service をデプロイするため |
|
|
test-ingress.yaml 作成して変更 |
Ingress を作成するため |
ステップ 1:alb-ingress-controller のデプロイ
ISP のネットワーク問題により、Deployment イメージのプルが失敗する場合があります。これを回避するには、プライベートイメージを使用できます。Deploy the controller from source code の手順に従ってコンパイルし、アップロードしてください。
このトピックでは、alb-ingress-controller は InCluster モードで起動します。Service、endpoint、node リソースを watch するための権限を構成した後、load-balancer-controller.yaml ファイルを使用して alb-ingress-controller をデプロイできます。必要な ServiceAccount、Deployment、ConfigMap は事前に構成されています。環境に合わせて変更するだけで使用できます。
-
load-balancer-controller.yaml ファイルを変更し、Deployment のイメージをアクセス可能なイメージアドレスに変更します。
load-balancer-controller.yamlファイルは、alb-ingress-controller をデプロイするために使用します。変更前:
image: ${path/to/your/image/registry}変更後:
image: alibabacloudslb/alibaba-load-balancer-controller:v1.2.0 # x86 向けにコンパイルされたイメージ。 -
load-balancer-controller.yamlファイルを変更し、ConfigMap に AccessKey ID と AccessKey Secret を構成します。apiVersion: v1 kind: ConfigMap metadata: name: load-balancer-config namespace: kube-system data: cloud-config.conf: |- { "Global": { "AccessKeyID": "<YOUR_ACCESS_KEY_ID>", # Base64 エンコードが必要です。 "AccessKeySecret": "<YOUR_ACCESS_KEY_SECRET>" # Base64 エンコードが必要です。 } } -
kubectl を使用してクラスターに接続し、次のコマンドを実行して、変更後の
load-balancer-controller.yamlファイルを適用します。kubectl apply -f load-balancer-controller.yaml想定される出力:
clusterrole.rbac.authorization.k8s.io/system:load-balancer-controller created serviceaccount/load-balancer-controller created clusterrolebinding.rbac.authorization.k8s.io/system:load-controller-manager created configmap/load-balancer-config created deployment.apps/load-balancer-controller created -
次のコマンドを実行し、alb-ingress-controller のデプロイを確認します。
kubectl -n kube-system get all | grep load-balancer次の出力は、Pod が
Running状態であることを示しています。これは、デプロイが成功したことを示します。[root@iZ2ze9xxx uoZ test]# kubectl -n kube-system get all | grep load-balancer pod/load-balancer-controller-67985dd48d-qtgl8 1/1 Running 0 61d deployment.apps/load-balancer-controller 1/1 1 1 62d replicaset.apps/load-balancer-controller-67985dd48d 1 1 1 62d
ステップ 2:AlbConfig および IngressClass リソースの作成
AlbConfig および IngressClass リソースを作成すると、ALB インスタンスが自動的に作成されます。
-
alb.yaml という名前のファイルを作成し、次の内容をコピーして貼り付けます。
alb.yamlファイルは、AlbConfig および IngressClass リソースの作成に使用します。apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb-demo spec: config: name: alb-test # ALB インスタンスの名前。 addressType: Internet # インターネット向けの場合は 'Internet'、プライベートの場合は 'Intranet' を使用します。 zoneMappings: - vSwitchId: vsw-wz9e2usil7e5an1xi**** # 少なくとも 2 つのゾーンの vSwitch ID を指定します。 - vSwitchId: vsw-wz92lvykqj1siwvif**** listeners: - port: 80 protocol: HTTP --- apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: alb spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: alb-demo # 参照される AlbConfig リソース。説明次のパラメーターに注意してください:
-
albconfig.spec.config.addressType:インスタンスのネットワークタイプ。有効な値:
-
Internet (デフォルト):インターネット向けインスタンスを作成します。各ゾーンにパブリック IP とプライベート IP が割り当てられます。インターネット向け ALB インスタンスは、Elastic IP アドレス (EIP) を使用してインターネット経由でサービスを提供します。インスタンス料金と EIP のデータ転送料金が課金されます。
-
EIP は ALB インスタンスへのパブリックなインターネットアクセスを提供します。
-
プライベート IP を使用すると、同一 VPC 内の ECS インスタンスから ALB インスタンスにアクセスできます。
-
-
Intranet:プライベートインスタンスを作成します。各ゾーンにプライベート IP が割り当てられます。ALB インスタンスは Alibaba Cloud ネットワーク内からのみアクセス可能で、インターネットからは到達できません。
-
-
spec.config.zoneMappings:ALB イングレスの vSwitch ID を指定します。異なるゾーンから少なくとも 2 つの vSwitch ID を指定する必要があります。指定する vSwitch は、現在の ALB インスタンスでサポートされているゾーンに存在している必要があります。ALB でサポートされているリージョンとゾーンの詳細については、「Supported regions and zones」をご参照ください。
-
-
kubectl を使用してクラスターに接続し、次のコマンドを実行して
alb.yamlファイルを適用します。kubectl apply -f alb.yaml想定される出力:
AlbConfig.alibabacloud.com/alb-demo created ingressclass.networking.k8s.io/alb created -
ALB インスタンスが作成されたことを確認します。
-
方法 1:次のコマンドを実行して ALB インスタンス ID を確認します。
kubectl get albconfig alb-demo[root@i-xxx nuoZ test]# kubectl get albconfig alb-demo NAME ALBID DNSNAME PORT&PROTOCOL CERTID AGE alb-demo alb-3lzokczr3c9guq7zz7 alb-3xxx.com 84s -
方法 2:ALB console にログインし、作成された ALB インスタンスを確認します。
説明ステップ 1:alb-ingress-controller のデプロイ の ConfigMap で構成した Alibaba Cloud アカウントでコンソールにログインする必要があります。
-
ステップ 3:テストアプリケーションのデプロイ
このセクションでは、テストイメージを使用して Deployment リソースを作成し、テストアプリケーションをデプロイする方法を説明します。
-
test-service.yaml という名前のファイルを作成し、次の内容をコピーして貼り付けます。
test-service.yamlファイルは、test01とtest02という名前の 2 つの Deployment と、test01-serviceとtest02-serviceという名前の 2 つの Service をデプロイするために使用します。apiVersion: apps/v1 kind: Deployment metadata: name: test01 spec: replicas: 2 selector: matchLabels: app: test01 template: metadata: labels: app: test01 spec: containers: - name: test01 image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginxdemos:latest ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: test01-service spec: ports: - port: 80 targetPort: 80 protocol: TCP selector: app: test01 type: NodePort --- apiVersion: apps/v1 kind: Deployment metadata: name: test02 spec: replicas: 1 selector: matchLabels: app: test02 template: metadata: labels: app: test02 spec: containers: - name: test02 image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginxdemos:latest ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: test02-service spec: ports: - port: 80 targetPort: 80 protocol: TCP selector: app: test02 type: NodePort -
kubectl を使用してクラスターに接続し、次のコマンドを実行して
test-service.yamlファイルを適用します。kubectl apply -f test-service.yaml想定される出力:
deployment.apps/test01 created service/test01-service created deployment.apps/test02 created service/test02-service created -
次のコマンドを実行し、テスト Service が正常にデプロイされたことを確認します。
kubectl get svc,deploy次の出力は、テスト Service が正常にデプロイされたことを示します。
[root@iZ2z***uoZ test]# kubectl get svc,deploy NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/cloud-nodeport NodePort 10.xxx.122 <none> 80:31310/TCP 63d service/kubernetes ClusterIP 10.xxx.1 <none> 443/TCP 63d service/test01-service NodePort 10.xxx.121 <none> 80:31254/TCP 9s service/test02-service NodePort 10.xxx.118 <none> 80:30337/TCP 9s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/openresty-deployment 2/2 2 2 63d deployment.apps/test01 2/2 2 2 9s deployment.apps/test02 1/1 1 1 9s
ステップ 4:Ingress の作成
Ingress は、ALB インスタンスの転送ルールに対応します。このトピックではパスベースルーティングを使用します。高度な機能の詳細については、「ALB ingress user guide」をご参照ください。
-
test-ingress.yaml という名前のファイルを作成し、次の内容をコピーして貼り付けます。
test-ingress.yamlファイルは、Ingress を作成するために使用します。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: test-ingress spec: ingressClassName: alb rules: - host: demo.domain.ingress.top http: paths: - path: /test01 pathType: Prefix backend: service: name: test01-service port: number: 80 - path: /test02 pathType: Prefix backend: service: name: test02-service port: number: 80 -
kubectl を使用してクラスターに接続し、次のコマンドを実行して
test-ingress.yamlファイルを適用します。kubectl apply -f test-ingress.yaml想定される出力:
ingress.networking.k8s.io/test-ingress created -
次のコマンドを実行し、
test-ingressリソースが作成されたことを確認します。kubectl get ingress次の出力は、
test-ingressリソースが正常に作成されたことを示します。[root@iZ2zxxx test]# kubectl get ingress NAME CLASS HOSTS ADDRESS PORTS AGE test-ingress alb demo.domain.ingress.top alb-xxx.cn-beijing.alb.aliyuncs.com 80 19s
ステップ 5:結果の確認
ドメイン名によるアクセス
-
ALB インスタンスの DNS 名にドメイン名をマッピングするため、CNAME レコードを作成します。 詳細については、「Configure a CNAME record for an ALB instance」をご参照ください。
この例では、カスタムドメイン名
demo.domain.ingress.topを、ALB インスタンスのパブリック DNS 名にマッピングすると仮定します。 -
次のコマンドを実行し、ALB インスタンス経由で
test01Service にアクセスします。curl http://demo.domain.ingress.top/test01NGINX のバックエンド Pod から、Server address (
10.xxx.xxx.xxx:80)、Server name (test01-648bf46944-kvlhj)、Date (07/Nov/2022:08:16:35 +0000)、URI (/test01) などの詳細を含むレスポンスが返されます。これは、Ingress がリクエストをtest01Service のバックエンド Pod に正しくルーティングしたことを示します。 -
次のコマンドを実行し、ALB インスタンス経由で
test02Service にアクセスします。curl http://demo.domain.ingress.top/test02コマンドを実行するとNGINXのテストページが返され、Server addressが
10.xxx.20:80、Server nameがtest02-76d96f7b8d-6mtnn、URIが/test02であることが表示されます。これは、Ingress がリクエストをtest02Service のバックエンド Pod に正しくルーティングしたことを示します。
ご不明点がある場合は、ALB Customer Group (DingTalk ID: 31945843) に参加してサポートを受けてください。
関連ドキュメント
ALB イングレスの概要と機能: