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

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

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

Get-AksHciCredential PowerShell cmdlet 由与用于安装 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 及更早版本中存在一个已知 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. 关闭群集 (vm) 超过 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 [错误: 证书已过期: 已过期]”

如果超过 60 天未使用 mocctl 证书,该证书将过期。 AKS Arc 使用 mocctl 命令行工具与 MocStack 通信,以执行与 Moc 相关的操作。 该命令用于与 cloudagent 通信的 mocclt 证书将在 60 天后过期。 在大约 42 天) (使用证书时,该 mocctl 命令会自动续订证书。 如果不经常使用该命令,证书将过期。

若要重现该行为,请安装 AKS Arc,并且不会在 60 天内执行涉及该 mocctl 命令的操作。

若要解决此问题,请在证书过期后再次登录。 执行以下 PowerShell 命令登录:

Repair-MocLogin

如果 KVA 证书在 60 天后过期,请将其删除

如果未执行升级,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 Stack HCI 上的 Azure Kubernetes 服务的用户需要具有“完全控制”权限,才能在创建服务器和服务对象的 Active Directory 容器中创建 AD 对象。

提升用户的权限。

Uninstall-AksHciAdAuth 失败,出现错误“[来自服务器的错误 (NotFound) : secrets ”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