×

您可以将Windows工作负载调度到Windows计算节点。

先决条件

  • 您已使用Operator Lifecycle Manager (OLM)安装了Windows Machine Config Operator (WMCO)。

  • 您正在使用Windows容器作为操作系统镜像。

  • 您已创建Windows计算节点集。

Windows Pod放置

在将Windows工作负载部署到集群之前,必须配置Windows节点调度,以便正确分配Pod。由于您有一台托管Windows节点的机器,因此其管理方式与基于Linux的节点相同。同样,将Windows Pod调度到相应的Windows节点也以类似的方式完成,使用诸如污点、容忍度和节点选择器之类的机制。

使用多个操作系统以及能够在同一集群中运行多个Windows操作系统变体,必须使用RuntimeClass对象将Windows Pod映射到基本Windows操作系统变体。例如,如果您的多个Windows节点运行在不同的Windows Server容器版本上,则集群可能会将您的Windows Pod调度到不兼容的Windows操作系统变体。必须为集群上的每个Windows操作系统变体配置RuntimeClass对象。如果您只有一个Windows操作系统变体可用在集群中,也建议使用RuntimeClass对象。

有关更多信息,请参阅Microsoft关于主机和容器版本兼容性的文档。

此外,建议您在工作负载 Pod 中设置spec.os.name.windows参数。Windows 机器配置操作符 (WMCO) 使用此字段权威地标识 Pod 操作系统以进行验证,并用于强制执行特定于 Windows 的 Pod 安全上下文约束 (SCC)。目前,此参数对 Pod 调度没有影响。有关此参数的更多信息,请参阅Kubernetes Pod 文档

容器基础镜像必须与容器计划调度的节点上运行的 Windows 操作系统版本和内部版本号相同。

此外,如果您将 Windows 节点从一个版本升级到另一个版本,例如从 20H2 升级到 2022,则必须将您的容器基础镜像升级以匹配新版本。更多信息,请参阅Windows 容器版本兼容性

附加资源

创建 RuntimeClass 对象以封装调度机制

使用RuntimeClass对象简化了诸如污点和容忍度之类的调度机制的使用;您可以部署一个封装污点和容忍度的运行时类,然后将其应用于您的 Pod 以将其调度到相应的节点。在支持多个操作系统变体的集群中,创建运行时类也是必要的。

步骤
  1. 创建一个RuntimeClass对象 YAML 文件。例如,runtime-class.yaml

    apiVersion: node.k8s.io/v1
    kind: RuntimeClass
    metadata:
      name: windows2019 (1)
    handler: 'runhcs-wcow-process'
    scheduling:
      nodeSelector: (2)
        kubernetes.io/os: 'windows'
        kubernetes.io/arch: 'amd64'
        node.kubernetes.io/windows-build: '10.0.17763'
      tolerations: (3)
      - effect: NoSchedule
        key: os
        operator: Equal
        value: "windows"
      - effect: NoSchedule
        key: os
        operator: Equal
        value: "Windows"
    1 指定RuntimeClass对象的名称,该名称在您希望由此运行时类管理的 Pod 中定义。
    2 指定支持此运行时类的节点上必须存在的标签。使用此运行时类的 Pod 只能调度到与此选择器匹配的节点。运行时类的节点选择器与 Pod 的现有节点选择器合并。任何冲突都会阻止 Pod 调度到该节点。
    • 对于 Windows 2019,请指定node.kubernetes.io/windows-build: '10.0.17763'标签。

    • 对于 Windows 2022,请指定node.kubernetes.io/windows-build: '10.0.20348'标签。

    3 指定要在准入期间附加到使用此运行时类运行的 Pod 的容忍度,排除重复项。这将结合 Pod 和运行时类容忍的节点集。
  2. 创建RuntimeClass对象

    $ oc create -f <file-name>.yaml

    例如

    $ oc create -f runtime-class.yaml
  3. RuntimeClass对象应用于您的 Pod 以确保它被调度到相应的操作系统变体

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-windows-pod
    spec:
      runtimeClassName: windows2019 (1)
    # ...
    1 指定运行时类来管理 Pod 的调度。

Windows 容器工作负载部署示例

一旦您拥有可用的 Windows 计算节点,就可以将 Windows 容器工作负载部署到您的集群。

此部署示例仅供参考。

示例Service对象
apiVersion: v1
kind: Service
metadata:
  name: win-webserver
  labels:
    app: win-webserver
spec:
  ports:
    # the port that this service should serve on
  - port: 80
    targetPort: 80
  selector:
    app: win-webserver
  type: LoadBalancer
示例Deployment对象
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: win-webserver
  name: win-webserver
spec:
  selector:
    matchLabels:
      app: win-webserver
  replicas: 1
  template:
    metadata:
      labels:
        app: win-webserver
      name: win-webserver
    spec:
      containers:
      - name: windowswebserver
        image: mcr.microsoft.com/windows/servercore:ltsc2019 (1)
        imagePullPolicy: IfNotPresent
        command:
        - powershell.exe (2)
        - -command
        - $listener = New-Object System.Net.HttpListener; $listener.Prefixes.Add('http://*:80/'); $listener.Start();Write-Host('Listening at http://*:80/'); while ($listener.IsListening) { $context = $listener.GetContext(); $response = $context.Response; $content='<html><body><H1>Red Hat OpenShift + Windows Container Workloads</H1></body></html>'; $buffer = [System.Text.Encoding]::UTF8.GetBytes($content); $response.ContentLength64 = $buffer.Length; $response.OutputStream.Write($buffer, 0, $buffer.Length); $response.Close(); };
        securityContext:
          runAsNonRoot: false
          windowsOptions:
            runAsUserName: "ContainerAdministrator"
      os:
        name: "windows"
      runtimeClassName: windows2019 (3)
1 指定要使用的容器镜像:mcr.microsoft.com/powershell:<tag>mcr.microsoft.com/windows/servercore:<tag>。容器镜像必须与节点上运行的 Windows 版本匹配。
  • 对于 Windows 2019,使用ltsc2019标签。

  • 对于 Windows 2022,使用ltsc2022标签。

2 指定要在容器上执行的命令。
  • 对于mcr.microsoft.com/powershell:<tag>容器镜像,必须将命令定义为pwsh.exe

  • 对于mcr.microsoft.com/windows/servercore:<tag>容器镜像,必须将命令定义为powershell.exe

3 为集群上的 Windows 操作系统变体指定您创建的运行时类。

对 Windows CSI 驱动程序的支持

Red Hat OpenShift 对 Windows 容器的支持会在集群中的所有 Windows 节点上安装CSI 代理。CSI 代理是一个插件,使 CSI 驱动程序能够在节点上执行存储操作。

要将持久性存储与 Windows 工作负载一起使用,必须部署特定的 Windows CSI 驱动程序守护程序集,如存储提供商的文档中所述。默认情况下,WMCO 不会自动创建 Windows CSI 驱动程序守护程序集。请参阅Kubernetes CSI 开发人员文档中的生产驱动程序列表。

Red Hat 不提供对 Kubernetes CSI 开发人员文档中列出的第三方生产驱动程序的支持。

手动扩展计算机器集

要添加或删除计算机器集中的机器实例,您可以手动扩展计算机器集。

此指南与完全自动化的、安装程序预配的基础设施安装相关。自定义的、用户预配的基础设施安装没有计算机器集。

先决条件
  • 安装 OpenShift Container Platform 集群和oc命令行。

  • 以具有cluster-admin权限的用户身份登录到oc

步骤
  1. 通过运行以下命令查看集群中的计算机器集

    $ oc get machinesets.machine.openshift.io -n openshift-machine-api

    计算机器集以<clusterid>-worker-<aws-region-az>的形式列出。

  2. 通过运行以下命令查看集群中的计算机器

    $ oc get machines.machine.openshift.io -n openshift-machine-api
  3. 通过运行以下命令设置要删除的计算机器上的注释

    $ oc annotate machines.machine.openshift.io/<machine_name> -n openshift-machine-api machine.openshift.io/delete-machine="true"
  4. 通过运行以下命令之一来缩放计算机器集

    $ oc scale --replicas=2 machinesets.machine.openshift.io <machineset> -n openshift-machine-api

    或者

    $ oc edit machinesets.machine.openshift.io <machineset> -n openshift-machine-api

    或者您可以应用以下 YAML 来缩放计算机器集

    apiVersion: machine.openshift.io/v1beta1
    kind: MachineSet
    metadata:
      name: <machineset>
      namespace: openshift-machine-api
    spec:
      replicas: 2

    您可以向上或向下缩放计算机器集。新机器需要几分钟才能可用。

    默认情况下,机器控制器会尝试清空由机器支持的节点,直到成功为止。在某些情况下,例如 Pod 中断预算配置错误,清空操作可能无法成功。如果清空操作失败,则机器控制器无法继续删除机器。

    您可以通过在特定机器中添加注释machine.openshift.io/exclude-node-draining来跳过清空节点。

验证
  • 通过运行以下命令验证是否已删除目标机器

    $ oc get machines.machine.openshift.io