适用于:Azure Stack HCI 上的 AKS、Windows Server 上的 AKS 使用本主题可帮助你排查和解决与 AKS Arc 相关的网络问题。
错误:“无法在故障转移群集中启动云代理通用群集服务。 群集资源组处于“失败”状态。
使用包含空格的路径名称时,云代理可能无法成功启动。
使用 Set-AksHciConfig 指定路径名包含空格字符(例如 D:\Cloud Share\AKS HCI
)的 、-workingDir
、-cloudConfigLocation
或 -nodeConfigLocation
参数时,云代理群集服务将无法启动,并显示以下(或类似)错误消息:
Failed to start the cloud agent generic cluster service in failover cluster. The cluster resource group os in the 'failed' state. Resources in 'failed' or 'pending' states: 'MOC Cloud Agent Service'
若要解决此问题,请使用不包含空格的路径,例如 C:\CloudShare\AKS-HCI
。
连接 Arc 的群集具有空的 JSON“分布”属性
Azure Arc for Kubernetes 连接的群集可以将 JSON 属性 distribution
的值设置为空字符串。 对于连接 AKS Arc 的群集,此值在初始安装期间设置,在部署的生存期内永远不会更改。
若要重现此问题,请打开Azure PowerShell窗口并运行以下命令:
az login
az account set --subscription <sub_id>
az connectedk8s show -g <rg_name> -n
下面是此命令的示例输出:
{
"agentPublicKeyCertificate": <value>
"agentVersion": "1.8.14",
"azureHybridBenefit": "NotApplicable",
"connectivityStatus": "Connected",
"distribution": "",
"distributionVersion": null,
"id": "/subscriptions/<subscription>/resourceGroups/<resource group>/providers/Microsoft.Kubernetes/connectedClusters/<cluster name>",
"identity": {
"principalId": "<principal id>",
"tenantId": "<tenant id>",
"type": "SystemAssigned"
},
"infrastructure": "azure_stack_hci",
"kubernetesVersion": "1.23.12",
"lastConnectivityTime": "2022-11-04T14:59:59.050000+00:00",
"location": "eastus",
"managedIdentityCertificateExpirationTime": "2023-02-02T14:24:00+00:00",
"miscellaneousProperties": null,
"name": "mgmt-cluster",
"offering": "AzureStackHCI_AKS_Management",
"privateLinkScopeResourceId": null,
"privateLinkState": "Disabled",
"provisioningState": "Succeeded",
"resourceGroup": "<resource group>",
"systemData": {
"createdAt": "2022-11-04T14:29:17.680060+00:00",
"createdBy": "<>",
"createdByType": "Application",
"lastModifiedAt": "2022-11-04T15:00:01.830067+00:00",
"lastModifiedBy": "64b12d6e-6549-484c-8cc6-6281839ba394",
"lastModifiedByType": "Application"
},
"tags": {},
"totalCoreCount": 4,
"totalNodeCount": 1,
"type": "microsoft.kubernetes/connectedclusters"
}
解决此问题
如果 JSON distribution
属性的输出返回空字符串,请按照以下说明修补群集:
将以下配置复制到名为 patchBody.json 的文件中:
{ "properties": { "distribution": "aks_management" } }
重要
如果群集是 AKS 管理群集,则 值应设置为
aks_management
。 如果是工作负荷群集,则应将其设置为aks_workload
。从上面获取的 JSON 输出中,复制连接的群集 ID。 它应显示为采用以下格式的长字符串:
"/subscriptions/<subscription >/resourceGroups/<resource group>/providers/Microsoft.Kubernetes/connectedClusters/<cluster name>",
运行以下命令来修补群集。 该值
<cc_arm_id>
应为在步骤 2 中获取的 ID:az rest -m patch -u "<cc_arm_id>?api-version=2022-10-01-preview" -b "@patchBody.json"
通过运行
az connectedk8s show -g <rg_name> -n <cc_name>
检查群集是否已成功修补,以确保 JSON 属性distribution
已正确设置。
WSSDAgent 服务在启动时停滞,无法连接到云代理
症状:
- 在 AKS Arc 中启用了代理。WSSDAgent 服务停滞在
starting
状态。 如下所示: -
Test-NetConnection -ComputerName <computer IP/Name> -Port <port>
从节点代理失败到云代理在系统 (正常运行,即使 wssdagent 无法启动) - Curl.exe 从代理失败的节点上向云代理重现问题并卡住:
curl.exe https://<computerIP>:6500
- 若要解决此问题,请将
--noproxy
标志传递给 curl.exe。 Curl 从 wssdcloudagent 返回错误。 这是预期的,因为 curl 不是 GRPC 客户端。 发送--noproxy
标志时,Curl 不会卡在等待。 因此,返回错误被视为成功) :
curl.exe --noproxy '*' https://<computerIP>:65000
代理设置很可能已更改为主机上有故障的代理。 AKS Arc 的代理设置是从主机上的父进程继承的环境变量。 仅当新服务启动或旧服务更新或重新启动时,才会传播这些设置。 可能是在主机上设置了错误的代理设置,并在更新或重新启动后传播到 WSSDAgent,这导致 WSSDAgent 失败。
需要通过更改计算机上的环境变量来修复代理设置。 在计算机上,使用以下命令更改变量:
[Environment]::SetEnvironmentVariable("https_proxy", <Value>, "Machine")
[Environment]::SetEnvironmentVariable("http_proxy", <Value>, "Machine")
[Environment]::SetEnvironmentVariable("no_proxy", <Value>, "Machine")
重新启动计算机,以便服务管理器和 WSSDAgent 选取固定代理。
CAPH Pod 无法续订证书
发生此错误的原因是,每次启动 CAPH Pod 时,都会尝试登录到 cloudagent,并将证书存储在临时存储卷中,这将在 Pod 重启时清除。 因此,每次重启 Pod 时,都会销毁证书并尝试新的登录。
登录尝试将启动一个续订例程,该例程会在证书即将过期时续订证书。 如果证书可用,CAPH Pod 决定是否需要登录名。 如果证书可用,则不会尝试登录,前提是续订例程已存在。
但是,在容器重启时,临时目录不会清理,因此文件仍会保留,并且不会进行登录尝试,从而导致无法启动续订例程。 这会导致证书过期。
若要缓解此问题,请使用以下命令重启 CAPH Pod:
kubectl delete pod pod-name
Set-AksHciConfig 失败并出现 WinRM 错误,但显示 WinRM 配置正确
运行 Set-AksHciConfig 时,可能会遇到以下错误:
WinRM service is already running on this machine.
WinRM is already set up for remote management on this computer.
Powershell remoting to TK5-3WP08R0733 was not successful.
At C:\Program Files\WindowsPowerShell\Modules\Moc\0.2.23\Moc.psm1:2957 char:17
+ ... throw "Powershell remoting to "+$env:computername+" was n ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : OperationStopped: (Powershell remo...not successful.:String) [], RuntimeException
+ FullyQualifiedErrorId : Powershell remoting to TK5-3WP08R0733 was not successful.
大多数时候,发生此错误是因为用户安全令牌更改(由于组成员身份更改)、密码更改或密码过期。 在多数情况下,可以通过从计算机注销并重新登录来修正该问题。 如果错误仍然存在,可以通过Azure 门户创建支持票证。
AKS Arc 群集停滞在“ScalingControlPlane”预配状态
此问题会导致 AKS Arc 群集长时间保持 ScalingControlPlane 状态。
重现步骤
Get-AksHciCluster -Name <cluster name> | select *
Status : {ProvisioningState, Details}
ProvisioningState : ScalingControlPlane
KubernetesVersion : v1.22.6
PackageVersion : v1.22.6-kvapkg.0
NodePools : {nodepoolA, nodepoolB}
WindowsNodeCount : 0
LinuxNodeCount : 1
ControlPlaneNodeCount : 1
ControlPlaneVmSize : Standard_D4s_v3
AutoScalerEnabled : False
AutoScalerProfile :
Name : <cluster name>
此问题已在最新的 AKS Arc 版本中修复。 建议将 AKS Arc 群集更新到最新版本。
若要缓解此问题,请联系支持人员手动修补控制平面节点的状态,以便通过 kubectl 从计算机状态中删除条件 MachineOwnerRemediatedCondition 。
找不到工作负载群集
如果 Azure Stack HCI 部署上的两个 AKS 的 IP 地址池相同或重叠,则可能找不到工作负载群集。 如果部署两个 AKS 主机并同时对两者使用相同的AksHciNetworkSetting
配置,则 PowerShell 和 Windows Admin Center 可能无法找到工作负载群集,因为 API 服务器将在两个群集中分配相同的 IP 地址,从而导致冲突。
收到的错误消息将如下所示。
A workload cluster with the name 'clustergroup-management' was not found.
At C:\Program Files\WindowsPowerShell\Modules\Kva\0.2.23\Common.psm1:3083 char:9
+ throw $("A workload cluster with the name '$Name' was not fou ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : OperationStopped: (A workload clus... was not found.:String) [], RuntimeException
+ FullyQualifiedErrorId : A workload cluster with the name 'clustergroup-management' was not found.
注意
群集名称将有所不同。
若要解决此问题,请删除其中一个群集,并创建一个新的 AKS 群集网络设置,该设置具有与其他群集不重叠的网络。
Get-AksHCIClusterNetwork 不显示 IP 地址的当前分配
运行 Get-AksHciClusterNetwork 命令将获得所有虚拟网络配置的列表。 但是,该命令不会显示 IP 地址的当前分配。
若要查看虚拟网络中当前使用的 IP 地址,请执行以下步骤:
- 若要获取组,请运行以下命令:
Get-MocGroup -location MocLocation
- 若要获取当前使用的 IP 地址的列表以及可用或已使用的虚拟 IP 地址的列表,请运行以下命令:
Get-MocNetworkInterface -Group <groupName> | ConvertTo-Json -depth 10
- 使用以下命令查看当前使用的虚拟 IP 地址的列表:
Get-MocLoadBalancer -Group <groupName> | ConvertTo-Json -depth 10
“群集 IP 地址 x.x.x.x”失败
预检查期间,群集 IP 地址显示为“失败”。 此预检查测试所有 IPv4 地址和 DNS 网络名称是否都联机且可访问。 例如,IPv4 或网络名称失败可能会导致此测试失败。
若要解决此问题,请执行以下步骤:
运行以下命令:
Get-ClusterGroup -name "Cluster Group" | Get-ClusterResource
确保所有网络名称和 IP 地址都处于联机状态。
运行以下两个命令:
Stop-ClusterResource -name "Cluster IP Address x.x.x.x"
然后
Start-ClusterResource -name "Cluster IP Address x.x.x.x"
使用配置错误的网络部署 Azure Stack HCI 上的 AKS 时,部署在不同时间点超时
在 Azure Stack HCI 上部署 AKS 时,部署可能会在过程的不同点超时,具体取决于错误配置发生的位置。 应查看错误消息,确定原因及其发生位置。
例如,在下面的错误中,发生配置错误的点在 Get-DownloadSdkRelease -Name "mocstack-stable"
中:
$vnet = New-AksHciNetworkSettingSet-AksHciConfig -vnet $vnetInstall-AksHciVERBOSE:
Initializing environmentVERBOSE: [AksHci] Importing ConfigurationVERBOSE:
[AksHci] Importing Configuration Completedpowershell :
GetRelease - error returned by API call:
Post "https://msk8s.api.cdp.microsoft.com/api/v1.1/contents/default/namespaces/default/names/mocstack-stable/versions/0.9.7.0/files?action=generateDownloadInfo&ForegroundPriority=True":
dial tcp 52.184.220.11:443: connectex:
A connection attempt failed because the connected party did not properly
respond after a period of time, or established connection failed because
connected host has failed to respond.At line:1 char:1+ powershell -command
{ Get-DownloadSdkRelease -Name "mocstack-stable"}
这表示物理 Azure Stack HCI 节点可以解析下载 URL msk8s.api.cdp.microsoft.com
的名称,但该节点无法连接到目标服务器。
若要解决此问题,需要确定连接流中发生中断的位置。 下面是尝试从物理群集节点解决问题的一些步骤:
- Ping 目标 DNS 名称:ping
msk8s.api.cdp.microsoft.com
。 - 如果收到响应且没有超时,则表示基本网络路径正常运行。
- 如果连接超时,则可能是数据路径中发生了中断。 有关详细信息,请参阅检查代理设置。 或者,可能是返回路径中发生了中断,因此应检查防火墙规则。
NTP 时间相关的应用程序触发数百个错误警报
NTP 时间相关的应用程序在时间同步时可能会触发数百个错误警报。如果群集在代理环境中运行,则节点池可能无法通过代理或防火墙与默认 NTP 服务器 (time.windows.com)通信。
解决方法
若要解决此问题,请更新每个节点池节点上的 NTP 服务器配置以同步时钟。 这样做也会在每个应用程序 Pod 中设置时钟。
先决条件
- 可在每个节点池节点中访问的 NTP 服务器的地址。
- 对工作负载群集 kubeconfig 文件的访问权限。
- 访问管理群集 kubeconfig。
步骤
使用工作负载群集 kubeconfig 运行以下命令
kubectl
,获取其中节点的列表:kubectl --kubeconfig <PATH TO KUBECONFIG> get nodes -owide
运行以下命令
kubectl
,将上一命令中的节点名称与工作负载群集的节点池节点相关联。 记下上一命令输出中的相关 IP 地址。kubectl --kubeconfig (Get-KvaConfig).kubeconfig get machine -l cluster.x-k8s.io/cluster-name=<WORKLOAD_CLUSTER_NAME>
使用前面步骤的输出,对需要更新 NTP 配置的每个 nodepool 节点运行以下步骤:
通过 SSH 连接到节点池节点 VM:
ssh -o StrictHostKeyChecking=no -i (Get-MocConfig).sshPrivateKey clouduser@<NODEPOOL_IP>
验证配置的 NTP 服务器是否无法访问:
sudo timedatectl timesync-status
如果输出如下所示,则 NTP 服务器无法访问,需要对其进行更改:
Server: n/a (time.windows.com) Poll interval: 0 (min: 32s; max 34min 8s) Packet count: 0
若要更新 NTP 服务器,请运行以下命令,将 timesync 配置文件中的 NTP 服务器设置为可从节点池 VM 访问的服务器:
# make a backup of the config file sudo cp /etc/systemd/timesyncd.conf ~/timesyncd.conf.bak # update the ntp server NTPSERVER="NEW_NTP_SERVER_ADDRESS" sudo sed -i -E "s|^(NTP=)(.*)$|\1$NTPSERVER|g" /etc/systemd/timesyncd.conf # verify that the NTP server is updated correctly - check the value for the field that starts with "NTP=" sudo cat /etc/systemd/timesyncd.conf
重启 timesync 服务:
sudo systemctl restart systemd-timesyncd.service
验证 NTP 服务器是否可访问:
sudo timedatectl timesync-status
验证时钟是否显示正确的时间:
date
通过运行步骤 3.f 中的 命令,确保每个 nodepool 节点显示相同的时间。
如果应用程序未自动更新其时间,请重启其 Pod。