このトピックでは、自己管理型KubernetesクラスターでApplication Load Balancer (ALB) Ingressを作成する方法について説明します。 これにより、KubernetesクラスターはALBを使用できます。
シナリオ
以下のシナリオは、例として使用される。 Alibaba Cloudリソースに基づいてセルフマネージドKubernetesクラスターを作成し、ALB Ingressを使用してクラスターにリクエストを転送します。
自己管理Kubernetesクラスターにalb-ingress-controllerをデプロイし、ingressとServicesを作成できます。 alb-ingress-controllerは、Kubernetesクラスターの設定に基づいて、転送ルールとしてingressをALBに同期します。 alb-ingress-controllerは、クラスターのAPIサーバーをリッスンすることで、以降のingressの変更も監視し、変更をALBに同期します。 変更が同期された後、ALBはクラスター内の特定のポッドにリクエストを転送します。 詳細については、「ALB Ingressの概要」をご参照ください。
使用上の注意
Flannelなどのオーバーレイネットワークプラグインを使用する場合、ALB IngressのバックエンドサービスはNodePortまたはLoadBalancerタイプである必要があります。
AlbConfigs、名前空間、Ingress、およびServicesの名前は、aliyunで始めることはできません。
前提条件
バージョンが1.20以降のセルフマネージドKubernetesクラスターがAlibaba Cloud上に作成されます。 kubectlを使用してクラスターに接続できます。 kubectlをダウンロードしてインストールする方法の詳細については、「kubectlのインストールと設定」をご参照ください。
クラスターはSNATを使用してインターネットにアクセスできます。 詳細については、「インターネットNATゲートウェイのSNAT機能を使用したインターネットへのアクセス」をご参照ください。
自己管理クラスターにコントローラーイメージを使用するには、次の情報に注意してください。
プライベートイメージを使用する場合は、ソースコードからコントローラをデプロイしますの情報に基づいてイメージをコンパイルおよびアップロードできます。
一般的なx86アーキテクチャを使用するクラスターは、Alibaba Cloudのオープンソースイメージをサポートしています。
手順
次の手順では、ファイルを変更する必要があります。 ファイルとファイルの目的を次の表に示します。
ステップ | ファイル | 目的 |
load-balancer-controller.yaml テンプレートに基づいて変更されました。 | alb-ingress-controllerのデプロイに使用します。 | |
alb.yaml 作成および変更。 | AlbConfigとIngressClassを作成するために使用されます。 リソースを作成すると、ALBインスタンスが作成されます。 | |
test-service.yaml 作成および変更。 | テストサービスの展開に使用します。 | |
test-ingress.yaml 作成および変更。 | Ingressの作成に使用します。 |
ステップ1: alb-ingress-controllerのデプロイ
インターネットサービスプロバイダー (ISP) のネットワーク品質が悪い場合、展開イメージをプルできないことがあります。 この問題を防ぐには、プライベートイメージを使用できます。 プライベートイメージファイルをコンパイルおよびアップロードする方法の詳細については、 ソースコードからコントローラをデプロイする方法をご参照ください。
このトピックでは、alb-ingress-controllerはInClusterモードでデプロイされています。 サービス、エンドポイント、およびノードで権限を設定し、load-balancer-controller.yamlを使用してalb-ingress-controllerをデプロイできます。 サービスアカウント、Deployment、およびConfigMapがプリセットされています。 ビジネス要件に基づいて変更するだけです。
変更します。Modify theload-balancer-controller.yamlファイルを作成し、展開のイメージを使用可能なイメージアドレスに変更します。
load-balancer-controller.yamlは、alb-ingress-controllerのデプロイに使用されます。
変更の前に:
image: ${path/to/your/image/registry}
変更後:
image: alibabacloudslb/alibaba-load-balancer-controller:v1.2.0 #A compiled image that is compatible with the x86 architecture.
load-balancer-controller.yamlファイルを変更し、AccessKey IDとAccessKeyシークレットをConfigMapファイルに設定します。
apiVersion: v1 kind: ConfigMap metadata: name: load-balancer-config namespace: kube-system data: cloud-config.conf: |- { "Global": { "AccessKeyID": "VndV***", # Base64 encoding is required. "AccessKeySecret": "UWU0NnUyTFdhcG***" # Base64 encoding is required. } }
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
次のコマンドを実行して結果を確認します。
kubectl -n kube-system get all | grep load-balancer
次の図に示すように、ポッドのステータスは [実行中] で、alb-ingress-controllerがデプロイされていることを示します。
ステップ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-test is the name of the ALB instance. addressType: Internet # Intranet specifies an internal-facing ALB instance. Internet specifies an Internet-facing ALB instance. zoneMappings: - vSwitchId: vsw-wz9e2usil7e5an1xi**** # vSwitches in at least two zones must be specified. - 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 # The AlbConfig.
説明次のパラメータに注意してください。
albconfig.spec.config.addressType: ALBインスタンスのネットワークタイプ。 有効な値:
Internet (デフォルト): インターネット向けALBインスタンス。 インターネット接続のALBインスタンスを作成すると、各ゾーンにパブリックIPアドレスとプライベートIPアドレスが割り当てられます。 インターネット接続ALBインスタンスはelastic IPアドレス (EIP) を使用して、インターネット経由でサービスを提供します。 EIPのインスタンス料金と帯域幅またはデータ転送料金が課金されます。
EIPは、インターネット経由でサービスを提供し、ALBインスタンスをインターネットに公開するために使用されます。
プライベートIPアドレスにより、仮想プライベートクラウド (VPC) のECS (Elastic Compute Service) インスタンスはALBインスタンスにアクセスできます。
イントラネット: 内部に面したALBインスタンス。 内部対応のALBインスタンスを作成すると、各ゾーンにプライベートIPアドレスが割り当てられます。 ALBインスタンスには、内部ネットワーク経由でのみアクセスできます。
spec.config.zoneMappings: ALB IngressのvSwitchのID。 異なるゾーンに少なくとも2つのvSwitchを指定する必要があります。 ゾーンはALBでサポートされている必要があります。 ALBでサポートされているリージョンとゾーンの詳細については、「サポートされているリージョンとゾーン」をご参照ください。
kubectlを使用してクラスターに接続し、次のコマンドを実行してalb.yamlファイルをデプロイ用に送信します。
kubectl apply -f alb.yaml
期待される出力:
AlbConfig.alibabacloud.com/alb-demo create ingressclass.networking.k8s.io/alb created
かどうかを確認して下さいALBインスタンスが作成されます。
方法1: 次のコマンドを実行して、ALBインスタンスのIDを照会します。
kubectl get albconfig alb-demo
方法2: ALBコンソールにログインし、ALBコンソールでALBインスタンスを表示します。
説明albコンソールにログインするには、手順1: ALB-ingress-controllerのデプロイのConfigMapファイルで設定されたAlibaba Cloudアカウントを使用する必要があります。
手順3: テストアプリケーションの展開
このトピックでは、テストイメージを使用して展開を作成し、展開を使用してテストアプリケーションを展開します。
test-service.yamlという名前のファイルを作成し、次のコンテンツをファイルにコピーします。
test-service.yamlは、test01とtest02という名前の2つのデプロイメントと、test01とtest02という名前の2つのサービスをデプロイするために使用されます。
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 "test01" created service "test01-service" created deployment "test02" created service "test02-service" created
次のコマンドを実行して、テストサービスがデプロイされていることを確認します。
kubectl get svc,deploy
次のレスポンスを受け取った場合、テストサービスがデプロイされます。
ステップ4: Ingressを作成する
Ingressは、ALBインスタンスの転送ルールに対応します。 このトピックでは、Ingressはパスに基づいてリクエストを転送します。 詳細については、「ALB Ingressユーザーガイド」をご参照ください。
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 "test-ingress" created
次のコマンドを実行して、Ingressが作成されていることを確認します。
kubectl get ingress
次のレスポンスが返されると、Ingressが作成されます。
ステップ5: 結果を確認する
カスタムドメイン名を使用したサービスへのアクセス
CNAMEレコードを作成して、カスタムドメイン名を作成したALBインスタンスのドメイン名にマップします。 詳細については、「ALBインスタンスへのCNAMEレコードの追加」をご参照ください。
この例では、カスタムドメイン名
demo.domain.ingress.top
がALBインスタンスのパブリックドメイン名にマップされています。次のコマンドを実行して、ALBインスタンスを使用してtest01という名前のサービスにアクセスします。
curl http://demo.domain.ingress.top/test01
次のコマンドを実行して、ALBインスタンスを使用してtest02という名前のサービスにアクセスします。
curl http://demo.domain.ingress.top/test02
ご質問がある場合は、DingTalkグループ31945843に参加してテクニカルサポートを受けてください。
関連ドキュメント
ALB Ingressの概要と機能:
ソースコードのドキュメント: