Istio サービス メッシュ アドオン プラグイン CA 証明書のトラブルシューティング
この記事では、Istio アドオンの証明機関 (CA) 証明書機能に関する一般的なトラブルシューティングの問題について説明し、これらの問題を解決するための解決策を提供します。 この記事では、サービス メッシュ アドオンのプラグイン CA 証明書を設定する一般的なプロセスについても説明します。
Note
この記事では、Istio リビジョン asm-1-21
がクラスターにデプロイされていることを前提としています。
前提条件
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 フィードバック コミュニティに製品フィードバックを送信することもできます。