使用本主题可帮助你排查和解决 AKS Arc 中的安全性和标识相关问题。
Get-AksHciCredential 失败,出现“找不到指定的路径”错误
当 Get-AksHciCredential
由不同于用于安装 AksHci 的管理员用户执行时,PowerShell cmdlet 将失败。 该命令将创建一个 .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
注意
此问题已在 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
该命令以查看群集现在是否可用。
注意
AksHci 版本 1.0.14.x 及更早版本中存在已知 bug。 如果控制平面 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
以检查它是否已修复。
无法访问目标群集 Pod 日志 - 远程错误:tls:内部错误
无法访问目标群集日志。 尝试访问目标群集中的 Pod 日志时,将显示以下 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 月及更高版本)的一部分。 更新到此版本的目标群集不应遇到此问题。
重现步骤
- 安装 AksHci。
- 安装目标群集。
- 不要升级群集 60 天。
- 重启群集。
症状和缓解措施
不应访问目标 Pod 日志。 针对目标群集运行的任何 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
注意
此问题已在 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 Pod 失败,KMS Pod 日志包含错误
此问题的一些可能症状如下:
kubectl get secrets
失败并出现内部错误。kubectl logs <kmspod-name> -n kube-system
包含错误。- 尝试创建 Pod 时,卷中的装载机密会失败。
- apiserver 无法启动。
运行以下命令,在 KMS Pod 日志中查找错误:
kubectl logs <kmspod-name> -n kube-system
如果日志返回有关管理群集 KMS Pod 中无效令牌的错误,请运行以下命令:
Update-AksHciCertificates
如果目标群集 KMS Pod 中存在无效令牌的错误,请运行以下命令:
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 本地部署和配置Azure Kubernetes 服务的用户需要具有完全控制权限才能在创建服务器和服务对象的 Active Directory 容器中创建 AD 对象。
提升用户的权限。
Uninstall-AksHciAdAuth 失败,出现错误“[服务器错误(NotFound):机密”keytab-akshci-scale-reliability“未找到]”
如果 Uninstall-AksHciAdAuth 显示此错误,应暂时忽略它,因为此问题将得到解决。
This issue will be fixed.
kubectl 日志返回“错误:必须登录到服务器(服务器已要求客户端提供凭据)”
AKS Arc 出现问题,群集可以停止返回日志。 发生这种情况时,运行 kubectl logs <pod_name>
将返回“错误:必须登录到服务器(服务器已要求客户端提供凭据)。” AKS Arc 每隔 4 天轮换核心 Kubernetes 证书,但有时 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)'
(可选)但不建议用于生产工作负荷,可以要求
kube-apiserver
不验证 kubelet 的服务器证书:kubectl logs <POD_NAME> --insecure-skip-tls-verify-backend=true