Istio サービス メッシュ アドオン プラグイン CA 証明書のトラブルシューティング

この記事では、Istio サービス メッシュ アドオンのプラグイン証明機関 (CA) 証明書に関連する一般的なトラブルシューティングの問題について説明し、これらの問題を解決するための解決策を提供します。 また、この記事では、サービス メッシュ アドオンのプラグイン CA 証明書を設定する一般的なプロセスについても説明します。

注:

この記事では、Istio リビジョン asm-1-17 がクラスターにデプロイされていることを前提としています。

前提条件

  • Azure CLI

  • Kubernetes kubectl ツールまたは同様のツールを使用してクラスターに接続します。 Azure CLI を使用して kubectl をインストールするには、 az aks install-cli コマンドを 実行します。

  • 次の Linux スタイルの標準シェル ツール:

    • grep
    • sort
    • tail
    • awk
    • xargs
  • JSON データのクエリを実行するための jq ツール。

一般的なセットアップ プロセス

  • Istio アドオンでプラグイン CA 証明書機能を使用できるようにするには、クラスターでシークレット ストア アドオンの Azure Key Vault プロバイダーを有効にする必要があります。 Azure Key Vaultとクラスターが同じ Azure テナントにあることを確認します。

  • Azure Key Vault シークレット プロバイダー アドオンが有効になった後、アドオンが作成するユーザー割り当てマネージド ID の Azure Key Vaultへのアクセスを設定する必要があります。

  • Azure Key Vaultにアクセスするためのアクセス許可をユーザー割り当てマネージド ID に付与した後、Istio アドオンと共にプラグイン CA 証明書機能を使用できます。 詳細については、「 Istio アドオンを有効にしてプラグイン CA 証明書を使用する 」セクションを参照してください。

  • クラスターが Azure Key Vault シークレットの変更を自動検出するには、自動ローテーションを有効にする必要があります。

  • 中間証明書への変更は自動的に適用されますが、 istiod ルート証明書を変更した後、デプロイを再起動する必要があります。 デプロイの再起動は、「 デプロイされたリソース 」セクションで説明されているように、cronjob を使用して実行されます。

Istio アドオンでプラグイン CA 証明書を使用できるようにする

Istio アドオン Istio プラグイン CA 証明書 機能を使用すると、クラスター上のメッシュでプラグイン ルート証明書と中間証明書を構成できます。 アドオンを有効にするときにプラグイン証明書情報を提供するには、Azure CLI の az aks mesh enable コマンドに次のパラメーターを指定します。

パラメーター 説明
--key-vault-id<resource-id> Azure Key Vault リソース ID。 このリソースは、マネージド クラスターと同じテナント内にあると予想されます。 このリソース ID は、Azure Resource Manager テンプレート (ARM テンプレート) のリソース ID 形式である必要があります。
--root-cert-object-name<root-cert-obj-name> Azure キー コンテナー内のルート証明書オブジェクト名。
--ca-cert-object-name<inter-cert-obj-name> Azure キー コンテナー内の中間証明書オブジェクト名。
--ca-key-object-name<inter-key-obj-name> Azure キー コンテナー内の中間証明書の秘密キー オブジェクト名。
--cert-chain-object-name<cert-chain-obj-name> Azure キー コンテナー内の証明書チェーン オブジェクト名。

プラグイン CA 証明書機能を使用する場合は、5 つのパラメーターすべてを指定する必要があります。 すべての Azure キー コンテナー オブジェクトは、 シークレット型である必要があります。

詳細については、「Azure Kubernetes Serviceでの Istio ベースのサービス メッシュ アドオンの CA 証明書のプラグイン」を参照してください。

デプロイされたリソース

プラグイン証明書機能のアドオンデプロイの一環として、次のリソースがクラスターにデプロイされます。

  • cacerts Kubernetes シークレットは、アドオンのaks-istio-systemデプロイ時に名前空間に作成されます。 このシークレットには、同期された Azure Key Vault シークレットが含まれています。

    kubectl describe secret cacerts --namespace aks-istio-system
    
    Name:         cacerts
    Namespace:    aks-istio-system
    Labels:       secrets-store.csi.k8s.io/managed=true
    Annotations:  <none>
    
    Type:  opaque
    
    Data
    ====
    ca-cert.pem:     1968 bytes
    ca-key.pem:      3272 bytes
    cert-chain.pem:  3786 bytes
    root-cert.pem:   3636 bytes
    
  • istio-spc-asm-1-17SecretProviderClass オブジェクトは、アドオンのaks-istio-systemデプロイ時に名前空間に作成されます。 このリソースには、シークレット ストア コンテナー ストレージ インターフェイス (CSI) ドライバーの Azure 固有のパラメーターが含まれています。

    kubectl get secretproviderclass --namespace aks-istio-system
    
    NAME                 AGE
    istio-spc-asm-1-17   14h
    
  • istio-ca-root-cert構成マップは、名前空間と他のすべてのユーザー管理名前空間にaks-istio-system作成されます。 この構成マップには、証明機関が使用するルート証明書が含まれており、次のように、名前空間内のワークロードによってワークロード間の通信を検証するために使用されます。

    kubectl describe configmap istio-ca-root-cert --namespace aks-istio-system
    
    Name:         istio-ca-root-cert
    Namespace:    aks-istio-system
    Labels:       istio.io/config=true
    Annotations:  <none>
    
    Data
    ====
    root-cert.pem:
    ----
    -----BEGIN CERTIFICATE-----
    <certificate data>
    -----END CERTIFICATE-----
    
  • istio-cert-validator-cronjob-asm-1-17Cronjob オブジェクトは名前空間にaks-istio-system作成されます。 この cronjob は、ルート証明書の更新をチェックするために 10 分ごとに実行するようにスケジュールされています。 Kubernetes シークレット内のルート証明書が名前空間のcacerts構成マップaks-istio-systemと一致istio-ca-root-certしない場合は、デプロイがistiod-asm-1-17再起動されます。

    kubectl get cronjob --namespace aks-istio-system
    
    NAME                                    SCHEDULE       SUSPEND   ACTIVE
    istio-cert-validator-cronjob-asm-1-17   */10 * * * *   False     0     
    

    次のコマンドを実行して、前回の実行の cronjob ログをチェックできます。

    kubectl logs --namespace aks-istio-system $(kubectl get pods --namespace aks-istio-system | grep 'istio-cert-validator-cronjob-' | sort -k8 | tail -n 1 | awk '{print $1}')
    

    このコマンドは、ルート証明書の更新が検出されたかどうかに応じて、次のいずれかの出力メッセージを生成します。

    Root certificate update not detected.
    
    Root certificate update detected. Restarting deployment...
    deployment.apps/istiod-asm-1-17 restarted
    Deployment istiod-asm-1-17 restarted.
    

デプロイ ログの証明書の種類を確認する

展開ログを表示して、自己署名 CA 証明書と BYO (プラグイン) CA 証明書のどちらを持っているかを判断できます。 ログを表示するには、次のコマンドを実行します。

kubectl logs deploy/istiod-asm-1-17 --container discovery --namespace aks-istio-system | grep -v validationController

各証明書ログ エントリの直前には、その種類の証明書を記述する別のログ エントリがあります。 自己署名 CA 証明書の場合、エントリには " etc/cacerts/ca-key.pem にプラグイン証明書がありません。自己署名証明書が使用されます。プラグイン証明書の場合、エントリには " etc/cacerts/ca-key.pem でプラグイン証明書を使用する" と表示されます。証明書に関連するサンプル ログ エントリを次の表に示します。

  • 自己署名 CA 証明書のログ エントリ

    Timestamp ログ レベル メッセージ
    2023-11-20T23:27:36.649019Z info ca ファイルの署名に istiod ファイル形式を使用する
    2023-11-20T23:27:36.649032Z info etc/cacerts/ca-key.pem にプラグイン証明書がありません。自己署名証明書が使用されます
    2023-11-20T23:27:36.649536Z info x509 証明書 - <証明書の詳細>
    2023-11-20T23:27:36.649552Z info Istiod 証明書が再読み込みされる
    2023-11-20T23:27:36.649613Z info spiffe ピア証明書検証ツールでドメイン cluster.local を信頼する証明書を 1 つ追加しました
  • BYO (プラグイン) CA 証明書のログ エントリ

    Timestamp ログ レベル メッセージ
    2023-11-21T00:20:25.808396Z info ca ファイルの署名に istiod ファイル形式を使用する
    2023-11-21T00:20:25.808412Z info etc/cacerts/ca-key.pem でプラグイン証明書を使用する
    2023-11-21T00:20:25.808731Z info x509 証明書 - <証明書の詳細>
    2023-11-21T00:20:25.808764Z info x509 証明書 - <証明書の詳細>
    2023-11-21T00:20:25.808799Z info x509 証明書 - <証明書の詳細>
    2023-11-21T00:20:25.808803Z info Istiod 証明書が再読み込みされる
    2023-11-21T00:20:25.808873Z info spiffe ピア証明書検証ツールでドメイン cluster.local を信頼する証明書を 1 つ追加しました

ログ エントリの証明書の詳細は、発行者、サブジェクト、シリアル番号 (SN - 長い 16 進文字列)、および証明書が有効なタイミングを定義する開始および終了タイムスタンプ値のコンマ区切りの値として表示されます。

自己署名 CA 証明書の場合は、1 つの詳細エントリがあります。 この証明書のサンプル値を次の表に示します。

発行者 件名 Sn NotBefore NotAfter
"O=cluster.local" "" <32 桁の 16 進値> "2023-11-20T23:25:36Z" "2033-11-17T23:27:36Z"

BYO (プラグイン) CA 証明書には、3 つの詳細エントリがあります。 他の 2 つのエントリは、ルート証明書の更新と中間証明書への変更用です。 これらのエントリのサンプル値を次の表に示します。

発行者 件名 Sn NotBefore NotAfter
CN=Intermediate CA - A1,O=Istio,L=cluster-A1" "" <32 桁の 16 進値> "2023-11-21T00:18:25Z" "2033-11-18T00:20:25Z"
CN=Root A,O=Istio" "CN=Intermediate CA - A1,O=Istio,L=cluster-A1" <40 桁の 16 進値> "2023-11-04T01:40:22Z" "2033-11-01T01:40:22Z"
CN=Root A,O=Istio" "CN=Root A,O=Istio" <40 桁の 16 進値> "2023-11-04T01:38:27Z" "2033-11-01T01:38:27Z"

一般的な問題

問題 1: Azure Key Vaultへのアクセスが正しく設定されていない

Azure Key Vault シークレット プロバイダー アドオンを有効にした後、アドオンのユーザー割り当てマネージド ID に対するアクセス権を Azure Key Vaultに付与する必要があります。 Azure Key Vaultへのアクセスを設定すると、アドオンのインストールが誤って停止します。

kubectl get pods --namespace aks-istio-system

ポッドの一覧で、ポッドが istiod-asm-1-17 状態で Init:0/2 スタックしていることがわかります。

名前 準備 ステータス 再起動 年齢
istiod-asm-1-17-6fcfd88478-2x95b 0/1 終了 0 5m55s
istiod-asm-1-17-6fcfd88478-6x5hh 0/1 終了 0 5m40s
istiod-asm-1-17-6fcfd88478-c48f9 0/1 Init:0/2 0 54s
istiod-asm-1-17-6fcfd88478-wl8mw 0/1 Init:0/2 0 39s

Azure Key Vault アクセスの問題を確認するには、 コマンドをkubectl get pods実行して、名前空間にラベルがあるsecrets-store-provider-azureポッドをkube-system見つけます。

kubectl get pods --selector app=secrets-store-provider-azure --namespace kube-system --output name | xargs -I {} kubectl logs --namespace kube-system {}

次の出力例は、"403 Forbidden" エラーが発生し、キー コンテナーのシークレットに対する "get" アクセス許可が拒否されたことを示しています。

"マウント要求の処理に失敗しました" err="objectType:secret, objectName:<secret-object-name>, objectVersion:: keyvault を取得できませんでした。BaseClient#GetSecret: 要求に応答できない: StatusCode=403 -- 元のエラー: autorest/azure: Service からエラーが返されました。 Status=403 Code=\"Forbidden\" Message=\"ユーザー、グループ、またはアプリケーション 'appid=<appid>;oid=<oid>;iss=<iss>' には、キー コンテナー 'MyAzureKeyVault に対するシークレット取得アクセス許可がありません。location=eastus'. この問題の解決に役立つ情報については、\" InnerError={\"code\":\"AccessDenied\"}" を参照 https://go.microsoft.com/fwlink/?linkid=2125287してください。

この問題を解決するには、Azure Key Vault シークレットに対する Get および List アクセス許可を取得し、Istio アドオンを再インストールすることで、Azure Key Vault アドオンのユーザー割り当てマネージド ID へのアクセスを設定します。 まず、az aks show コマンドを実行して、Azure Key Vault アドオンのユーザー割り当てマネージド ID のオブジェクト ID を取得します。

OBJECT_ID=$(az aks show --resource-group <my-resource-group> --name <my-managed-cluster> --query 'addonProfiles.azureKeyvaultSecretsProvider.identity.objectId')

アクセス ポリシーを設定するには、取得したオブジェクト ID を指定して、次の az keyvault set-policy コマンドを実行します。

az keyvault set-policy --name MyAzureKeyVault --object-id $OBJECT_ID --secret-permissions get list

注:

Vault アクセス ポリシーの代わりにアクセス許可モデルに Azure RBAC 承認を使用して、Key Vaultを作成しましたか? この場合は、「Azure ロールベースのアクセス制御を使用して、Key Vaultキー、証明書、シークレットへのアクセスを提供する」を参照して、マネージド ID のアクセス許可を作成します。 アドオンのユーザー割り当てマネージド ID のKey Vault閲覧者に対する Azure ロールの割り当てを追加します。

問題 2: シークレットの変更が設定されていないKey Vault自動検出

クラスターで Azure Key Vault シークレットの変更を自動検出するには、Azure Key Vault プロバイダー アドオンの自動ローテーションを有効にする必要があります。 自動ローテーションでは、中間証明書とルート証明書の変更を自動的に検出できます。 Azure Key Vault プロバイダー アドオンを有効にするクラスターの場合は、次az aks showのコマンドを実行して、自動ローテーションが有効かどうかをチェックします。

az aks show --resource-group <my-resource-group> --name <my-managed-cluster> | jq -r '.addonProfiles.azureKeyvaultSecretsProvider.config.enableSecretRotation'

クラスターで Azure Key Vault プロバイダー アドオンが有効になっている場合は、次az aks showのコマンドを実行してローテーションポーリング間隔を決定します。

az aks show --resource-group <my-resource-group> --name <my-managed-cluster> | jq -r '.addonProfiles.azureKeyvaultSecretsProvider.config.rotationPollInterval'

Azure Key Vault シークレットは、前回の同期後にポーリング間隔が経過すると、クラスターと同期されます。 既定の間隔の値は 2 分です。

問題 3: 証明書の値が見つからないか、正しく構成されていない

シークレット オブジェクトが Azure Key Vaultに存在しない場合、またはこれらのオブジェクトが正しく構成されていない場合は、アドオンのインストールが遅れる可能性があります。 ポッドは istiod-asm-1-17 状態を超えて Init:0/2 進行しません。 この問題の根本的な原因を見つけるには、次 kubectl describe のコマンドを実行して、そのポッドのデプロイ ログを表示します。

kubectl describe deploy/istiod-asm-1-17 --namespace aks-istio-system

コマンドは、次の出力テーブルのようなイベントを表示します。 この例では、シークレットが見つからないのが問題の原因です。

理由 年齢 送信元 メッセージ
標準 スケジュール済み 3m9s default-scheduler aks-istio-system/istiod-asm-1-17-6fcfd88478-hqdjj を aks-userpool-24672518-vmss00000 に正常に割り当てた
警告 FailedMount 66s kubelet ボリュームをアタッチまたはマウントできません: マウントされていないボリューム=[cacerts]、アタッチされていないボリューム=[]、volumes=[]: 条件を待機中にタイムアウトしました
警告 FailedMount 61s (x9 over 3m9s) kubelet ボリューム "cacerts" に対して MountVolume.SetUp が失敗しました: rpc エラー: code = Unknown desc = pod aks-istio-system/istiod-asm-1-17-6fcfd88478-hqdjj のシークレット ストア オブジェクトをマウントできませんでした。 err: rpc error: code = Unknown desc = object をマウントできませんでした。エラー: objectType:secret、objectName:test-cert-chain、objectVersion:: keyvault を取得できませんでした。BaseClient#GetSecret: 要求に応答できない: StatusCode=404 -- 元のエラー: autorest/azure: サービスからエラーが返されました。 Status=404 Code="SecretNotFound" Message="(名前/id) test-cert-chain を持つシークレットがこのキー コンテナーに見つかりませんでした。 このシークレットを最近削除した場合は、正しい回復コマンドを使用して回復できる可能性があります。 この問題の解決に関するヘルプについては、" を参照してください https://go.microsoft.com/fwlink/?linkid=2125182

リソース

サードパーティの情報に関する免責事項

この資料に記載されているサードパーティ製品は、マイクロソフトと関連のない他社の製品です。 明示的か黙示的かにかかわらず、これらの製品のパフォーマンスや信頼性についてマイクロソフトはいかなる責任も負わないものとします。

サードパーティのお問い合わせ窓口に関する免責事項

Microsoft では、このトピックに関する追加情報を見つけるのに役立つサード パーティの連絡先情報を提供しています。 将来予告なしに変更されることがあります。 Microsoft は、第三者の連絡先情報の正確性を保証しません。

お問い合わせはこちらから

質問がある場合やヘルプが必要な場合は、サポート要求を作成するか、Azure コミュニティ サポートにお問い合わせください。 Azure フィードバック コミュニティに製品フィードバックを送信することもできます。