修复 AKS Arc 中的安全和标识已知问题和错误

使用本主题可帮助你排查和解决 AKS Arc 中的安全性和标识相关问题。

Get-AksHciCredential 失败,出现“找不到指定的路径”错误

Get-AksHciCredential 由不同于用于安装 AksHci 的管理员用户执行时,PowerShell cmdlet 将失败。 该命令将创建一个 .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 及更早版本中存在已知 bug。 如果控制平面 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. 检查运行该命令的用户是否与在 Azure Stack 或 Windows Server 上安装 AKS 的用户相同。 有关向多个用户授予访问权限的详细信息,请参阅 设置多个管理员
  2. 如果用户相同且错误仍然存在,请按照以下步骤解决此问题:
  • 通过删除 $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 月及更高版本)的一部分。 更新到此版本的目标群集不应遇到此问题。

重现步骤

  1. 安装 AksHci。
  2. 安装目标群集。
  3. 不要升级群集 60 天。
  4. 重启群集。

症状和缓解措施

不应访问目标 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

若要解决这一问题,请执行以下操作:

  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 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 服务器,请执行以下步骤:

    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)'
      
  • (可选)但不建议用于生产工作负荷,可以要求 kube-apiserver 不验证 kubelet 的服务器证书:

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