次の方法で共有


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

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

Note

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

前提条件

  • 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 へのアクセスを設定する必要があります。

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

  • クラスターで Azure Key Vault シークレットの変更を自動検出するには、Azure Key Vault シークレット プロバイダー アドオンに対して 自動ローテーション を有効にする必要があります。

  • 中間証明書への変更は自動的に適用されますが、「デプロイされたリソース」セクションで説明されているように、ルート証明書の変更は、アドオンがデプロイする cronjob によってistiod展開が再開された後にのみ、コントロール プレーンによって取得されます。 この cronjob は 10 分間隔で実行されます。

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

Istio アドオン plug-in 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 Key Vault のルート証明書オブジェクト名。
--ca-cert-object-name<inter-cert-obj-name> Azure Key Vault の中間証明書オブジェクト名。
--ca-key-object-name<inter-key-obj-name> Azure Key Vault 内の中間証明書の秘密キー オブジェクト名。
--cert-chain-object-name<cert-chain-obj-name> Azure Key Vault の証明書チェーン オブジェクト名。

プラグイン CA 証明書機能を使用する場合は、5 つのパラメーターをすべて指定する必要があります。 すべての Azure Key Vault オブジェクトは、 Secret の種類である必要があります。

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

デプロイされるリソース

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

  • 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-21 SecretProviderClass オブジェクトは、アドオンの展開時にaks-istio-system名前空間に作成されます。 このリソースには、シークレット ストア コンテナー ストレージ インターフェイス (CSI) ドライバーの Azure 固有のパラメーターが含まれています。

    kubectl get secretproviderclass --namespace aks-istio-system
    
    NAME                 AGE
    istio-spc-asm-1-21   14h
    
  • istio-ca-root-cert configmap は、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-21 cronjob オブジェクトは、aks-istio-system名前空間に作成されます。 この cronjob は、ルート証明書の更新を確認するために 10 分ごとに実行されるようにスケジュールされています。 cacerts Kubernetes シークレット内のルート証明書が、aks-istio-system名前空間のistio-ca-root-cert構成マップと一致しない場合は、istiod-asm-1-21デプロイが再起動されます。

    kubectl get cronjob --namespace aks-istio-system
    
    NAME                                    SCHEDULE       SUSPEND   ACTIVE
    istio-cert-validator-cronjob-asm-1-21   */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-21 restarted
    Deployment istiod-asm-1-21 restarted.
    

デプロイ ログで証明書の種類を決定する

istiodデプロイ ログを表示して、自己署名 CA 証明書とプラグイン CA 証明書のどちらを持っているかを確認できます。 ログを表示するには、次のコマンドを使用します。

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

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

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

    タイムスタンプ ログ レベル メッセージ
    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 証明書 - <certificate-details>
    2023-11-20T23:27:36.649552Z info Istiod 証明書が再読み込みされる
    2023-11-20T23:27:36.649613Z info spiffe ピア証明書検証ツールでドメイン cluster.local を信頼する 1 つの証明書を追加しました
  • プラグイン CA 証明書のログ エントリ

    タイムスタンプ ログ レベル メッセージ
    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 証明書 - <certificate-details>
    2023-11-21T00:20:25.808764Z info x509 証明書 - <certificate-details>
    2023-11-21T00:20:25.808799Z info x509 証明書 - <certificate-details>
    2023-11-21T00:20:25.808803Z info Istiod 証明書が再読み込みされる
    2023-11-21T00:20:25.808873Z info spiffe ピア証明書検証ツールでドメイン cluster.local を信頼する 1 つの証明書を追加しました

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

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

発行者 サブジェクト SN 以前はなかった NotAfter
"O=cluster.local" "" <32 桁の 16 進値> "2023-11-20T23:25:36Z" "2033-11-17T23:27:36Z"

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

発行者 サブジェクト SN 以前はなかった 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-21 ポッドが Init:0/2 状態でスタックしていることがわかります。

名前 準備完了 状態 再起動 AGE
istiod-asm-1-21-6fcfd88478-2x95b 0/1 終了しています 0 5m55s
istiod-asm-1-21-6fcfd88478-6x5hh 0/1 終了しています 0 5m40s
istiod-asm-1-21-6fcfd88478-c48f9 0/1 Init:0/2 0 54s
istiod-asm-1-21-6fcfd88478-wl8mw 0/1 Init:0/2 0 39 秒

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

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

次の出力例は、Key Vault のシークレットに対する "取得" アクセス許可がないため、"403 Forbidden" エラーが発生したことを示しています。

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

この問題を解決するには、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 $RESOURCE_GROUP --name $CLUSTER --query 'addonProfiles.azureKeyvaultSecretsProvider.identity.objectId')

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

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

Note

コンテナー アクセス ポリシーではなく、アクセス許可モデルに対して 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 $RESOURCE_GROUP --name $CLUSTER | jq -r '.addonProfiles.azureKeyvaultSecretsProvider.config.enableSecretRotation'

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

az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER | jq -r '.addonProfiles.azureKeyvaultSecretsProvider.config.rotationPollInterval'

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

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

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

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

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

Type 理由 Age ソース メッセージ
正常 スケジュール済み 3m9s default-scheduler aks-istio-system/istiod-asm-1-21-6fcfd88478-hqdjj を aks-userpool-24672518-vmss000000 に正常に割り当てた
警告 FailedMount 66 秒 kubelet ボリュームをアタッチまたはマウントできません: unmounted volumes=[cacerts], unattached volumes=[], failed to process volumes=[]: timed out waiting for the condition
警告 FailedMount 61s (x9 over 3m9s) kubelet ボリューム "cacerts" に対して MountVolume.SetUp が失敗しました:rpc エラー: code = Unknown desc = failed to mount secrets store objects for pod aks-istio-system/istiod-asm-1-21-6fcfd88478-hqdjj, err: rpc error: code = Unknown desc = failed to mount objects, error: failed to get objectType:secret, objectName:test-cert-chain, objectVersion:: keyvault.BaseClient#GetSecret: 要求への応答に失敗しました: StatusCode=404 -- 元のエラー: autorest/azure: サービスがエラーを返しました。 Status=404 Code="SecretNotFound" Message="A secret with (name/id) test-cert-chain was not found in this key vault. このシークレットを最近削除した場合は、正しい回復コマンドを使用して回復できる可能性があります。 この問題の解決については、 https://go.microsoft.com/fwlink/?linkid=2125182を参照してください。

リソース

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

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

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

サードパーティのお問い合わせ窓口に関する情報は、ユーザーの便宜のために提供されているものであり、 この連絡先情報は、予告なしに変更される可能性があります。 マイクロソフトは、掲載されている情報に対して、いかなる責任も負わないものとします。

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

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