为什么工作程序节点显示 NetworkUnavailable
错误?
虚拟私有云 经典基础架构 Satellite
更新主节点或工作程序节点时,工作程序节点将进入 Node network unavailable
状态。
每当关闭 calico-node
pod 时,工作程序节点都可能进入 NetworkUnavailable
或 Node network unavailable
状态。 这可能在 Calico 补丁更新期间发生,但不应影响应用程序可用性。
更新 Calico 时,node.kubernetes.io/network-unavailable:NoSchedule
污点将添加到工作程序节点,并且 Node network unavailable
条件将变为 True
。 当 Calico 重新启动时,将清除这两种情况,这通常只需要几秒钟。
此时,您可能会看到类似下面的错误信息。
[Kubernetes] Node network unavailable is Triggered on kubernetes.node.name = 10.184.XXX.XXX
[Kubernetes] Node network unavailable is Triggered on kubernetes.node.name = 10.184.XXX.XXX
[Kubernetes] Node network unavailable is Triggered on kubernetes.node.name = 10.184.XXX.XXX
有时,重新启动可能需要更长时间。 在几乎所有情况下,重新启动都足够快,可以避免任何工作程序节点网络问题。 但是,在某些情况下,Calico 重新启动会延迟,因此可能会发生网络中断。 对于这些情况,节点网络不可用污点和条件旨在防止新应用程序部署到新节点,直到 Calico 和节点已修复为止。 Calico 更新以非常受控的方式进行推广,以便在发生节点问题时将总体应用程序影响降至最低。
使用 IBM Cloud Monitoring 监视 Node network unavailable
状态
通过使用服务来监视应用程序 (例如 IBM Cloud Monitoring),您可以配置工作程序节点何时进入 Node network unavailable
状态的警报,并在每次发生此情况时进行计数。 您还可以配置阈值并调整警报,以允许在例程 Calico 补丁期间工作程序节点处于 Node network unavailable
状态。
设置 IBM Cloud Monitoring 警报时,请考虑以下场景。
- 当
calico-node
pod 无法达到Running
状态,并且其容器重新启动计数继续增加时,Node network unavailable
警报可能会成为问题。 - 工作程序节点长期处于
Node network unavailable
状态。
在工作程序更新或替换之后,有时 calico-node
pod 仍不会在 Red Hat OpenShift VPC 集群上启动。 calico_node
pod 可能会陷入无法在 Red Hat OpenShift VPC 集群上启动的状态。 这不是 IKS 或经典集群上的问题。 当您安装了 sysdig-admission-controller-webhook
并尝试执行工作程序更新或替换时,可能会发生此情况。
发生这种情况的原因是:
- VPN 客户端 pod 在启动时将移至新工作程序。
- 新工作程序上的
calico-node
启动,但由于发出apiserver
调用并在 2 秒后超时而卡住。 - 然后,
apiserver
调用会尝试调用由于 VPN 客户机 pod 尝试在新节点上启动而失败的 Webhook。 VPN 节点无法成功执行此操作,因为calico-node
尚未启动。
总之,calico-node
pod 启动取决于 Webhook 工作; Webhook 取决于 VPN 客户端 pod; VPN 客户端 pod 依赖于 calico-node
启动。 系统陷入循环依赖关系。 如果您能够从成功部署的 calico-node
pod 收集日志,那么可能会看到类似如下的错误:
2022-09-08 07:13:19.719 [WARNING][9] startup/utils.go 228: Failed to set NetworkUnavailable; will retry error=Patch "https://172.21.0.1:443/api/v1/nodes/10.242.64.17/status?timeout=2s": net/http: request canceled (Client.Timeout exceeded while awaiting headers)
calico-node
的变通方法
您可以使用下列其中一种方法来解决此问题,并使 calico-node
pod 再次运行。
- 从系统中除去
sysdig-admission-controller-webhook
。 - 修改
sysdig-admission-controller-webhook
并将超时更改为小于 2 秒。 - 修改
sysdig-admission-controller-webhook
以将其作用域限定为相应的名称空间,并避免使用calico-system
之类的系统关键名称空间。 - 对新节点进行警戒,但不要将其排出。 删除 VPN pod 并等待其在另一个工作程序上启动。 解除节点的封锁。
执行任何先前的变通方法后,calico-node
pod 可以成功启动。