为什么网络状态显示 NHC007 错误?

虚拟私有云

排查网络健康检查错误 NHC007。

当您运行 ibmcloud oc cluster health issues --cluster <CLUSTER_ID> 检查群集的健康状况时,您会看到与下例类似的错误。

ID       Component   Severity   Description
NHC007   Network     Warning    One or more DNS resolvers are not reachable from certain worker nodes.

如果检查问题的详细信息,就会看到哪个 DNS 解析器无法从哪个工作节点访问。

ibmcloud ks cluster health issue get --cluster <CLUSTER_ID> --issue NHC007

此警告表明,可能由于限制性策略或 IaaS-level 配置,来自某些工作节点的 DNS 流量被阻止。

检查您的 Calico HostEndpoint (HEP) 和 GlobalNetworkPolicy (GNP) 资源,以及您的 ACL、安全组和任何其他可能阻止出站 DNS 流量的网络设备。

  1. 查看 Calico HostEndpoint (HEP) 资源,列出 Calico HEP,并检查是否有任何 HEP 配置可能会错误地将限制应用于工作节点接口。

    kubectl get hostendpoints.crd.projectcalico.org
    

    用于描述特定 HEP 的示例命令。

    kubectl describe hostendpoints.crd.projectcalico.org <hep-name>
    
  2. 审查 Calico GlobalNetworkPolicies (GNP),列出 GNP。

    kubectl get globalnetworkpolicies.crd.projectcalico.org
    
  3. 检查限制性 DNS 规则的具体策略。 重点关注影响端口 53 或适用于节点标签/选择器的 egress 规则。

    kubectl get globalnetworkpolicies.crd.projectcalico.org <policy-name> -o yaml
    
  4. 从调试 Pod 测试 DNS 访问,运行一个临时调试 Pod,并在其中将 nodeName 的值替换为受影响的 worker 节点名称。 如果 DNS 在这里出现故障,可能是由于基础设施层面的阻塞造成的。

    kubectl run  -i --tty debug \
      --image=us.icr.io/armada-master/network-alpine:latest \
      --restart=Never \
      --overrides='
    {
      "apiVersion": "v1",
      "spec": {
        "nodeName": "<node-name>"
      }
    }' -- sh
    
  5. 在调试 pod 中运行以下命令。

    nslookup ibm.com
    
    dig ibm.com
    
  6. 检查访问控制列表(ACL)。

    • 在控制台中,导航至 VPC > 访问控制列表,确保出站规则允许 UDP 端口 53 和 TCP 端口 53。

    • 在 CLI 中运行以下命令检查 ACL。

        ibmcloud is network-acls
        ```
        ```sh {: pre}
        ibmcloud is network-acl <acl-id>
        ```
    
  7. 检查安全组规则,找到与工作节点相关的安全组,然后运行检查安全组设置。 确保没有阻止 DNS 流量的出站规则( UDP / TCP 端口 53)。

    ibmcloud is security-group-rules <security-group-id>
    
  8. 检查您的基础设施(网络设备、ACL 等),允许 UDP 和 TCP 端口 53 向外流量

  9. 如果在查看这些项目后 DNS 仍然无法访问,请联系支持人员。 打开 支持案例。 在案例详细信息中,请务必包含任何相关日志文件、错误信息或命令输出。