从 Kubernetes 1.7.0 版本开始,使用 type LoadBalancer
创建的任何新 Service 都会默认启用节点运行状况检查功能(前提是集群中的所有节点都在运行 v1.7.0 或更高版本)。
但是,Kubernetes 1.7.0 和 1.7.1 版本中存在一个已知问题,此问题会导致节点错误地响应来自 GCP 网络负载平衡器的运行状况检查。发生这种情况时,由 Kubernetes 配置的网络负载平衡器会显示集群的所有节点一直无法通过运行状况检查,但流量仍会转发到后端。
尽管此问题已在 1.7.2 版本中得到修复,但在将现有集群从 1.7.0 或 1.7.1 版本升级到 1.7.2 时,您可能需要采取适当措施。升级可能会导致潜在的负载不平衡问题。对于运行 1.7.2 版本的节点,如果运行状况检查正常运行,GCP 负载平衡器会将所有流量从无法通过运行状况检查的运行 1.7.0 或 1.7.1 版本的节点转发到这些节点。如果没有足够的“运行状况良好”节点(例如,运行 1.7.2 版本的节点),无法处理集群的流量负载,那么这种不平衡情况可能会导致服务中断。
要缓解此问题,您可以先手动移除任何受影响负载平衡器上的运行状况检查,然后再将节点升级到版本 1.7.2。
确定您的集群是否会受到影响
如果您的集群节点运行的是 Kubernetes 版本 1.7.0 或 1.7.1,那么在完成以下任何操作后,您的集群可能会受到影响:
- 您创建了一个类型为
--type LoadBalancer
的新 Service。 - 您之前将类型为
--type LoadBalancer
的现有 Service 更新为其他类型(ClusterIP
、ExternalName
等),后来又将该 Service 的类型还原为LoadBalancer
。 - 您更新了现有
LoadBalancer
服务上的sessionAffinity
字段。 - 您将现有
LoadBalancer
服务上的externalTrafficPolicy
字段设置为Cluster
。
要确认您的集群是否会受到影响,请执行以下操作:
- 在 Google Cloud Console 中,导航到 GKE,然后选择您的集群。
- 点击发现和负载平衡标签页。
- 查找类型字段为
LoadBalancer
的服务,然后点击相应服务名称。 - 在服务详情窗格上,找到 LoadBalancer 字段。这是与您的集群关联的 GCP LoadBalancer 资源。
- 点击负载平衡器名称。
- 您应该会看到负载平衡窗格;查找关联的运行状况检查。如果存在名为
k8s-XXX-node
的关联运行状况检查,则说明您的集群会受到影响。
对集群上的所有负载平衡器服务重复上述步骤。
您可以使用高级菜单确定相应的 Kubernetes 服务,如下所示:
- 点击转发规则标签。
- 选择负载平衡器条目。
- 您应该会在说明字段中看到采用如下格式的服务名称:
{"kubernetes.io/service-name":"$NAMESPACE/$SERVICE_NAME"}
。
升级风险缓解措施
要缓解潜在的负载不平衡风险,并确保安全升级到 1.7.2 版本,请执行以下操作:
- 升级之前,手动从集群内所有受影响的负载平衡器中移除运行状况检查。
- 将节点升级到 1.7.2 版本。
- 升级之后,替换集群中每个负载平衡器上的运行状况检查。
升级前
要从负载平衡器中移除节点运行状况检查,请执行以下操作:
- 在 Google Cloud Console 中,导航到 GKE,然后选择您的集群。
- 点击发现和负载平衡标签页。
- 找到受影响的
LoadBalancer
服务,然后点击相应服务名称。 - 在服务详情窗格上,找到 LoadBalancer 字段。这是与您的集群关联的 GCP LoadBalancer 资源。
- 点击负载平衡器名称。
- 在负载平衡窗格上,点击高级菜单链接。
- 在高级菜单中,点击目标池。
- 1.记下运行状况检查名称
k8s-XXX-node
,其中XXX
是集群的哈希 ID。您以后需要使用该名称来恢复运行状况检查(如果需要的话)。 - 将负载平衡器的相应目标池修改为“不检查运行状况”。这项就地更新应该不会导致服务停机。
对集群上的每个受影响负载平衡器重复上述步骤。
移除运行状况检查后,您可以安全地将节点升级到 1.7.2 版本,而没有流量不平衡风险。 无论状态如何,GCP 负载平衡器都会继续将流量转发到节点,而不进行运行状况检查;这种行为与运行 Kubernetes 1.6.x 及更低版本的集群的行为相同。
升级后
升级完成后,您可以按如下方式替换集群负载平衡器上的节点运行状况检查:
- 在 Google Cloud Console 中,导航到您的集群。
- 点击发现和负载平衡标签页。
- 找到受影响的
LoadBalancer
服务,然后点击相应服务名称。 - 在服务详情窗格中,找到 LoadBalancer 字段;这是与您的集群关联的 GCP LoadBalancer 资源。
- 点击负载平衡器名称。
- 在负载平衡窗格上,点击高级菜单链接。
- 在高级菜单中,点击目标池。
- 将负载平衡器的相应目标池修改为升级前您在移除运行状况检查时记录的
k8s-XXX-node
格式的值。这项就地更新应该不会导致服务停机。
对集群上的每个受影响负载平衡器重复上述步骤。