经典集群: 为什么在使用污点节点时源 IP 保留会失败?

经典基础设施

在经典集群中使用污点节点时,源 IP 保存失败,导致流量无法到达应用程序。

在经典群集中,通过在服务配置文件中将 externalTrafficPolicy 更改为 Local,可以为 1.0 版本的负载平衡器 服务启用源 IP 保护。 但是,没有流量到达应用程序的后端服务。

为负载平衡器服务启用源 IP 保留后,客户端请求的源 IP 地址将被保留。

服务仅将流量转发至同一工作程序节点上的应用程序 pod,以确保请求包的 IP 地址不变。 通常情况下,负载平衡器服务 pod 与应用程序 pod 部署在相同的工作节点上。 但是,在某些情况下,服务 pod 和应用程序 pod 可能未安排到同一工作程序节点上。 如果在工作节点上使用 Kubernetes 污点,则会阻止任何没有污点容忍度的 pod 在有污点的工作节点上运行。 根据使用的污点类型,源 IP 保留可能无效:

  • 边缘节点污点:您将 dedicated=edge 标签添加 到群集中每个公共 VLAN 上的两个或多个工作节点,以确保负载平衡器 pod 只部署到这些工作节点。 然后,您还污染了这些边缘节点,以防止其他任何工作负载在边缘节点上运行。 但是,您未将边缘节点亲缘关系规则和容忍度添加到应用程序部署。 因此,应用程序 pod 无法安排在服务 pod 所在的有污点节点上,所以没有任何流量到达应用程序的后端服务。

  • 定制污点:您在多个节点上使用了定制污点,以便只有具有该污点容忍度的应用程序 pod 可以部署到这些节点。 您在应用程序和负载平衡器服务的部署中添加了亲和规则和容忍度,这样它们的 pod 就只能部署到这些节点上。 不过,在 ibm-system 命名空间中自动创建的 ibm-cloud-provider-ip keepalived pod 可确保负载平衡器和应用程序 pod 始终调度到同一个工作节点上。 这些 keepalived pod 没有您使用的定制污点的容忍度。 因此,这些 pod 无法安排在运行应用程序 pod 的有污点节点上,所以没有任何流量到达应用程序的后端服务。

通过选择下列其中一个选项来解决此问题:

边缘节点污点:要确保负载均衡器和应用程序 pod 部署到有污点的边缘节点,请向应用程序部署添加边缘节点亲缘关系规则和容忍度。 负载平衡器 pod 默认具有这些亲和规则和容忍度。

定制污点:除去 keepalived pod 没有其容忍度的定制污点。 可以改为将工作程序节点标注为边缘节点,然后污染这些边缘节点

如果您完成了前面的选项之一,但 keepalived pod 仍未排程,您可以获取有关 keepalived pod 的更多信息:

  1. 获取 keepalived pod。

    oc get pods -n ibm-system
    
  2. 在输出中,查找 ibm-cloud-provider-ipStatus** 为 ** 的 Pending pod。 示例:

    ibm-cloud-provider-ip-169-61-XX-XX-55967b5b8c-7zv9t     0/1       Pending   0          2m        <none>          <none>
    ibm-cloud-provider-ip-169-61-XX-XX-55967b5b8c-8ptvg     0/1       Pending   0          2m        <none>          <none>
    
  3. 描述每个 keepalived pod,并查找 Events 部分。 解决列出的任何错误或警告消息。

    oc describe pod ibm-cloud-provider-ip-169-61-XX-XX-55967b5b8c-7zv9t -n ibm-system
    
  4. 解决问题后,通过检查负载平衡器服务端点来验证流量是否到达您的应用程序。

    oc get svc -o wide