イングレスゲートウェイを使用すると、相互 TLS (mTLS)プロトコルに基づく Google Remote Procedure Call (gRPC)サービスを構成できます。このセキュリティメカニズムにより、承認されたクライアントのみが gRPC サービスにアクセスできます。データ送信プロセス全体でエンドツーエンドの暗号化と双方向認証が実装され、盗聴、改ざん、不正アクセスから情報を効果的に保護します。
前提条件
Service Mesh (ASM)インスタンスの Enterprise Edition が作成されている。詳細については、「ASM インスタンスの作成」をご参照ください。
ACK マネージドクラスターが作成されている。詳細については、「ACK マネージドクラスターの作成」をご参照ください。
クラスターが ASM インスタンスに追加されている。詳細については、「ASM インスタンスへのクラスターの追加」をご参照ください。
イングレスゲートウェイがデプロイされている。詳細については、「イングレスゲートウェイの作成」をご参照ください。
アプリケーションが、ASM インスタンスに追加された Container Service for Kubernetes (ACK)クラスターにデプロイされている。詳細については、「ASM インスタンスに追加された ACK クラスターへのアプリケーションのデプロイ」をご参照ください。
背景情報
イングレスゲートウェイを使用して、ASM インスタンス内の gRPC サービスにトラフィックをルーティングできます。Service Mesh gRPC サービスは HTTP/2 プロトコル上に構築されています。これにより、TLS または mTLS プロトコルを使用して送信データを暗号化し、データセキュリティを確保できます。イングレスゲートウェイは、TLS または mTLS を使用した gRPC をサポートしています。暗号化された TCP データストリームがイングレスゲートウェイを通過するときに、TLS ターミネーションが実行されます。ASM インスタンス内のアプリケーションに TLS を構成する必要はありません。
手順
手順 1:サンプルアプリケーションをデプロイする
ACK コンソール にログインします。左側のナビゲーションペインで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけ、その名前をクリックします。左側のペインで、 を選択します。
[デプロイメント] ページの上部にある [名前空間] ドロップダウンリストから名前空間を選択し、[YAML から作成] をクリックします。
[作成] ページで、次の YAML コードをコードエディターにコピーし、[作成] をクリックします。
説明サービス設定の
portsフィールドのnameパラメーターは、http2-またはgrpc-で始まる必要があります。そうでない場合、Istio はサービスプロトコルを識別できません。
手順 2:イングレスゲートウェイを作成する
この例では、デフォルトポート 443 を使用してサービスを公開します。詳細については、「イングレスゲートウェイの作成」をご参照ください。
手順 3:Istio ゲートウェイと仮想サービスを構成する
ASM コンソール にログインします。左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、構成する ASM インスタンスを見つけ、インスタンス名をクリックするか、管理[アクション] 列の をクリックします。
Istio ゲートウェイを作成します。
ASM インスタンスの詳細ページで、左側のナビゲーションペインの を選択します。
[ゲートウェイ] ページで、[YAML から作成] をクリックします。
[作成] ページで、デフォルト[名前空間] ドロップダウンリストから 作成 を選択し、次の YAML コードをコードエディターにコピーして、 をクリックします。
apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: gw-grpc-443 namespace: default spec: selector: istio: ingressgateway servers: - hosts: - '*' port: name: https number: 443 protocol: HTTPS tls: credentialName: example-credential mode: MUTUAL
仮想サービスを作成します。
ASM インスタンスの詳細ページで、左側のナビゲーションペインの を選択します。
[virtualservice] ページで、[YAML から作成] をクリックします。
[作成] ページで、デフォルト[名前空間] ドロップダウンリストから 作成 を選択し、次の YAML コードをコードエディターにコピーして、 をクリックします。
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: grpc-vs spec: hosts: - "*" gateways: - gw-grpc-443 http: - match: - port: 443 route: - destination: host: istio-grpc-server
手順 4:証明書を登録する
通常、gRPC クライアントには Subject Alternative Name (SAN)証明書が必要です。grpc-go に記載されている証明書を使用することをお勧めします。イングレスゲートウェイは証明書を必要とするため、証明書を ACK クラスターの istio-system 名前空間に登録します。
1.17 より前のバージョンの ASM インスタンスの場合
次のコマンドを実行して、istio-system 名前空間にシークレットを作成します。
kubectl create -n istio-system secret generic example-credential --from-file=tls.key=server_key.pem --from-file=tls.crt=server_cert.pem --from-file=ca.crt=client_ca_cert.pem説明シークレット名は、Istio ゲートウェイで構成された credentialName と同じである必要があります。
バージョン 1.17 以降の ASM インスタンスの場合
ASM コンソール にログインします。左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションペインで、 を選択します。
[証明書管理] ページで、[作成] をクリックします。[証明書情報] パネルで、必要なパラメーターを構成し、[OK] をクリックします。
手順 5:gRPC クライアントを起動する
この例では、mTLS を使用する gRPC クライアントが起動されます。詳細については、gRPC の公式 Web サイトを参照してください。
依存関係をインストールします。詳細については、「Go での gRPC のクイックスタート」をご参照ください。
gRPC-go コードリポジトリをクローンします。詳細については、「gRPC-go」をご参照ください。
/grpc-go/examples/helloworld/greeter_client/ パスの main.go ファイルの内容を次のコードに置き換え、
addressの値を${イングレスゲートウェイの IP アドレス}:443に変更します。examples パスに移動し、次のコマンドを実行します。
go run helloworld/greeter_client/main.go予期される結果:
Greeting: Hello World次の図に示すエラーが返された場合、証明書が無効です。上記の手順を実行して、証明書を再度登録してください。
