サービスメッシュ(ASM)インスタンス内のビジネスサービスが外部データベースにアクセスできる場合でも、サービス認証が失敗することがあります。このトピックでは、この問題の原因と解決策について説明します。
問題の説明
V1.10 以前の ASM インスタンスを使用しています。サービス A などのビジネスサービスを使用して、異なる外部データベースにアクセスし、データベースへのログオンに使用される認証情報が異なっています。サービス A を ASM インスタンスに追加し、サービス A をホストする Pod のサイドカープロキシインジェクションを有効にすると、サービス A が外部データベースにアクセスしようとすると、認証エラーを示すエラーメッセージが表示されます。
原因
ExternalName タイプのサービスを使用して、コンテナサービス Kubernetes 版(ACK)クラスター外の Transmission Control Protocol(TCP)ネットワークサービスデータベースの CNAME レコードを追加した可能性があります。サービス A が ASM インスタンスに追加されると、ACK クラスターの IP アドレスが外部データベースのドメイン名にマッピングされていないため、サービス A から外部データベースへのリクエストは、一致するポートに基づいて送信されます。これにより、外部データベースへのリクエストが別のデータベースに送信されるという問題が発生する可能性があります。その後、2 つのデータベースのログオンに必要な認証情報が異なるため、認証は失敗します。
解決策
解決策 1:ASM インスタンスのバージョンを更新する
ASM インスタンスのバージョンを V1.11 以降に更新することで、この問題を解決できます。詳細については、「ASM インスタンスの更新」トピックの手順セクションをご参照ください。
解決策 2:サービスエントリを使用する
インスタンス内のサービスがサービスエントリで指定された IP アドレスで識別されるデータベースにアクセスできるように、ASM インスタンスにサービスエントリを作成できます。特定の名前空間にサービスエントリを作成することもできます。このように、サービスエントリはその名前空間でのみ有効になります。
ASM コンソール にログオンします。
左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、構成する ASM インスタンスを見つけます。[管理] 列の ASM インスタンス名をクリックするか、[アクション] をクリックします。
ASM インスタンスの詳細ページで、 を選択します。表示されるページで、[YAML から作成] をクリックします。
[作成] ページで、[名前空間] ドロップダウンリストから istio-system を選択し、テンプレートを選択し、[YAML] コードエディターの内容を次のコードに置き換えて、[作成] をクリックします。
apiVersion: networking.istio.io/v1beta1 kind: ServiceEntry metadata: name: mysql-demo spec: addresses: - 172.1.xx.xx // アクセスするデータベースのIPアドレス endpoints: - address: 172.1.xx.xx hosts: - test-mysql.com location: MESH_EXTERNAL ports: - name: tcp number: 3306 // アクセスするデータベースのポート protocol: TCP resolution: STATIC
addresses: アクセスするデータベースの IP アドレス。
number: アクセスするデータベースのポート。