×

您可以使用位于网络边缘的节点配置OpenShift Container Platform集群。在本主题中,它们被称为远程工作节点。一个典型的包含远程工作节点的集群将内部部署的主节点和工作节点与位于其他位置并连接到集群的工作节点结合起来。本主题旨在提供有关使用远程工作节点的最佳实践的指导,并不包含具体的配置细节。

在电信、零售、制造和政府等不同行业中,有多种使用包含远程工作节点的部署模式的用例。例如,您可以通过将远程工作节点组合到Kubernetes区域来分离和隔离您的项目和工作负载。

但是,使用远程工作节点可能会导致更高的延迟、网络连接间歇性中断以及其他问题。包含远程工作节点的集群面临的挑战包括:

  • 网络隔离:OpenShift Container Platform控制平面和远程工作节点必须能够相互通信。由于控制平面和远程工作节点之间的距离,网络问题可能会阻止这种通信。请参阅使用远程工作节点进行网络隔离,了解OpenShift Container Platform如何响应网络隔离以及减少对集群影响的方法。

  • 断电:由于控制平面和远程工作节点位于不同的位置,远程位置或两者之间的任何点的断电都会对您的集群产生负面影响。请参阅远程工作节点断电,了解OpenShift Container Platform如何响应节点断电以及减少对集群影响的方法。

  • 延迟峰值或吞吐量暂时下降:与任何网络一样,集群和远程工作节点之间的任何网络状况变化都会对您的集群产生负面影响。OpenShift Container Platform提供多个工作程序延迟配置文件,让您可以控制集群对延迟问题的反应。

规划包含远程工作节点的集群时,请注意以下限制:

  • OpenShift Container Platform不支持使用与内部部署集群不同的云提供商的远程工作节点。

  • 由于系统和环境问题(例如,特定类型的内存在不同的区域中不可用),将工作负载从一个Kubernetes区域移动到另一个Kubernetes区域可能会出现问题。

  • 代理和防火墙可能会带来超出本文档范围的其他限制。请参阅相关的OpenShift Container Platform文档,了解如何解决此类限制,例如配置您的防火墙

  • 您负责配置和维护控制平面和网络边缘节点之间的L2/L3级网络连接。

添加远程工作节点

向集群添加远程工作节点需要一些额外的考虑。

  • 您必须确保已设置路由或默认网关以路由控制平面和每个远程工作节点之间的流量。

  • 您必须将 Ingress VIP 放置在控制平面上。

  • 添加使用用户预配基础设施的远程工作节点与添加其他工作节点相同。

  • 要在安装时向安装程序预配的集群添加远程工作节点,请在安装之前在install-config.yaml文件中指定每个工作节点的子网。DHCP服务器不需要其他设置。您必须使用虚拟介质,因为远程工作节点将无法访问本地预配网络。

  • 要将远程工作节点添加到使用预配网络部署的安装程序预配集群,请确保在install-config.yaml文件中将virtualMediaViaExternalNetwork标志设置为true,以便它可以使用虚拟介质添加节点。远程工作节点将无法访问本地预配网络。必须使用虚拟介质而不是PXE部署它们。此外,请在DHCP服务器中为每组远程工作节点和控制平面节点指定每个子网。

使用远程工作节点的网络隔离

所有节点每10秒向OpenShift Container Platform集群中的Kubernetes控制器管理器操作符(kube控制器)发送心跳。如果集群没有收到来自节点的心跳,OpenShift Container Platform将使用几种默认机制进行响应。

OpenShift Container Platform旨在能够抵抗网络分区和其他中断。您可以减轻一些常见的干扰,例如软件升级、网络分割和路由问题造成的中断。缓解策略包括确保远程工作节点上的Pod请求正确的CPU和内存资源量、配置适当的复制策略、跨区域使用冗余以及在工作负载上使用Pod中断预算。

如果kube控制器在配置的时间段后与节点失去联系,控制平面上的节点控制器会将节点健康状态更新为Unhealthy并将节点Ready状态标记为Unknown。作为响应,调度程序将停止向该节点调度Pod。本地节点控制器会添加一个具有NoExecute效果的node.kubernetes.io/unreachable污点到节点,并在默认情况下五分钟后安排对节点上Pod的驱逐。

如果工作负载控制器(例如Deployment对象或StatefulSet对象)正在将流量定向到不健康节点上的Pod,并且其他节点可以访问集群,则OpenShift Container Platform会将流量从节点上的Pod路由出去。无法访问集群的节点不会更新新的流量路由。结果,这些节点上的工作负载可能会继续尝试访问不健康的节点。

您可以通过以下方式减轻连接丢失的影响:

  • 使用守护进程集创建容忍污点的Pod

  • 使用静态Pod,如果节点宕机则自动重启

  • 使用Kubernetes区域来控制Pod驱逐

  • 配置Pod容忍度以延迟或避免Pod驱逐

  • 配置kubelet来控制其将节点标记为不健康的时间。

有关在具有远程工作节点的集群中使用这些对象的更多信息,请参阅关于远程工作节点策略

远程工作节点断电

如果远程工作节点断电或非正常重启,OpenShift Container Platform将使用几种默认机制进行响应。

如果Kubernetes控制器管理器操作符(kube控制器)在配置的时间段后与节点失去联系,控制平面会将节点健康状态更新为Unhealthy并将节点Ready状态标记为Unknown。作为响应,调度程序将停止向该节点调度Pod。本地节点控制器会添加一个具有NoExecute效果的node.kubernetes.io/unreachable污点到节点,并在默认情况下五分钟后安排对节点上Pod的驱逐。

在节点上,当节点恢复供电并重新连接到控制平面时,必须重启Pod。

如果希望Pod在重启时立即重启,请使用静态Pod。

节点重启后,kubelet也会重启并尝试重启在该节点上调度的Pod。如果与控制平面的连接时间超过默认的五分钟,控制平面无法更新节点健康状态并删除node.kubernetes.io/unreachable污点。在节点上,kubelet会终止任何正在运行的Pod。当这些条件清除后,调度程序就可以开始向该节点调度Pod了。

您可以通过以下方式减轻断电的影响:

  • 使用守护进程集创建容忍污点的Pod

  • 使用静态Pod,这些Pod会随节点自动重启

  • 配置Pod容忍度以延迟或避免Pod驱逐

  • 配置kubelet来控制节点控制器何时将节点标记为不健康的时间。

有关在具有远程工作节点的集群中使用这些对象的更多信息,请参阅关于远程工作节点策略

到远程工作节点的延迟峰值或吞吐量暂时降低

如果集群管理员已执行延迟测试以进行平台验证,他们可以发现需要调整集群的操作以确保在高延迟情况下集群的稳定性。集群管理员只需要更改一个记录在文件中的参数,该参数控制四个影响监督进程读取状态和解释集群健康状况的参数。仅更改一个参数就可以以一种简单易于支持的方式进行集群调整。

Kubelet进程为监控集群健康状况提供了起点。Kubelet为OpenShift Container Platform集群中的所有节点设置状态值。Kubernetes控制器管理器(kube控制器)默认每10秒读取一次状态值。如果kube控制器无法读取节点状态值,则在配置的时间段后会与该节点失去联系。默认行为是:

  1. 控制平面上的节点控制器会将节点健康状态更新为Unhealthy并将节点Ready状态标记为`Unknown`。

  2. 作为响应,调度程序将停止向该节点调度Pod。

  3. 节点生命周期控制器会添加一个具有NoExecute效果的node.kubernetes.io/unreachable污点到节点,并在默认情况下五分钟后安排对节点上Pod的驱逐。

如果您的网络容易出现延迟问题,尤其是在网络边缘有节点的情况下,此行为可能会导致问题。在某些情况下,由于网络延迟,Kubernetes控制器管理器可能无法从健康节点接收更新。Kubelet即使节点处于健康状态也会从节点中驱逐Pod。

为了避免这个问题,您可以使用工作负载延迟配置文件来调整Kubelet和Kubernetes控制器管理器在采取措施之前等待状态更新的频率。这些调整有助于确保您的集群在控制平面和工作节点之间的网络延迟不理想的情况下也能正常运行。

这些工作负载延迟配置文件包含三组参数,这些参数已预定义并经过仔细调整的值来控制集群对延迟增加的反应。无需手动实验查找最佳值。

您可以在安装集群时或在任何时候注意到集群网络延迟增加时配置工作负载延迟配置文件。

远程工作节点策略

如果您使用远程工作节点,请考虑使用哪些对象来运行您的应用程序。

建议根据您在网络问题或断电事件中所需的行为使用守护进程集或静态Pod。此外,如果控制平面无法访问远程工作节点,您可以使用Kubernetes区域和容差来控制或避免Pod驱逐。

守护进程集

由于以下原因,守护进程集是在远程工作节点上管理Pod的最佳方法:

  • 守护进程集通常不需要重新调度行为。如果节点与集群断开连接,节点上的 Pod 可以继续运行。OpenShift Container Platform 不会更改守护进程集 Pod 的状态,并保留 Pod 上次报告的状态。例如,如果守护进程集 Pod 处于运行中状态,当节点停止通信时,Pod 将继续运行,并被 OpenShift Container Platform 视为正在运行。

  • 默认情况下,守护进程集 Pod 会创建具有针对node.kubernetes.io/unreachablenode.kubernetes.io/not-ready污点的NoExecute容忍度,且没有tolerationSeconds值。这些默认值可确保如果控制平面无法访问节点,则永远不会驱逐守护进程集 Pod。例如

    默认情况下添加到守护进程集 Pod 的容忍度
      tolerations:
        - key: node.kubernetes.io/not-ready
          operator: Exists
          effect: NoExecute
        - key: node.kubernetes.io/unreachable
          operator: Exists
          effect: NoExecute
        - key: node.kubernetes.io/disk-pressure
          operator: Exists
          effect: NoSchedule
        - key: node.kubernetes.io/memory-pressure
          operator: Exists
          effect: NoSchedule
        - key: node.kubernetes.io/pid-pressure
          operator: Exists
          effect: NoSchedule
        - key: node.kubernetes.io/unschedulable
          operator: Exists
          effect: NoSchedule
  • 守护进程集可以使用标签来确保工作负载在匹配的工作节点上运行。

  • 您可以使用 OpenShift Container Platform 服务端点来负载均衡守护进程集 Pod。

如果 OpenShift Container Platform 无法访问节点,则守护进程集在节点重新引导后不会调度 Pod。

静态 Pod

如果您希望 Pod 在节点重新引导后(例如,断电后)重新启动,请考虑使用静态 Pod。节点上的 kubelet 会在节点重新启动时自动重启静态 Pod。

静态 Pod 无法使用密钥和配置映射。

Kubernetes 区域

Kubernetes 区域可能会降低速度,或者在某些情况下完全停止 Pod 驱逐。

当控制平面无法访问节点时,节点控制器默认会应用node.kubernetes.io/unreachable污点并以每秒 0.1 个节点的速度驱逐 Pod。但是,在使用 Kubernetes 区域的集群中,Pod 驱逐行为会发生改变。

如果区域完全中断,即区域中的所有节点的Ready状态为FalseUnknown,则控制平面不会将node.kubernetes.io/unreachable污点应用于该区域中的节点。

对于部分中断的区域,如果超过 55% 的节点具有FalseUnknown状态,则 Pod 驱逐速率将降低至每秒 0.01 个节点。对于节点数少于 50 个的小型集群,不会添加污点。您的集群必须拥有三个以上的区域才能生效。

您可以通过在节点规范中应用topology.kubernetes.io/region标签将节点分配到特定区域。

Kubernetes 区域的节点标签示例
kind: Node
apiVersion: v1
metadata:
  labels:
    topology.kubernetes.io/region=east
KubeletConfig 对象

您可以调整 kubelet 检查每个节点状态的时间量。

要设置影响本地节点控制器何时使用UnhealthyUnreachable状态标记节点的时间间隔,请创建一个包含node-status-update-frequencynode-status-report-frequency参数的KubeletConfig对象。

每个节点上的 kubelet 根据node-status-update-frequency设置确定节点状态,并根据node-status-report-frequency设置向集群报告该状态。默认情况下,kubelet 每 10 秒确定一次 Pod 状态,并每分钟报告一次状态。但是,如果节点状态发生更改,kubelet 会立即将更改报告给集群。OpenShift Container Platform 仅在启用 Node Lease 功能门(这是 OpenShift Container Platform 集群中的默认状态)时才使用node-status-report-frequency设置。如果禁用 Node Lease 功能门,则节点会根据node-status-update-frequency设置报告其状态。

Kubelet 配置示例
apiVersion: machineconfiguration.openshift.io/v1
kind: KubeletConfig
metadata:
  name: disable-cpu-units
spec:
  machineConfigPoolSelector:
    matchLabels:
      machineconfiguration.openshift.io/role: worker (1)
  kubeletConfig:
    node-status-update-frequency: (2)
      - "10s"
    node-status-report-frequency: (3)
      - "1m"
1 使用MachineConfig对象的标签指定此KubeletConfig对象适用的节点类型的类型。
2 指定 kubelet 检查与此MachineConfig对象关联的节点状态的频率。默认值为10s。如果更改此默认值,则node-status-report-frequency值将更改为相同的值。
3 指定 kubelet 报告与此MachineConfig对象关联的节点状态的频率。默认值为1m

node-status-update-frequency参数与node-monitor-grace-period参数配合使用。

  • node-monitor-grace-period参数指定在与MachineConfig对象关联的节点被标记为Unhealthy后,如果控制器管理器未收到节点心跳,OpenShift Container Platform 等待的时间长度。在此时间之后,节点上的工作负载将继续运行。如果远程工作节点在node-monitor-grace-period过期后重新加入集群,则 Pod 将继续运行。新的 Pod 可以调度到该节点。node-monitor-grace-period间隔为40snode-status-update-frequency值必须小于node-monitor-grace-period值。

不支持修改node-monitor-grace-period参数。

容忍度

如果本地节点控制器向其无法访问的节点添加具有NoExecute效果的node.kubernetes.io/unreachable污点,您可以使用 Pod 容忍度来减轻其影响。

具有NoExecute效果的污点会以以下方式影响在节点上运行的 Pod:

  • 不具有污点容忍度的 Pod 将排队等待驱逐。

  • 在它们的容忍度规范中未指定tolerationSeconds值的污点容忍度 Pod 将永远保持绑定。

  • 具有指定tolerationSeconds值的污点容忍度 Pod 将保持绑定指定的时间量。时间过后,Pod 将排队等待驱逐。

除非显式设置容忍度,否则 Kubernetes 会自动为node.kubernetes.io/not-readynode.kubernetes.io/unreachable添加具有tolerationSeconds=300的容忍度,这意味着如果检测到这些污点中的任何一个,Pod 将保持绑定 5 分钟。

您可以通过为node.kubernetes.io/unreachablenode.kubernetes.io/not-ready污点配置具有NoExecute效果的 Pod 容忍度来延迟或避免 Pod 驱逐。

Pod 规范中的容忍度示例
...
tolerations:
- key: "node.kubernetes.io/unreachable"
  operator: "Exists"
  effect: "NoExecute" (1)
- key: "node.kubernetes.io/not-ready"
  operator: "Exists"
  effect: "NoExecute" (2)
  tolerationSeconds: 600 (3)
...
1 没有tolerationSecondsNoExecute效果允许 Pod 在控制平面无法访问节点时永远保持运行。
2 具有tolerationSeconds: 600 的NoExecute效果允许 Pod 在控制平面将节点标记为Unhealthy时保持运行 10 分钟。
3 您可以指定您自己的tolerationSeconds值。
其他类型的 OpenShift Container Platform 对象

您可以使用副本集、部署和复制控制器。节点断开连接 5 分钟后,调度程序可以将这些 Pod 重新调度到其他节点。对于某些工作负载(例如 REST API),重新调度到其他节点可能很有益,管理员可以保证运行并访问特定数量的 Pod。

在使用远程工作节点时,如果远程工作节点旨在保留用于特定功能,则可能无法接受在不同节点上重新调度 Pod。

有状态集在出现中断时不会重新启动。Pod 将保持在terminating状态,直到控制平面确认 Pod 已终止。

为了避免调度到无法访问相同类型持久存储的节点,在网络隔离的情况下,OpenShift Container Platform 无法将需要持久卷的 Pod 迁移到其他区域。

其他资源