Application Load Balancer (ALB) 向けの ACK One マルチクラスターゲートウェイは、gRPC バックエンドサービスをサポートしています。このトピックでは、マルチクラスターゲートウェイを使用して gRPC サービスにトラフィックをルーティングする方法について説明します。
前提条件
Application Load Balancer (ALB) サービスが有効化されていること。
フリート管理機能が有効になっていること。
ACK One フリートインスタンスが、そのインスタンスと同じ VPC にデプロイされている 2 つの ACK クラスターに関連付けられていること。詳細については、「関連付けられたクラスターの管理」をご参照ください。
Distributed Cloud Container Platform for Kubernetes (ACK One) コンソールでフリートインスタンスの kubeconfig ファイルを取得し、kubectl クライアントがフリートインスタンスに接続されていること。
grpcurl ツールがインストールされていること。
信頼されたデジタル証明書があること。デジタル証明書は、次のいずれかの方法で取得できます:
Alibaba Cloud Certificate Management Service から証明書を購入する。詳細については、「商用証明書の購入」をご参照ください。
他の認証局 (CA) から証明書を購入する。
自己署名証明書を生成する。詳細については、「ステップ 1」をご参照ください。
重要ブラウザーとクライアントは、デフォルトでは自己署名証明書を信頼しません。これにより、ユーザーがサービスにアクセスする際にセキュリティ警告が表示される場合があります。このトピックの自己署名証明書はデモ目的のみです。本番環境では使用しないでください。すでに証明書をお持ちの場合は、ステップ 2 に進んでください。
ステップ 1:自己署名証明書の生成 (任意)
証明書がない場合は、このステップに従って自己署名証明書を生成します。この例では、証明書のドメイン名として grpc.example.com を使用します。ALB インスタンスの証明書を設定する方法の詳細については、「暗号化通信のための HTTPS 証明書の設定」をご参照ください。このトピックでは、証明書は Secret として保存されます。
次の内容を作成し、
/tmp/openssl.cnfファイルにコピーします。[ req ] #default_bits = 2048 #default_md = sha256 #default_keyfile = privkey.pem distinguished_name = req_distinguished_name attributes = req_attributes req_extensions = v3_req [ req_distinguished_name ] countryName = Country Name (2 letter code) countryName_min = 2 countryName_max = 2 stateOrProvinceName = State or Province Name (full name) localityName = Locality Name (eg, city) 0.organizationName = Organization Name (eg, company) organizationalUnitName = Organizational Unit Name (eg, section) commonName = Common Name (eg, fully qualified host name) commonName_max = 64 emailAddress = Email Address emailAddress_max = 64 [ req_attributes ] challengePassword = A challenge password challengePassword_min = 4 challengePassword_max = 20 [v3_req] # Extensions to add to a certificate request basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment subjectAltName = @alt_names [alt_names] DNS.1 = grpc.example.com
次のコマンドを実行して、証明書リクエストに署名します。
openssl req -new -nodes -keyout grpc.key -out grpc.csr -config /tmp/openssl.cnf -subj "/C=CN/ST=浙江省/L=杭州市/O=AlibabaCloud/OU=ContainerService/CN=grpc.example.com"次のコマンドを実行して、証明書に署名できます。
openssl x509 -req -days 3650 -in grpc.csr -signkey grpc.key -out grpc.crt -extensions v3_req -extfile /tmp/openssl.cnfコマンドの実行後、証明書ファイル
grpc.crtと秘密鍵ファイルgrpc.keyが作成されます。次のコマンドを実行して、証明書を
gateway-demo名前空間にgrpc-secretという名前の Secret として追加します。kubectl create secret tls grpc-secret --key grpc.key --cert grpc.crt -ngateway-demo # grpc.key をご自身の秘密鍵ファイルに、grpc.crt をご自身の証明書ファイルに置き換えてください。
ステップ 2:複数クラスターへの gRPC サービスのデプロイ
ACK One は、マルチクラスター GitOps とマルチクラスターアプリケーション配布をサポートしており、複数クラスターにアプリケーションをデプロイできます。詳細については、「GitOps クイックスタート」、「マルチクラスターアプリケーションの作成」、および「アプリケーション配布クイックスタート」をご参照ください。このトピックでは、GitOps を使用したマルチクラスターアプリケーション配布の例を示します。
をクリックして、[マルチクラスターアプリケーションの作成 - GitOps] ページに移動します。
[YAML から作成] タブで、次のサンプル YAML コンテンツをコンソールにコピーします。次に、[OK] をクリックしてアプリケーションをデプロイします。
説明次の YAML コンテンツは、関連付けられたすべてのクラスターの
gateway-demo名前空間にアプリケーションをデプロイします。[クイック作成] タブで特定のクラスターを選択することもできます。選択内容は [YAML から作成] タブのコンテンツと同期されます。gateway-demo名前空間が存在しない場合は、作成してください。
apiVersion: argoproj.io/v1alpha1 kind: ApplicationSet metadata: name: appset-grpc-demo namespace: argocd spec: template: metadata: name: '{{.metadata.annotations.cluster_name}}-grpc' namespace: argocd spec: destination: name: '{{.name}}' namespace: gateway-demo project: default source: repoURL: https://github.com/ivan-cai/gitops-demo.git path: manifests/directory/grpc targetRevision: main syncPolicy: automated: {} syncOptions: - CreateNamespace=true generators: - clusters: selector: matchExpressions: - values: - cluster key: argocd.argoproj.io/secret-type operator: In - values: - in-cluster key: name operator: NotIn goTemplateOptions: - missingkey=error syncPolicy: preserveResourcesOnDeletion: false goTemplate: true
ステップ 3:ALB マルチクラスターゲートウェイと Ingress の作成
ACK One ALB マルチクラスターゲートウェイを作成するには、ACK One フリートに AlbConfig オブジェクトを作成します。次に、クラスターをゲートウェイに関連付けます。gRPC サービスには HTTPS プロトコルが必要なため、リスナーに HTTPS ポートを追加する必要があります。この例では、ポート 443 を使用します。
ACK One フリートを含む VPC から 2 つの vSwitch の ID を取得します。
次の内容で
gateway.yamlファイルを作成します。説明${vsw-id1}と${vsw-id2}を前のステップで取得した vSwitch ID に置き換えます。${cluster1}と${cluster2}を関連付けるクラスターの ID に置き換えます。${cluster1}と${cluster2}クラスターのセキュリティグループで、すべてのポートで vSwitch の CIDR ブロックからのトラフィックを許可するインバウンドルールを作成します。
apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: ackone-gateway-demo annotations: # 関連付けられたクラスターを ALB マルチクラスターインスタンスに追加してトラフィックを処理します。 alb.ingress.kubernetes.io/remote-clusters: ${cluster1},${cluster2} spec: config: name: one-alb-demo addressType: Internet addressAllocatedMode: Fixed zoneMappings: - vSwitchId: ${vsw-id1} - vSwitchId: ${vsw-id2} listeners: - port: 8001 protocol: HTTP - port: 443 protocol: HTTPS --- apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: alb spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: ackone-gateway-demo次の内容で Ingress を作成します。
説明Ingress は
alb.ingress.kubernetes.io/backend-protocol: grpcアノテーションと、対応するalb.ingress.kubernetes.io/listen-portsアノテーションを指定する必要があります。また、ステップ 1 で作成された証明書を含む Secret を参照する必要があります。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: alb.ingress.kubernetes.io/listen-ports: | [{"HTTPS": 443}] alb.ingress.kubernetes.io/backend-protocol: grpc name: grpc-ingress namespace: gateway-demo spec: ingressClassName: alb rules: - host: grpc.example.com http: paths: - backend: service: name: grpc-service port: number: 50051 path: / pathType: Prefix tls: - hosts: - grpc.example.com secretName: grpc-secret
ステップ 4:トラフィック転送の検証
次のコマンドを実行して、Ingress に関する情報を表示します。
kubectl get ingress -ngateway-demo期待される出力:
NAME CLASS HOSTS ADDRESS PORTS AGE grpc-ingress alb grpc.example.com alb-***** 80, 443 3m51sgrpcurlを使用してサービスに接続できます。# <ADDRESS> を前のステップで取得した ALB ドメイン名に置き換えます。 grpcurl -insecure -authority grpc.example.com <ADDRESS>:443 list出力は、Ingress がバックエンドの gRPC サービスにトラフィックを正常に転送していることを示しています:
grpc.reflection.v1alpha.ServerReflection helloworld.Greeter