このトピックは、AKS Arc のセキュリティと ID 関連の問題のトラブルシューティングと解決に役立ちます。
Get-AksHciCredential が "指定されたパスを見つけることができません" エラーで失敗する
Get-AksHciCredential
PowerShell コマンドレットは、AksHci のインストールに使用されたものとは異なる管理者ユーザーによって実行されると失敗します。 このコマンドは、 .kube ディレクトリを作成し、その中に構成ファイルを配置します。 ただし、コマンドは次のエラーで失敗します。
Error: open C:\Users\<user>\.kube\config: The system cannot find the path specified.
再現方法
- AksHci をインストールします。
- ターゲット クラスターを作成します。
- コンピューターに別の管理者ユーザーとしてサインインします (マルチ管理者機能)。
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
Note
この問題は、2022 年 9 月のリリース以降で修正されています。
再現方法
- AksHci をインストールします。
- ターゲット クラスターをインストールします。 3. クラスター (VM) を 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
問題を修正するには:
次のコマンドを実行して、生成された証明書を手動で更新します。
Update-AksHciClusterCertificates -Name my-workload -cluster -fixKubeletCredentials
新しい資格情報を生成します。
Get-AksHciCredential -name <clustername>
数分後に、 kubectl
コマンドをもう一度試して、クラスターが使用可能になったかどうかを確認します。
Note
AksHci バージョン 1.0.14.x 以前には既知のバグがあります。 コントロール プレーン VM に -control-plane-
以外の名前パターンがある場合、 Update-AksHciClusterCertificates
コマンドが機能しない可能性があります。 コントロール プレーン VM にログインして証明書を更新する必要があります。
- ターゲット クラスター コントロール プレーン VM の IP アドレスを見つけます。
- 次のコマンドを実行します。
ssh -i (get-mocconfig).sshPrivateKey clouduser@<ip>
- 証明書のタトゥー ファイルを一覧表示します。
sudo ls /etc/kubernetes/pki/cert-tattoo-*
- 前のコマンドで示した各ファイルを使用して証明書を生成します。
sudo /usr/bin/cert-tattoo-provision CreateCertsWithAltNames <absolute-path-of-cert-tattoo-file>
認証ハンドシェイクに失敗しました: x509: 不明な機関によって署名された証明書
このエラーは、新しい AKS クラスターをデプロイするとき、または既存のクラスターにノード プールを追加するときに表示される場合があります。
- コマンドを実行したユーザーが、Azure Stack または Windows Server に AKS をインストールしたユーザーと同じであることを確認します。 複数のユーザーにアクセス権を付与する方法の詳細については、「 複数の管理者を設定するを参照してください。
- ユーザーが同じで、エラーが解決しない場合は、次の手順に従って問題を解決します。
$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
Note
これは、AksHci バージョン 1.0.14.x 以前の既知の問題です。 これは、1.0.14.x リリース (9 月のリリース以降) の一部として修正されています。 このバージョンに更新されたターゲット クラスターでは、この問題は発生しません。
再現方法
- AksHci をインストールします。
- ターゲット クラスターをインストールします。
- クラスターを 60 日間アップグレードしないでください。
- クラスターを再起動します。
症状と軽減策
ターゲット ポッド ログにアクセスすることはできません。 ターゲット クラスターに対して実行 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
問題を修正するには:
次のコマンドを実行して、生成された証明書を手動で更新します。
Update-AksHciClusterCertificates -Name my-workload -fixKubeletCredentials
新しい資格情報を生成します。
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
Note
この問題は、2022 年 9 月のリリース以降で修正されています。
再現方法
- AksHci をインストールします。
- ターゲット クラスターをインストールします。
- クラスター (vms) を 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
問題を修正するには:
次のコマンドを実行して、生成された証明書を手動で更新します。
Update-AksHciClusterCertificates -Name my-workload -cluster -fixKubeletCredentials
新しい資格情報を生成します。
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 関連の操作を実行します。 cloudagent との通信に mocclt
コマンドが使用する証明書の有効期限は 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 ローカル ノードには、特別な Active Directory アクセス許可が必要です
Azure Kubernetes Service on Azure Local をデプロイして構成するユーザーには、サーバーとサービス オブジェクトが作成される Active Directory コンテナーに AD オブジェクトを作成するための Full Control アクセス許可が必要です。
ユーザーのアクセス許可を昇格します。
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>
を実行すると、"エラー: サーバーにログインする必要があります (サーバーがクライアントに資格情報の入力を要求しました)" が返されます。 AKS Arc はコア Kubernetes 証明書を 4 日ごとにローテーションしますが、証明書の更新時に Kubernetes API サーバーが kubelet との通信のためにクライアント証明書を直ちに再読み込みしない場合があります。
この問題を軽減するために、いくつかのオプションがあります。
kubectl logs
を再実行します。 たとえば、次の PowerShell コマンドを実行します。while (1) {kubectl logs <POD_NAME>; sleep 1}
クラスターの各コントロール プレーンで
kube-apiserver
コンテナーを再起動します。 API サーバーを再起動しても、実行中のワークロードには影響しません。 API サーバーを再起動するには、次の手順に従います。クラスター内の各コントロール プレーンの IP アドレスを取得します。
kubectl get nodes -o wide
次のコマンドを実行します。
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