AKS Arc のセキュリティと ID の既知の問題とエラーを修正する

このトピックは、AKS Arc のセキュリティと ID 関連の問題のトラブルシューティングと解決に役立ちます。

Get-AksHciCredential が "指定されたパスが見つかりません" というエラーで失敗する

PowerShell コマンドレットは Get-AksHciCredential 、AksHci のインストールに使用される管理者ユーザーとは異なる管理者ユーザーによって実行されると失敗します。 コマンドは 、.kube ディレクトリを作成し、その中に構成ファイルを配置します。 ただし、コマンドは次のエラーで失敗します。

Error: open C:\Users\<user>\.kube\config: The system cannot find the path specified.

再現方法

  1. AksHci をインストールします。
  2. ターゲット クラスターを作成します。
  3. コンピューターに別の管理者ユーザーとしてサインインします (複数管理者機能)。
  4. Get-AksHciCredential -Name $clusterName を実行します。

正しい動作

Get-AksHciCredential は、ユーザーのホーム ディレクトリに .kube ディレクトリを作成し、そのディレクトリに構成ファイルを配置できる必要があります。

この問題を回避するには、ユーザーのホーム ディレクトリに .kube ディレクトリを作成します。 ディレクトリを作成するには、次のコマンドを使用します。

mkdir "$HOME/.kube"

この手順の後に、 Get-AksHciCredential が失敗しないようにする必要があります。

エラー "証明書の有効期限が切れています - サーバーに接続できません: x509"

コントロール プレーン証明書の更新に失敗した場合、ターゲット クラスターにアクセスできません。 クラスターに到達しようとすると、次の kubectl エラーが表示されます。

certificate expired - Unable to connect to the server: x509: certificate has expired or is not yet valid: current time 2022-07-26T12:24:15-04:00 is after 2022-07-15T15:01:07Z

注意

この問題は、2022 年 9 月のリリース以降で修正されています。

再現方法

  1. AksHci をインストールします。
  2. ターゲット クラスターをインストールします。 3. クラスター (VM) を 4 日以上オフにします。
  3. クラスターをもう一度オンにします。

症状と軽減策

ターゲット クラスターに到達できません。 ターゲット クラスターに対してコマンドを実行すると kubectl 、次のようなエラー メッセージが返されます。

certificate expired - Unable to connect to the server: x509: certificate has expired or is not yet valid: current time 2022-07-26T12:24:15-04:00 is after 2022-07-15T15:01:07Z

問題を修正するには:

  1. 次のコマンドを実行して、生成された証明書を手動で更新します。

    Update-AksHciClusterCertificates  -Name my-workload -cluster -fixKubeletCredentials
    
  2. 新しい資格情報を生成する:

    Get-AksHciCredential -name <clustername>
    

数分後に、コマンドをもう kubectl 一度試して、クラスターが使用可能かどうかを確認します。

注意

AksHci バージョン 1.0.14.x 以前には既知のバグがあります。 コントロール プレーン VM に 以外 -control-plane-の名前パターンがある場合、コマンドが Update-AksHciClusterCertificates 機能しない可能性があります。 コントロール プレーン VM にログインして証明書を更新する必要があります。

  1. ターゲット クラスター コントロール プレーン VM の IP アドレスを見つけます。
  2. 次のコマンドを実行します。ssh -i (get-mocconfig).sshPrivateKey clouduser@<ip>
  3. 証明書の入れ墨ファイルを一覧表示します。 sudo ls /etc/kubernetes/pki/cert-tattoo-*
  4. 前のコマンドで示した各ファイルを使用して証明書を生成します。 sudo /usr/bin/cert-tattoo-provision CreateCertsWithAltNames <absolute-path-of-cert-tattoo-file>

認証ハンドシェイクに失敗しました: x509: 不明な機関によって署名された証明書

このエラーは、新しい AKS クラスターをデプロイするとき、または既存のクラスターにノード プールを追加するときに表示される場合があります。

  1. コマンドを実行したユーザーが、AKS on Azure Stack または Windows Server をインストールしたユーザーと同じであることを確認します。 複数のユーザーにアクセス権を付与する方法の詳細については、「 複数の管理者を設定する」を参照してください。
  2. ユーザーが同じで、エラーが解決しない場合は、次の手順に従って問題を解決します。
  • を削除して、古い管理アプライアンス証明書を削除$env:UserProfile.wssd\kvactl\cloudconfigします。
  • Repair-AksHciCerts を実行します。
  • を実行Get-AksHciClusterして、修正済みであることをチェックします。

ターゲット クラスターポッドのログにアクセスできません - リモート エラー: tls: 内部エラー

ターゲット クラスター ログにアクセスできません。 ターゲット クラスター内のポッド ログにアクセスしようとすると、次の TLS エラーが表示されます。

Error from server: Get "[https://10.0.0.0:10250/containerLogs/kube-system/kube-apiserver-moc-l9iv8xjn3av/kube-apiserver":](https://10.0.0.0:10250/containerLogs/kube-system/kube-apiserver-moc-l9iv8xjn3av/kube-apiserver%22:) remote error: tls: internal error

注意

これは、AksHci バージョン 1.0.14.x 以前の既知の問題です。 これは、1.0.14.x リリース (9 月のリリース以降) の一部として修正されています。 このバージョンに更新されたターゲット クラスターでは、この問題は発生しません。

再現方法

  1. AksHci をインストールします。
  2. ターゲット クラスターをインストールします。
  3. クラスターを 60 日間アップグレードしないでください。
  4. クラスターを再起動します。

症状と軽減策

ターゲット ポッドのログにアクセスすることはできません。 ターゲット クラスターに対して実行されるすべての kubectl ログ コマンドは、次のようなエラー メッセージを返す必要があります。

Error from server: Get "[https://10.0.0.0:10250/containerLogs/kube-system/kube-apiserver-moc-l9iv8xjn3av/kube-apiserver":](https://10.0.0.0:10250/containerLogs/kube-system/kube-apiserver-moc-l9iv8xjn3av/kube-apiserver%22:) remote error: tls: internal error

問題を修正するには:

  1. 次のコマンドを実行して、生成された証明書を手動で更新します。

    Update-AksHciClusterCertificates  -Name my-workload -fixKubeletCredentials
    
  2. 新しい資格情報を生成する:

    Get-AksHciCredential -name <clustername>
    

クラスターコントロールプレーン - 証明書の有効期限が切れています - サーバーに接続できません: x509

コントロール プレーン証明書の更新に失敗した場合、ターゲット クラスターにアクセスできません。 クラスターに到達しようとすると、コマンドによって kubectl 次のエラーが生成されます。

certificate expired - Unable to connect to the server: x509: certificate has expired or is not yet valid: current time 2022-07-26T12:24:15-04:00 is after 2022-07-15T15:01:07Z

注意

この問題は、2022 年 9 月のリリース以降で修正されています。

再現方法

  1. AksHci をインストールします。
  2. ターゲット クラスターをインストールします。
  3. クラスター (vms) を 4 日以上オフにします。
  4. クラスターをもう一度オンにします。

症状と軽減策

ターゲット クラスターに到達できない必要があります。 ターゲット クラスターに対して実行されたコマンドは kubectl 、次のようなエラー メッセージを返す必要があります。

certificate expired - Unable to connect to the server: x509: certificate has expired or is not yet valid: current time 2022-07-26T12:24:15-04:00 is after 2022-07-15T15:01:07Z

問題を修正するには:

  1. 次のコマンドを実行して、生成された証明書を手動で更新します。

    Update-AksHciClusterCertificates  -Name my-workload -cluster -fixKubeletCredentials
    
  2. 新しい資格情報を生成する:

    Get-AksHciCredential -name <clustername>
    

数分後に、コマンドをもう kubectl 一度試して、クラスターが使用可能かどうかを確認します。

KMS ポッドが失敗し、KMS ポッド ログにエラーが含まれている

この問題の考えられる症状は次のとおりです。

  • kubectl get secrets は内部エラーで失敗します。
  • kubectl logs <kmspod-name> -n kube-system にはエラーが含まれています。
  • ポッドを作成しようとすると、ボリュームでシークレットのマウントが失敗します。
  • apiserver の起動に失敗します。

次のコマンドを実行して、KMS ポッド ログでエラーを確認します。

kubectl logs <kmspod-name> -n kube-system

管理クラスター KMS ポッドの無効なトークンに関するエラーがログから返される場合は、次のコマンドを実行します。

Update-AksHciCertificates

ターゲット クラスター KMS ポッドで無効なトークンに関するエラーが発生した場合は、次のコマンドを実行します。

UpdateAksHciClusterCertificates -name <cluster-name> -fixcloudcredential

エラー 'System.Collections.Hashtable.generic_non_zero 1 [エラー: 証明書の有効期限が切れています: 期限切れ]'

mocctl 証明書が 60 日を超えて使用されていない場合、有効期限が切れます。 AKS Arc では、コマンドライン ツールを mocctl 使用して MocStack と通信し、Moc 関連の操作を実行します。 コマンドが mocclt cloudagent との通信に使用する証明書の有効期限は 60 日です。 コマンドは mocctl 、有効期限が近づくと (約 42 日後に) 証明書を自動的に更新します。 コマンドが頻繁に使用されない場合は、証明書の有効期限が切れます。

動作を再現するには、AKS Arc をインストールします。コマンドに関係する mocctl 操作は 60 日間実行されません。

この問題を解決するには、証明書の有効期限が切れた後に再度ログインします。 次の PowerShell コマンドを実行してログインします。

Repair-MocLogin

60 日後に期限が切れた KVA 証明書を削除する

アップグレードが実行されない場合、KVA 証明書は 60 日後に期限切れになります。

Update-AksHci および kvactl を含むすべてのコマンドから、次のエラーがスローされます。

Error: failed to get new provider: failed to create azurestackhci session: Certificate has expired: Expired

このエラーを解決するには、\kvactl\cloudconfig にある期限切れの証明書ファイルを削除し、証明書の期限切れ問題が発生したノードでもう一度 Update-AksHci を試します。 次のコマンドを使用できます。

$env:UserProfile.wssd\kvactl\cloudconfig

この問題については、KVA 証明書が 60 日後に期限切れになった場合の KVA 証明書の削除の必要性に関する記事をご覧ください。

ドメインに参加した Azure Stack HCI ノードには特別な Active Directory アクセス許可が必要

Azure Kubernetes Service on Azure Stack HCI をデプロイして構成するユーザーには、サーバーおよびサービス オブジェクトが作成される Active Directory コンテナーで AD オブジェクトを作成するための "フル コントロール" アクセス権限が必要です。

ユーザーのアクセス許可を昇格します。

Uninstall-AksHciAdAuth エラー '[Error from server (NotFound): secrets "keytab-akshci-scale-reliability" not found]' というエラーで失敗する

Uninstall-AksHciAdAuth でこのエラーが表示される場合、この問題は修正されるため、この時点では無視します。

This issue will be fixed.

kubectl ログから "エラー: サーバーにログインする必要があります (サーバーがクライアントに資格情報の入力を要求しました)" が返されます。

クラスターがログの返しを停止できる AKS Arc に問題があります。 これが発生すると、 を実行すると kubectl logs <pod_name> "error: サーバーにログインする必要があります (サーバーがクライアントに資格情報の入力を要求しました)" が返されます。 AKS Arc はコア Kubernetes 証明書を 4 日ごとにローテーションしますが、Kubernetes API サーバーが証明書の更新時に kubelet と通信するためにクライアント証明書を直ちに再読み込みしない場合があります。

この問題を軽減するために、いくつかのオプションがあります。

  • を再実行します kubectl logs。 たとえば、次の PowerShell コマンドを実行します。

    while (1) {kubectl logs <POD_NAME>; sleep 1}
    
  • クラスターの kube-apiserver 各コントロール プレーンでコンテナーを再起動します。 API サーバーを再起動しても、実行中のワークロードには影響しません。 API サーバーを再起動するには、次の手順に従います。

    1. クラスター内の各コントロール プレーンの IP アドレスを取得します。

      kubectl get nodes -o wide
      
    2. 次のコマンドを実行します。

      ssh -i (get-akshciconfig).Moc.sshPrivateKey clouduser@<CONTROL_PLANE_IP> 'sudo crictl stop $(sudo crictl ps --name kube-apiserver -o json | jq -r .containers[0].id)'
      
  • 必要に応じて、運用ワークロードには推奨されませんが、kubelet のサーバー証明書を確認しないように依頼 kube-apiserver できます。

    kubectl logs <POD_NAME> --insecure-skip-tls-verify-backend=true