部署 OpenShift 沙盒容器


OpenShift sandboxed containers 1.10

增强了容器工作负载的安全性和隔离

Red Hat Customer Content Services

摘要

Red Hat OpenShift 沙盒容器通过在轻量级虚拟机中运行容器化应用程序来提供增强的安全性和隔离功能。您可以在 OpenShift Container Platform 集群上安装 OpenShift 沙盒容器 Operator。然后,您可以将工作负载 pod 配置为使用可选的 "kata" 运行时。

前言

对红帽文档提供反馈

您可以通过提交 JIRA 中的 Create Issue 表单来提供反馈或报告错误:

  1. 确保您已登录到 Jira。如果您没有 JIRA 帐户,您必须创建一个 Red Hat Jira account
  2. 启动 Create Issue 表单
  3. 完成 SummaryDescriptionReporter 字段。

    Description 字段中,包含文档 URL、章节号以及问题的详细描述。

  4. Create

第 1 章 关于 OpenShift 沙盒容器

Red Hat OpenShift 沙盒容器将 Kata 容器集成为可选运行时,通过在轻量级虚拟机中运行容器化应用程序来提供增强的安全性和隔离功能。此集成为敏感工作负载提供了一个更安全的运行时环境,而无需对现有 OpenShift Container Platform 工作流进行大量更改。此运行时支持专用虚拟机(VM)中的容器,从而改进了工作负载隔离。

1.1. 功能

OpenShift 沙盒容器提供以下功能:

运行特权或不受信任的工作负载

您可以安全地运行需要特定特权的工作负载,而无需通过运行特权容器来破坏集群节点的风险。需要特殊权限的工作负载包括:

  • 需要内核的特殊功能的工作负载,除了标准容器运行时(如 CRI-O)授予的默认功能外,例如访问低级别网络功能。
  • 需要提高 root 特权的工作负载,例如访问特定物理设备。使用 OpenShift 沙盒容器时,只能将特定的设备传递给虚拟机(VM),确保工作负载无法访问或错误配置系统的其余部分。
  • 用于安装或使用 set-uid root 二进制文件的工作负载。这些二进制文件授予特殊权限,因此可能会造成安全风险。使用 OpenShift 沙盒容器时,对虚拟机有额外的权限,不授予对集群节点的特殊访问权限。

    有些工作负载需要专门用于配置集群节点的权限。此类工作负载应该仍然使用特权容器,因为在虚拟机上运行可能会阻止它们正常工作。

确保敏感工作负载的隔离
Red Hat OpenShift Container Platform 的 OpenShift 沙盒容器将 Kata 容器集成为可选运行时,通过在轻量级虚拟机中运行容器化应用程序来提供增强的安全性和隔离功能。此集成为敏感工作负载提供了一个更安全的运行时环境,而无需对现有 OpenShift 工作流进行大量更改。此运行时支持专用虚拟机(VM)中的容器,从而改进了工作负载隔离。
确保每个工作负载的内核隔离
您可以运行需要自定义内核调整(如 sysctl、调度程序更改或缓存调整)以及创建自定义内核模块(如 树外 或特殊参数)的工作负载。
在租户间共享相同的工作负载
您可以从共享同一 OpenShift Container Platform 集群的不同机构运行支持许多用户(租户)的工作负载。系统还支持从多个供应商运行第三方工作负载,如容器网络功能(CNF)和企业应用程序。例如,第三方 CNF 可能不希望其自定义设置与数据包调整或由其他应用程序设置的 sysctl 变量干扰。在完全隔离的内核内运行有助于防止"邻居噪音"配置问题。
确保正确隔离和沙盒测试软件
您可以使用已知漏洞运行容器化工作负载,或处理现有应用程序中的问题。通过这种隔离,管理员可以为开发人员提供对 pod 的管理控制,这在开发人员想要测试或验证管理员通常授予的配置时很有用。例如,管理员可以安全地将内核数据包过滤(eBPF)委派给开发人员。eBPF 需要 CAP_ADMINCAP_BPF 特权,因此不允许在标准 CRI-O 配置下,因为这会授予容器主机 worker 节点上的每个进程的访问权限。同样,管理员可以授予对 SystemTap 等入侵工具的访问权限,或者支持在开发期间加载自定义内核模块。
确保通过虚拟机边界的默认资源控制
默认情况下,OpenShift 沙盒容器以强大和安全的方式管理 CPU、内存、存储和网络等资源。由于 OpenShift 沙盒容器部署到虚拟机上,因此额外的隔离层和安全性可为资源提供更精细的访问控制。例如,错误容器将无法为虚拟机分配超过可用内存更多的内存。相反,需要专用访问网卡或磁盘的容器可以完全控制该设备,而无需访问其他设备。

1.2. 与 OpenShift Container Platform 的兼容性

Red Hat OpenShift Container Platform 所需的功能由两个主要组件支持:

Kata 运行时
Kata 运行时包含在 Red Hat Enterprise Linux CoreOS (RHCOS)中,并接收每个 OpenShift Container Platform 版本的更新。当使用 Kata 运行时启用对等 pod 时,OpenShift 沙盒容器 Operator 需要外部网络连接才能拉取所需的镜像组件和帮助程序实用程序来创建 pod 虚拟机(VM)镜像。
OpenShift 沙盒容器 Operator
OpenShift 沙盒容器 Operator 是一个 Rolling Stream Operator,这意味着最新版本是唯一受支持的版本。它可用于所有当前支持的 OpenShift Container Platform 版本。

Operator 依赖于 RHCOS 主机及其在其中运行的环境的功能。

注意

您必须在 worker 节点上安装 RHCOS。不支持 Red Hat Enterprise Linux (RHEL)节点。

OpenShift 沙盒容器和 OpenShift Container Platform 的以下兼容性列表用于标识兼容的功能和环境。

Expand
表 1.1. 支持的构架
架构OpenShift Container Platform 版本

x86_64

4.16 或更高版本

s390x

4.16 或更高版本

部署 Kata 容器运行时的方法有两种:

  • 裸机
  • 对等 pod

您可以通过在 Microsoft Azure Cloud Computing Services、AWS Cloud Computing Services 或 Google Cloud 上使用对等 pod 部署 OpenShift 沙盒容器。随着 OpenShift 沙盒容器 1.10 的发布,OpenShift 沙盒容器 Operator 需要 OpenShift Container Platform 版本 4.16 或更高版本。

Expand
表 1.2. OpenShift Container Platform 版本的功能可用性
功能部署方法OpenShift Container Platform 4.16OpenShift Container Platform 4.17OpenShift Container Platform 4.18OpenShift Container Platform 4.19

机密容器

裸机

N/A

不适用

不适用

N/A

Azure peer pod

GA

GA

GA

GA

GPU 支持

裸机

N/A

不适用

不适用

N/A

IBM Z

N/A

不适用

不适用

N/A

Azure

开发者预览

开发者预览

开发者预览

开发者预览

AWS

开发者预览

开发者预览

开发者预览

开发者预览

Google Cloud

开发者预览

开发者预览

开发者预览

开发者预览

重要

对对等 pod 的 GPU 支持只是一个技术预览功能。Developer Preview(开发人员预览)功能不被红帽支持,其功能可能并不完善且不是生产环境就绪。不要将开发人员预览功能用于生产环境或业务关键型工作负载。开发人员预览功能可以在之前可能地包含在红帽产品产品中提前访问即将推出的产品功能,使客户能够测试功能并在开发过程中提供反馈。这些功能可能没有任何文档,可能会随时被更改或删除,测试也会受到限制。红帽可能会提供在没有关联 SLA 的情况下提交对开发人员预览功能的反馈。

Expand
表 1.3. 支持的云平台(osc)
平台GPU机密容器

Azure

开发者预览

GA

AWS

开发者预览

N/A

Google Cloud

开发者预览

N/A

1.3. 节点资格检查

您可以通过运行节点资格检查来验证您的裸机集群节点是否支持 OpenShift 沙盒容器。节点不合格的最常见原因是没有虚拟化支持。如果您在不符合节点上运行沙盒工作负载,则会出现错误。

高级工作流

  1. 安装 Node Feature Discovery Operator。
  2. 创建 NodeFeatureDiscovery 自定义资源(CR)。
  3. 在创建 Kataconfig CR 时启用节点资格检查。您可以在所有 worker 节点或所选节点上运行节点资格检查。

1.4. 常见术语

以下是整个文档中所使用的术语:

Sandbox

沙盒(sandbox)是一种隔离的环境,程序可以在其中运行。在沙盒中,您可以运行未经测试或不受信任的程序,而不影响到主机机器或操作系统。

在 OpenShift 沙盒容器环境中,沙盒通过使用虚拟化在不同的内核中运行工作负载来实现,从而增强了对在同一主机上运行的多个工作负载之间的交互的控制。

Pod

pod 是继承自 Kubernetes 和 OpenShift Container Platform 的构造。它代表了可以部署容器的资源。容器在 pod 内运行,pod 用于指定可在多个容器之间共享的资源。

在 OpenShift 沙盒容器上下文中,pod 被实施为一个虚拟机。多个容器可以在同一虚拟机上在同一 pod 中运行。

OpenShift 沙盒容器 Operator
OpenShift 沙盒容器 Operator 管理集群上沙盒容器的生命周期。您可以使用 OpenShift 沙盒容器 Operator 来执行任务,如安装和删除沙盒容器、软件更新和状态监控。
Kata 容器
Kata 容器是一个上游核心项目,用于构建 OpenShift 沙盒容器。OpenShift 沙盒容器将 Kata 容器与 OpenShift Container Platform 集成。
KataConfig
KataConfig 对象代表沙盒容器的配置。它们存储有关集群状态的信息,如部署软件的节点。
运行时类
RuntimeClass 对象描述了用于运行给定工作负载的运行时。kata 运行时类由 OpenShift 沙盒容器 Operator 安装和部署。运行时类包含有关运行时的信息,用于描述运行时需要运行的资源,如 pod 开销
对等(peer)pod

OpenShift 沙盒容器中的对等 pod 扩展标准 pod 的概念。与标准沙盒容器不同,在 worker 节点本身上创建虚拟机,在对等 pod 中,虚拟机会使用任何支持的虚拟机监控程序或云供应商 API 通过远程 hypervisor 创建。

对等 pod 作为 worker 节点上的常规 pod,其对应的虚拟机在其他位置运行。虚拟机的远程位置对用户是透明的,并由 pod 规格中运行时类指定。对等 pod 设计对嵌套虚拟化的需求。

IBM 安全执行
Linux 的 IBM Secure Execution 是 IBM z15® 和 LinuxONE III 中引入的高级安全功能。此功能扩展了由广泛加密提供的保护。IBM Secure Execution 可在静态、传输和使用中保护数据。它启用了工作负载安全部署并确保整个生命周期的数据保护。如需更多信息,请参阅 Linux 的 IBM 安全执行
机密容器
机密容器通过验证您的工作负载是否在受信任的执行环境(TEE)中运行来保护容器和数据。您可以部署此功能,以保护大数据分析和机器学习推测的隐私。
红帽构建的信任者
红帽构建的 Trustee 是一个认证服务,用于验证您要运行工作负载或计划发送机密信息的位置的可信度。红帽构建的 Trustee 包括部署在可信端的组件,用于验证远程工作负载是否在可信执行环境(TEE)中运行。红帽构建的 Trustee 非常灵活,可以在几个不同的配置中进行部署,以支持各种应用程序和硬件平台。
红帽构建的 Trustee Operator
红帽构建的 Trustee Operator 管理红帽构建的信任者的安装、生命周期和配置。

1.5. OpenShift 沙盒容器 Operator

OpenShift 沙盒容器 Operator 封装了来自 Kata 容器的所有组件。它管理安装、生命周期和配置任务。

OpenShift 沙盒容器 Operator 以 Operator 捆绑包格式 打包为两个容器镜像:

  • 捆绑包镜像包含元数据,这是使 operator OLM 就绪所必需的。
  • 第二个容器镜像包含监控和管理 KataConfig 资源的实际控制器。

OpenShift 沙盒容器 Operator 基于 Red Hat Enterprise Linux CoreOS (RHCOS)扩展概念。RHCOS 扩展是安装可选 OpenShift Container Platform 软件的机制。OpenShift 沙盒容器 Operator 使用此机制在集群中部署沙盒容器。

沙盒容器 RHCOS 扩展包含用于 Kata、QEMU 及其依赖项的 RPM。您可以使用 Machine Config Operator 提供的 MachineConfig 资源启用它们。

1.6. OpenShift Virtualization

您可以使用 OpenShift Virtualization 在集群中部署 OpenShift 沙盒容器。

要同时运行 OpenShift Virtualization 和 OpenShift 沙盒容器,您的虚拟机必须可实时迁移,以便它们不会阻止节点重启。详情请参阅 OpenShift Virtualization 文档中的关于实时迁移 的内容。

1.7. 块卷支持

OpenShift Container Platform 可以静态置备原始块卷。这些卷没有文件系统。对于可以直接写入磁盘或者实现其自己的存储服务的应用程序来说,使用它可以获得性能优势。

您可以将本地块设备用作 OpenShift 沙盒容器的持久性卷(PV)存储。可以使用 Local Storage Operator (LSO)置备此块设备。

默认情况下,OpenShift Container Platform 中不会安装 Local Storage Operator。有关安装说明 ,请参阅安装 Local Storage Operator

您可以通过在 PV 规格中指定 volumeMode: Block 来为 OpenShift 沙盒容器置备原始块卷。

块卷示例

apiVersion: "local.storage.openshift.io/v1"
kind: "LocalVolume"
metadata:
  name: "local-disks"
  namespace: "openshift-local-storage"
spec:
  nodeSelector:
    nodeSelectorTerms:
    - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - worker-0
  storageClassDevices:
    - storageClassName: "local-sc"
      forceWipeDevicesAndDestroyAllData: false
      volumeMode: Block 
1

      devicePaths:
        - /path/to/device 
2
Copy to Clipboard Toggle word wrap

1
volumeMode 设置为 Block 以表示这个 PV 是一个原始块卷。
2
使用到 LocalVolume 资源的文件路径替换 这个值。当置备程序已被成功部署时,会为这些本地磁盘创建 PV。您还必须使用此路径在部署 OpenShift 沙盒容器时标记使用块设备的节点。

1.8. FIPS 合规性

OpenShift Container Platform 是为联邦信息处理标准(FIPS) 140-2 和 140-3 设计的。当以 FIPS 模式运行 Red Hat Enterprise Linux (RHEL) 或 Red Hat Enterprise Linux CoreOS (RHCOS) 时,OpenShift Container Platform 核心组件使用 RHEL 加密库,只有在 x86_64, ppc64le, 和 s390x 架构上的库被提交到 NIST 进行 FIPS 140-2/140-3 Validation。

有关 NIST 验证程序的更多信息,请参阅加密模块验证程序。有关为验证提交的 RHEL 加密库的单独版本的最新 NIST 状态,请参阅 Compliance Activities 和 Government Standards

OpenShift 沙盒容器可以在启用了 FIPS 的集群中使用。

在 FIPS 模式下运行时,OpenShift 沙盒容器组件、虚拟机和虚拟机镜像会根据 FIPS 进行调整。

注意

OpenShift 沙盒容器的 FIPS 合规性只适用于 kata 运行时类。对等 pod 运行时类 kata-remote 尚未被完全支持,且还没有为 FIPS 合规性进行测试。

FIPS 合规性是高安全性环境中所需的最重要的组件之一,可确保节点上只允许使用支持的加密技术。

重要

只有在 x86_64 架构中的 OpenShift Container Platform 部署支持 FIPS 验证的/Modules in Process 加密库。

要了解红帽对 OpenShift Container Platform 合规框架的观点,请参阅 OpenShift 安全性指南手册中的“风险管理和法规就绪状态”一章。

1.9. 对等 pod 资源要求

您必须确保集群有足够的资源。

对等 pod 虚拟机(VM)需要位于两个位置的资源:

  • worker 节点。worker 节点存储元数据、Kata shim 资源(containerd-shim-kata-v2)、remote-hypervisor 资源(cloud-api-adaptor),以及 worker 节点和对等 pod 虚拟机之间的隧道设置。
  • 云实例。这是在云中运行的实际对等 pod 虚拟机。

Kubernetes worker 节点中使用的 CPU 和内存资源由 RuntimeClass (kata-remote)定义中包含的 pod 开销 处理,用于创建对等 pod。

在云中运行的对等 pod 虚拟机总数定义为 Kubernetes 节点扩展资源。这个限制是每个节点,由 peer-pods-cm 配置映射中的 PEERPODS_LIMIT_PER_NODE 属性设置。

扩展资源名为 kata.peerpods.io/vm,并允许 Kubernetes 调度程序处理容量跟踪和核算。

在安装 OpenShift 沙盒容器 Operator 后,您可以根据环境要求编辑每个节点的限制。

变异 Webhook 将扩展的资源 kata.peerpods.io/vm 添加到 pod 规格中。如果存在,它还会从 pod 规格中删除任何特定于资源的条目。这可让 Kubernetes 调度程序考虑这些扩展资源,确保仅在资源可用时调度对等 pod。

变异 Webhook 修改 Kubernetes pod,如下所示:

  • 变异 Webhook 会检查 pod 是否有预期的 RuntimeClassName 值,在 TARGET_RUNTIME_CLASS 环境变量中指定。如果 pod 规格中的值与 TARGET_RUNTIME_CLASS 的值不匹配,则 Webhook 会在不修改 pod 的情况下退出。
  • 如果 RuntimeClassName 值匹配,webhook 会对 pod 规格进行以下更改:

    1. Webhook 从 pod 中所有容器和 init 容器的 resources 字段中删除每个资源规格。
    2. Webhook 通过修改 pod 中第一个容器的 resources 字段,将扩展资源(kata.peerpods.io/vm)添加到 spec。Kubernetes 调度程序使用扩展资源 kata.peerpods.io/vm 用于核算目的。
注意

变异 Webhook 排除 OpenShift Container Platform 中的特定系统命名空间。如果在这些系统命名空间中创建了对等 pod,则使用 Kubernetes 扩展资源的资源核算不起作用,除非 pod spec 包含扩展资源。

作为最佳实践,定义集群范围的策略,仅允许在特定命名空间中创建对等 pod。

第 2 章 在裸机上部署 OpenShift 沙盒容器

您可以在裸机上部署 OpenShift 沙盒容器,

您可以通过执行以下步骤部署 OpenShift 沙盒容器:

  1. 在 OpenShift Container Platform 集群上安装 OpenShift 沙盒容器 Operator。
  2. 可选:安装 Local Storage Operator 来配置本地块存储设备。
  3. 可选:安装 Node Feature Discovery (NFD) Operator 来配置节点资格检查。
  4. 创建 KataConfig 自定义资源。
  5. 可选:修改每个 worker 节点上运行的虚拟机数量。
  6. 可选:修改 pod 开销。
  7. 为 OpenShift 沙盒容器配置工作负载。

2.1. 先决条件

  • 已安装 Red Hat OpenShift Container Platform 4.16 或更高版本。
  • OpenShift Container Platform 集群至少有一个 worker 节点。

2.2. 安装 OpenShift 沙盒容器 Operator

您可以使用命令行界面(CLI)安装 OpenShift 沙盒容器 Operator。

先决条件

  • 您可以使用具有 cluster-admin 角色的用户访问集群。

流程

  1. 创建 osc-namespace.yaml 清单文件:

    apiVersion: v1
    kind: Namespace
    metadata:
      name: openshift-sandboxed-containers-operator
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令创建命名空间:

    $ oc apply -f osc-namespace.yaml
    Copy to Clipboard Toggle word wrap
  3. 创建 osc-operatorgroup.yaml 清单文件:

    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: sandboxed-containers-operator-group
      namespace: openshift-sandboxed-containers-operator
    spec:
      targetNamespaces:
      - openshift-sandboxed-containers-operator
    Copy to Clipboard Toggle word wrap
  4. 运行以下命令来创建 operator 组:

    $ oc apply -f osc-operatorgroup.yaml
    Copy to Clipboard Toggle word wrap
  5. 创建 osc-subscription.yaml 清单文件:

    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: sandboxed-containers-operator
      namespace: openshift-sandboxed-containers-operator
    spec:
      channel: stable
      installPlanApproval: Automatic
      name: sandboxed-containers-operator
      source: redhat-operators
      sourceNamespace: openshift-marketplace
      startingCSV: sandboxed-containers-operator.v1.10.1
    Copy to Clipboard Toggle word wrap
  6. 运行以下命令来创建订阅:

    $ oc apply -f osc-subscription.yaml
    Copy to Clipboard Toggle word wrap
  7. 运行以下命令验证 Operator 是否已正确安装:

    $ oc get csv -n openshift-sandboxed-containers-operator
    Copy to Clipboard Toggle word wrap

    此命令可能需要几分钟来完成。

  8. 运行以下命令监控进程:

    $ watch oc get csv -n openshift-sandboxed-containers-operator
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME                             DISPLAY                                  VERSION             REPLACES                   PHASE
    openshift-sandboxed-containers   openshift-sandboxed-containers-operator  1.10.1    1.9.0        Succeeded
    Copy to Clipboard Toggle word wrap

2.3. 可选配置

您可在安装 OpenShift 沙盒容器 Operator 后配置以下选项。

2.3.1. 置备本地块卷

您可以在 OpenShift 沙盒容器中使用本地块卷。您必须首先使用 Local Storage Operator (LSO)置备本地块卷。然后,您必须使用本地块卷启用节点来运行 OpenShift 沙盒容器工作负载。

您可以使用 Local Storage Operator (LSO)为 OpenShift 沙盒容器置备本地块卷。本地卷置备程序会在定义的资源中指定的路径上查找任何块设备。

先决条件

  • 已安装 Local Storage Operator。
  • 您有一个满足以下条件的本地磁盘:

    • 它附加到一个节点。
    • 它尚未挂载。
    • 它不包含分区。

流程

  1. 创建本地卷资源。此资源必须定义本地卷的节点和路径。

    注意

    不要在同一设备中使用不同的存储类名称。这样做可创建多个持久性卷(PV)。

    例如:Block

    apiVersion: "local.storage.openshift.io/v1"
    kind: "LocalVolume"
    metadata:
      name: "local-disks"
      namespace: "openshift-local-storage" 
    1
    
    spec:
      nodeSelector: 
    2
    
        nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
              - ip-10-0-136-143
              - ip-10-0-140-255
              - ip-10-0-144-180
      storageClassDevices:
        - storageClassName: "local-sc" 
    3
    
          forceWipeDevicesAndDestroyAllData: false 
    4
    
          volumeMode: Block
          devicePaths: 
    5
    
            - /path/to/device 
    6
    Copy to Clipboard Toggle word wrap

    1
    安装了 Local Storage Operator 的命名空间。
    2
    可选:包含附加了本地存储卷的节点列表的节点选择器。本例使用从 oc get node 获取的节点主机名。如果没有定义值,则 Local Storage Operator 会尝试在所有可用节点上查找匹配的磁盘。
    3
    创建持久性卷对象时使用的存储类的名称。
    4
    此设置定义是否调用 wipefs,它会删除分区表签名(魔法字符串),使磁盘准备好用于 Local Storage Operator 置备。除了签名外,没有其它数据会被清除。默认为 "false" (不调用 wipefs )。当在需要重新使用的磁盘中,将 forceWipeDevicesAndDestroyAllData 设置为 "true" 很有用。在这些情况下,将此字段设置为 true 可消除管理员手动擦除磁盘的需要。
    5
    包含要从中选择的本地存储设备列表的路径。在启用带有本地块设备的节点来运行 OpenShift 沙盒容器工作负载时,您必须使用此路径。
    6
    使用到 LocalVolume 资源 by-id 的文件路径替换这个值,如 /dev/disk/by-id/wwn。当置备程序已被成功部署时,会为这些本地磁盘创建 PV。
  2. 在 OpenShift Container Platform 集群中创建本地卷资源。指定您刚才创建的文件:

    $ oc apply -f <local-volume>.yaml
    Copy to Clipboard Toggle word wrap
  3. 验证置备程序是否已创建并创建了相应的守护进程集:

    $ oc get all -n openshift-local-storage
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME                                          READY   STATUS    RESTARTS   AGE
    pod/diskmaker-manager-9wzms                   1/1     Running   0          5m43s
    pod/diskmaker-manager-jgvjp                   1/1     Running   0          5m43s
    pod/diskmaker-manager-tbdsj                   1/1     Running   0          5m43s
    pod/local-storage-operator-7db4bd9f79-t6k87   1/1     Running   0          14m
    
    NAME                                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
    service/local-storage-operator-metrics   ClusterIP   172.30.135.36   <none>        8383/TCP,8686/TCP   14m
    
    NAME                               DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
    daemonset.apps/diskmaker-manager   3         3         3       3            3           <none>          5m43s
    
    NAME                                     READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/local-storage-operator   1/1     1            1           14m
    
    NAME                                                DESIRED   CURRENT   READY   AGE
    replicaset.apps/local-storage-operator-7db4bd9f79   1         1         1       14m
    Copy to Clipboard Toggle word wrap

    请注意 所需的 和当前的 守护进程设定进程数。所需的 数量为 0 表示标签选择器无效。

  4. 验证持久性卷是否已创建:

    $ oc get pv
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME                CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
    local-pv-1cec77cf   100Gi      RWO            Delete           Available           local-sc                88m
    local-pv-2ef7cd2a   100Gi      RWO            Delete           Available           local-sc                82m
    local-pv-3fa1c73    100Gi      RWO            Delete           Available           local-sc                48m
    Copy to Clipboard Toggle word wrap

重要

编辑 LocalVolume 对象不会更改现有的持久性卷,因为这样做可能会导致破坏性操作。

2.3.2. 启用节点使用本地块设备

您可以使用本地块设备配置节点,以便在定义的卷资源中指定的路径上运行 OpenShift 沙盒容器工作负载。

先决条件

  • 已使用 Local Storage Operator (LSO)置备块设备。

流程

  • 运行以下命令,使用本地块设备启用每个节点来运行 OpenShift 沙盒容器工作负载:

    $ oc debug node/worker-0 -- chcon -vt container_file_t /host/path/to/device
    Copy to Clipboard Toggle word wrap

    在创建本地存储资源时,/path/to/device 必须与您定义的路径相同。

    输出示例

    system_u:object_r:container_file_t:s0 /host/path/to/device
    Copy to Clipboard Toggle word wrap

2.3.3. 创建 NodeFeatureDiscovery 自定义资源

您可以创建一个 NodeFeatureDiscovery 自定义资源(CR)来定义 Node Feature Discovery (NFD) Operator 检查的配置参数,以确定 worker 节点可以支持 OpenShift 沙盒容器。

注意

要仅在您了解的所选 worker 节点上安装 kata 运行时,请将 feature.node.kubernetes.io/runtime.kata=true 标签应用到所选节点,并在 KataConfig CR 中设置 checkNodeEligibility: true

要在所有 worker 节点上安装 kata 运行时,请在 KataConfig CR 中设置 checkNodeEligibility: false

在这两种情况下,您不需要创建 NodeFeatureDiscovery CR。如果您确定节点有资格运行 OpenShift 沙盒容器,则应仅应用 feature.node.kubernetes.io/runtime.kata=true 标签。

以下流程将 feature.node.kubernetes.io/runtime.kata=true 标签应用到所有有资格的节点,并将 KataConfig 资源配置为检查节点资格。

先决条件

  • 已安装 NFD Operator。

流程

  1. 根据以下示例创建 nfd.yaml 清单文件:

    apiVersion: nfd.openshift.io/v1
    kind: NodeFeatureDiscovery
    metadata:
      name: nfd-kata
      namespace: openshift-nfd
    spec:
      workerConfig:
        configData: |
          sources:
            custom:
              - name: "feature.node.kubernetes.io/runtime.kata"
                matchOn:
                  - cpuId: ["SSE4", "VMX"]
                    loadedKMod: ["kvm", "kvm_intel"]
                  - cpuId: ["SSE4", "SVM"]
                    loadedKMod: ["kvm", "kvm_amd"]
    # ...
    Copy to Clipboard Toggle word wrap
  2. 创建 NodeFeatureDiscovery CR:

    $ oc create -f nfd.yaml
    Copy to Clipboard Toggle word wrap

    NodeFeatureDiscovery CR 将 feature.node.kubernetes.io/runtime.kata=true 标签应用到所有合格的 worker 节点。

  1. 根据以下示例创建 kata-config.yaml 清单文件:

    apiVersion: kataconfiguration.openshift.io/v1
    kind: KataConfig
    metadata:
      name: example-kataconfig
    spec:
      checkNodeEligibility: true
    Copy to Clipboard Toggle word wrap
  2. 创建 KataConfig CR:

    $ oc create -f kata-config.yaml
    Copy to Clipboard Toggle word wrap

验证

  • 验证集群中是否应用了正确的标签:

    $ oc get nodes --selector='feature.node.kubernetes.io/runtime.kata=true'
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME                           STATUS                     ROLES    AGE     VERSION
    compute-3.example.com          Ready                      worker   4h38m   v1.25.0
    compute-2.example.com          Ready                      worker   4h35m   v1.25.0
    Copy to Clipboard Toggle word wrap

2.4. 创建 KataConfig 自定义资源

您必须创建 KataConfig 自定义资源(CR)以在 worker 节点上作为运行时类安装 kata

OpenShift 沙盒容器将 kata 作为集群中的辅助 可选运行时安装,而不是作为主要运行时。

创建 KataConfig CR 会自动重启 worker 节点。重启可能需要 10 到 60 分钟。以下因素可以提高重启时间:

  • 带有更多 worker 节点的大型 OpenShift Container Platform 部署。
  • 激活 BIOS 和 Diagnostics 实用程序。
  • 在硬盘而不是 SSD 上部署。
  • 在物理节点上部署,如裸机,而不是在虚拟节点上部署。
  • CPU 和网络较慢。

流程

  1. 根据以下示例创建 example-kataconfig.yaml 清单文件:

    apiVersion: kataconfiguration.openshift.io/v1
    kind: KataConfig
    metadata:
      name: example-kataconfig
    spec:
      checkNodeEligibility: false 
    1
    
      logLevel: info
    #  kataConfigPoolSelector:
    #    matchLabels:
    #      <label_key>: '<label_value>' 
    2
    Copy to Clipboard Toggle word wrap
    1
    可选:将'checkNodeEligibility' 设置为 true 以运行节点资格检查是否安装了 Node Feature Discovery Operator。
    2
    可选:如果您应用了节点标签来在特定节点上安装 OpenShift 沙盒容器,请指定键和值。
  2. 运行以下命令来创建 KataConfig CR:

    $ oc apply -f example-kataconfig.yaml
    Copy to Clipboard Toggle word wrap

    新的 KataConfig CR 会被创建,并在 worker 节点上作为运行时类安装 kata

    在验证安装前,等待 kata 安装完成,以及 worker 节点重新引导。

  3. 运行以下命令监控安装进度:

    $ watch "oc describe kataconfig | sed -n /^Status:/,/^Events/p"
    Copy to Clipboard Toggle word wrap

    当安装 kataNodes 下的所有 worker 的状态并且条件 InProgressFalse 时,如果没有指定原因,则会在集群中安装 kata

2.5. 修改 pod 开销

Pod 开销描述了节点上 pod 使用的系统资源量。您可以通过更改 RuntimeClass 自定义资源的 spec.overhead 字段来修改 pod 开销。例如,如果您为容器运行的配置消耗 QEMU 进程和客户机内核数据的 350Mi 内存,您可以更改 RuntimeClass 开销来满足您的需要。

在客户机中执行任何类型的文件系统 I/O 时,将在客户机内核中分配文件缓冲区。文件缓冲区也在主机上的 QEMU 进程以及 virtiofsd 进程中映射。

例如,如果您在客户机中使用 300Mi 文件缓冲区缓存,QEMU 和 virtiofsd 都显示使用 300Mi 额外内存。但是,所有三种情况下都使用相同的内存。因此,内存使用总量仅为 300Mi,映射在三个不同的位置。报告内存使用率指标时,会正确计算。

注意

红帽支持默认值。不支持更改默认开销值,这可能会导致技术问题。

流程

  1. 运行以下命令来获取 RuntimeClass 对象:

    $ oc describe runtimeclass kata
    Copy to Clipboard Toggle word wrap
  2. 更新 overhead.podFixed.memorycpu 值,并将文件保存为 runtimeclass.yaml

    kind: RuntimeClass
    apiVersion: node.k8s.io/v1
    metadata:
      name: kata
    overhead:
      podFixed:
        memory: "500Mi"
        cpu: "500m"
    Copy to Clipboard Toggle word wrap
  3. 运行以下命令来应用更改:

    $ oc apply -f runtimeclass.yaml
    Copy to Clipboard Toggle word wrap

2.6. 为 OpenShift 沙盒容器配置工作负载

您可以通过将 kata 设置为以下 pod 模板对象的运行时类来配置 OpenShift 沙盒容器的工作负载:

  • Pod 对象
  • ReplicaSet 对象
  • ReplicationController 对象
  • StatefulSet 对象
  • Deployment 对象
  • deploymentConfig 对象
重要

不要在 Operator 命名空间中部署工作负载。为这些资源创建一个专用命名空间。

先决条件

  • 您已创建了 KataConfig 自定义资源(CR)。

流程

  1. spec.runtimeClassName: kata 添加到每个 pod 模板工作负载对象的清单中,如下例所示:

    apiVersion: v1
    kind: <object>
    # ...
    spec:
      runtimeClassName: kata
    # ...
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令,将更改应用到工作负载对象:

    $ oc apply -f <object.yaml>
    Copy to Clipboard Toggle word wrap

    OpenShift Container Platform 创建工作负载对象并开始调度它。

验证

  • 检查 pod 模板对象的 spec.runtimeClassName 字段。如果值为 kata,则工作负载在 OpenShift 沙盒容器中运行。

第 3 章 在 AWS 上部署 OpenShift 沙盒容器

您可以在 AWS Cloud Computing Services 上部署 OpenShift 沙盒容器,

重要

AWS Cloud Computing Services 上的 Red Hat OpenShift 沙盒容器只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

您可以通过执行以下步骤部署 OpenShift 沙盒容器:

  1. 在 OpenShift Container Platform 集群上安装 OpenShift 沙盒容器 Operator。
  2. 启用端口以允许内部与对等 pod 通信。
  3. 可选:如果选择自定义 pod 虚拟机镜像,您必须为 peer pod 配置 pull secret。
  4. 可选: 选择自定义 pod 虚拟机镜像。
  5. 创建对等 pod 配置映射。
  6. 可选:自定义 Kata 代理策略。
  7. 创建 KataConfig 自定义资源。
  8. 可选:修改每个 worker 节点上运行的虚拟机数量。
  9. 为 OpenShift 沙盒容器配置工作负载。

3.1. 先决条件

  • 已安装 Red Hat OpenShift Container Platform 4.16 或更高版本。
  • OpenShift Container Platform 集群至少有一个 worker 节点。
  • 您已为用于 worker 节点和 pod 虚拟机(VM)的子网中的通信启用了端口 15150 和 9000。端口启用在 worker 节点上运行的 Kata shim 和 pod 虚拟机上运行的 Kata 代理之间的通信。

3.2. 安装 OpenShift 沙盒容器 Operator

您可以使用命令行界面(CLI)安装 OpenShift 沙盒容器 Operator。

先决条件

  • 您可以使用具有 cluster-admin 角色的用户访问集群。

流程

  1. 创建 osc-namespace.yaml 清单文件:

    apiVersion: v1
    kind: Namespace
    metadata:
      name: openshift-sandboxed-containers-operator
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令创建命名空间:

    $ oc apply -f osc-namespace.yaml
    Copy to Clipboard Toggle word wrap
  3. 创建 osc-operatorgroup.yaml 清单文件:

    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: sandboxed-containers-operator-group
      namespace: openshift-sandboxed-containers-operator
    spec:
      targetNamespaces:
      - openshift-sandboxed-containers-operator
    Copy to Clipboard Toggle word wrap
  4. 运行以下命令来创建 operator 组:

    $ oc apply -f osc-operatorgroup.yaml
    Copy to Clipboard Toggle word wrap
  5. 创建 osc-subscription.yaml 清单文件:

    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: sandboxed-containers-operator
      namespace: openshift-sandboxed-containers-operator
    spec:
      channel: stable
      installPlanApproval: Automatic
      name: sandboxed-containers-operator
      source: redhat-operators
      sourceNamespace: openshift-marketplace
      startingCSV: sandboxed-containers-operator.v1.10.1
    Copy to Clipboard Toggle word wrap
  6. 运行以下命令来创建订阅:

    $ oc apply -f osc-subscription.yaml
    Copy to Clipboard Toggle word wrap
  7. 运行以下命令验证 Operator 是否已正确安装:

    $ oc get csv -n openshift-sandboxed-containers-operator
    Copy to Clipboard Toggle word wrap

    此命令可能需要几分钟来完成。

  8. 运行以下命令监控进程:

    $ watch oc get csv -n openshift-sandboxed-containers-operator
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME                             DISPLAY                                  VERSION             REPLACES                   PHASE
    openshift-sandboxed-containers   openshift-sandboxed-containers-operator  1.10.1    1.9.0        Succeeded
    Copy to Clipboard Toggle word wrap

3.3. 为 AWS 启用端口

您必须启用端口 15150 和 9000,以允许内部与 AWS 上运行的对等 pod 通信。

先决条件

  • 已安装 OpenShift 沙盒容器 Operator。
  • 已安装 AWS 命令行工具。
  • 您可以使用具有 cluster-admin 角色的用户访问集群。

流程

  1. 登录您的 OpenShift Container Platform 集群并检索实例 ID:

    $ INSTANCE_ID=$(oc get nodes -l 'node-role.kubernetes.io/worker' \
      -o jsonpath='{.items[0].spec.providerID}' | sed 's#[^ ]*/##g')
    Copy to Clipboard Toggle word wrap
  2. 检索 AWS 区域:

    $ AWS_REGION=$(oc get infrastructure/cluster -o jsonpath='{.status.platformStatus.aws.region}')
    Copy to Clipboard Toggle word wrap
  3. 检索安全组 ID,并将其存储在阵列中:

    $ AWS_SG_IDS=($(aws ec2 describe-instances --instance-ids ${INSTANCE_ID} \
      --query 'Reservations[*].Instances[*].SecurityGroups[*].GroupId' \
      --output text --region $AWS_REGION))
    Copy to Clipboard Toggle word wrap
  4. 对于每个安全组 ID,授权 peer pod shim 访问 kata-agent 通信,并设置对等 pod 隧道:

    $ for AWS_SG_ID in "${AWS_SG_IDS[@]}"; do \
      aws ec2 authorize-security-group-ingress --group-id $AWS_SG_ID --protocol tcp --port 15150 --source-group $AWS_SG_ID --region $AWS_REGION; \
      aws ec2 authorize-security-group-ingress --group-id $AWS_SG_ID --protocol tcp --port 9000 --source-group $AWS_SG_ID --region $AWS_REGION; \
    done
    Copy to Clipboard Toggle word wrap

现在启用这些端口。

3.4. 创建对等 pod 配置映射

您必须创建对等 pod 配置映射。

先决条件

  • 如果没有根据集群凭证使用默认 AMI ID,则具有 Amazon Machine Image (AMI) ID。

流程

  1. 从 AWS 实例获取以下值:

    1. 检索并记录实例 ID:

      $ INSTANCE_ID=$(oc get nodes -l 'node-role.kubernetes.io/worker' \
        -o jsonpath='{.items[0].spec.providerID}' | sed 's#[^ ]*/##g')
      Copy to Clipboard Toggle word wrap

      这用于检索 secret 对象的其他值。

    2. 检索并记录 AWS 区域:

      $ AWS_REGION=$(oc get infrastructure/cluster \
        -o jsonpath='{.status.platformStatus.aws.region}') \
        && echo "AWS_REGION: \"$AWS_REGION\""
      Copy to Clipboard Toggle word wrap
    3. 检索并记录 AWS 子网 ID:

      $ AWS_SUBNET_ID=$(aws ec2 describe-instances --instance-ids ${INSTANCE_ID} \
        --query 'Reservations[*].Instances[*].SubnetId' --region ${AWS_REGION} \
          --output text) && echo "AWS_SUBNET_ID: \"$AWS_SUBNET_ID\""
      Copy to Clipboard Toggle word wrap
    4. 检索并记录 AWS VPC ID:

      $ AWS_VPC_ID=$(aws ec2 describe-instances --instance-ids ${INSTANCE_ID} \
        --query 'Reservations[*].Instances[*].VpcId' --region ${AWS_REGION} \
          --output text) && echo "AWS_VPC_ID: \"$AWS_VPC_ID\""
      Copy to Clipboard Toggle word wrap
    5. 检索并记录 AWS 安全组 ID:

      $ AWS_SG_IDS=$(aws ec2 describe-instances --instance-ids ${INSTANCE_ID} \
        --query 'Reservations[*].Instances[*].SecurityGroups[*].GroupId' \
        --region  $AWS_REGION --output json | jq -r '.[][][]' | paste -sd ",") \
          && echo "AWS_SG_IDS: \"$AWS_SG_IDS\""
      Copy to Clipboard Toggle word wrap
  2. 根据以下示例创建 peer-pods-cm.yaml 清单文件:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: peer-pods-cm
      namespace: openshift-sandboxed-containers-operator
    data:
      CLOUD_PROVIDER: "aws"
      VXLAN_PORT: "9000"
      PROXY_TIMEOUT: "5m"
      PODVM_INSTANCE_TYPE: "t3.medium"
      PODVM_INSTANCE_TYPES: "t2.small,t2.medium,t3.large"
      PODVM_AMI_ID: "<podvm_ami_id>"
      AWS_REGION: "<aws_region>"
      AWS_SUBNET_ID: "<aws_subnet_id>"
      AWS_VPC_ID: "<aws_vpc_id>"
      AWS_SG_IDS: "<aws_sg_ids>"
      TAGS: "key1=value1,key2=value2"
      PEERPODS_LIMIT_PER_NODE: "10"
      ROOT_VOLUME_SIZE: "6"
      DISABLECVM: "true"
    Copy to Clipboard Toggle word wrap
    PODVM_INSTANCE_TYPE
    定义在工作负载对象中没有定义实例类型时使用的默认实例类型。
    PODVM_INSTANCE_TYPES
    指定创建 pod 的实例类型,没有空格。您可以为需要较少的内存和更少的 CPU 或更大实例类型的工作负载定义较小的实例类型。
    PODVM_AMI_ID
    此值会在运行 KataConfig CR 时填充,使用基于集群凭证的 AMI ID。如果您创建自己的 AMI,请指定正确的 AMI ID。
    标签
    您可以将自定义标签配置为 pod 虚拟机实例的 key:value 对,以跟踪对等 pod 成本或标识不同集群中的对等 pod。
    PEERPODS_LIMIT_PER_NODE
    您可以增加这个值以在节点上运行更多对等 pod。默认值为 10
    ROOT_VOLUME_SIZE
    您可以为带有更大容器镜像的 pod 增加这个值。指定 pod 虚拟机的 root 卷大小,以 GB 为单位。默认和最小大小为 6 GB。
  3. 运行以下命令来创建配置映射:

    $ oc create -f peer-pods-cm.yaml
    Copy to Clipboard Toggle word wrap

3.5. 为对等 pod 配置 pull secret

要从私有 registry 中拉取 pod 虚拟机镜像,您必须为对等 pod 配置 pull secret。

然后,您可以将 pull secret 链接到 default 服务帐户,也可以在对等 pod 清单中指定 pull secret。

流程

  1. NS 变量设置为部署对等 pod 的命名空间:

    $ NS=<namespace>
    Copy to Clipboard Toggle word wrap
  2. 将 pull secret 复制到对等 pod 命名空间:

    $ oc get secret pull-secret -n openshift-config -o yaml \
      | sed "s/namespace: openshift-config/namespace: ${NS}/" \
      | oc apply -n "${NS}" -f -
    Copy to Clipboard Toggle word wrap

    您可以使用集群 pull secret,如下例所示或自定义 pull secret。

  3. 可选:将 pull secret 链接到 default 服务帐户:

    $ oc secrets link default pull-secret --for=pull -n ${NS}
    Copy to Clipboard Toggle word wrap
  4. 或者,将 pull secret 添加到对等 pod 清单中:

    apiVersion: v1
    kind: <Pod>
    spec:
      containers:
      - name: <container_name>
        image: <image_name>
      imagePullSecrets:
      - name: pull-secret
    # ...
    Copy to Clipboard Toggle word wrap

3.6. 选择自定义对等 pod 虚拟机镜像

您可以通过向 pod 清单添加注解来选择自定义对等 pod 虚拟机(VM)镜像,根据您的工作负载要求量身定制。自定义镜像覆盖对等 pod 配置映射中指定的默认镜像。

先决条件

  • 您有自定义 pod 虚拟机镜像的 ID,该镜像与您的云供应商或 hypervisor 兼容。

流程

  1. 根据以下示例创建 my-pod-manifest.yaml 文件:

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod-manifest
      annotations:
        io.katacontainers.config.hypervisor.image: "<custom_image_id>"
    spec:
      runtimeClassName: kata-remote
      containers:
      - name: <example_container>
        image: registry.access.redhat.com/ubi9/ubi:9.3
        command: ["sleep", "36000"]
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令来创建 pod:

    $ oc create -f my-pod-manifest.yaml
    Copy to Clipboard Toggle word wrap

3.7. 自定义 Kata 代理策略

Kata 代理策略是一种安全机制,用于控制使用 Kata 运行时运行的 pod 的代理 API 请求。使用 Rego 编写并由 Pod 虚拟机(VM)中的 Kata 代理强制,此策略决定哪些操作被允许或拒绝。

您可以针对特定用例使用自定义策略来覆盖默认策略,如在安全不是关注的地方进行开发和测试。例如,您可以在 control plane 可以被信任的环境中运行。您可以通过几种方法应用自定义策略:

  • 将其嵌入到 pod 虚拟机镜像中。
  • 修补对等 pod 配置映射。
  • 为工作负载 pod YAML 添加注解。

对于生产环境系统,首选的方法是使用 initdata 覆盖 Kata 代理策略。以下流程使用 io.katacontainers.config.agent.policy 注解将自定义策略应用到单独的 pod。该策略以 Base64 编码的 Rego 格式提供。此方法会在创建 Pod 时覆盖默认策略,而不修改 pod 虚拟机镜像。

注意

自定义策略完全替换了默认策略。要只修改特定的 API,请包含完整的策略并调整相关规则。

流程

  1. 使用自定义策略创建 policy.rego 文件。以下示例显示了所有可配置的 API:

    package agent_policy
    
    default AddARPNeighborsRequest := true
    default AddSwapRequest := true
    default CloseStdinRequest := true
    default CopyFileRequest := true
    default CreateContainerRequest := true
    default CreateSandboxRequest := true
    default DestroySandboxRequest := true
    default ExecProcessRequest := true
    default GetMetricsRequest := true
    default GetOOMEventRequest := true
    default GuestDetailsRequest := true
    default ListInterfacesRequest := true
    default ListRoutesRequest := true
    default MemHotplugByProbeRequest := true
    default OnlineCPUMemRequest := true
    default PauseContainerRequest := true
    default PullImageRequest := true
    default ReadStreamRequest := true
    default RemoveContainerRequest := true
    default RemoveStaleVirtiofsShareMountsRequest := true
    default ReseedRandomDevRequest := true
    default ResumeContainerRequest := true
    default SetGuestDateTimeRequest := true
    default SetPolicyRequest := true
    default SignalProcessRequest := true
    default StartContainerRequest := true
    default StartTracingRequest := true
    default StatsContainerRequest := true
    default StopTracingRequest := true
    default TtyWinResizeRequest := true
    default UpdateContainerRequest := true
    default UpdateEphemeralMountsRequest := true
    default UpdateInterfaceRequest := true
    default UpdateRoutesRequest := true
    default WaitProcessRequest := true
    default WriteStreamRequest := true
    Copy to Clipboard Toggle word wrap

    默认策略允许所有 API 调用。根据您的需要,调整 truefalse 值以进一步自定义策略。

  2. 运行以下命令,将 policy.rego 文件转换为 Base64 编码的字符串:

    $ base64 -w0 policy.rego
    Copy to Clipboard Toggle word wrap

    将输出保存到 yaml 文件中。

  3. 将 Base64 编码的策略添加到 my-pod.yaml pod 规格文件中:

    apiVersion: v1
    kind: Pod
    metadata:
      name: <pod_name>
      annotations:
        io.katacontainers.config.agent.policy: <base64_encoded_policy>
    spec:
      runtimeClassName: kata-remote
      containers:
      - name: <container_name>
        image: registry.access.redhat.com/ubi9/ubi:latest
        command:
        - sleep
        - "36000"
        securityContext:
          privileged: false
          seccompProfile:
            type: RuntimeDefault
    Copy to Clipboard Toggle word wrap
  4. 运行以下命令来应用 pod 清单:

    $ oc apply -f my-pod.yaml
    Copy to Clipboard Toggle word wrap

3.8. 创建 KataConfig 自定义资源

您必须创建 KataConfig 自定义资源(CR)来作为 worker 节点上的运行时类安装 kata-remote

OpenShift 沙盒容器将 kata-remote 安装为集群上的 辅助 可选运行时,而不是主运行时。

创建 KataConfig CR 会自动重启 worker 节点。重启可能需要 10 到 60 分钟。以下因素可以提高重启时间:

  • 带有更多 worker 节点的大型 OpenShift Container Platform 部署。
  • 激活 BIOS 和 Diagnostics 实用程序。
  • 在硬盘而不是 SSD 上部署。
  • 在物理节点上部署,如裸机,而不是在虚拟节点上部署。
  • CPU 和网络较慢。

流程

  1. 根据以下示例创建 example-kataconfig.yaml 清单文件:

    apiVersion: kataconfiguration.openshift.io/v1
    kind: KataConfig
    metadata:
      name: example-kataconfig
    spec:
      enablePeerPods: true
      logLevel: info
    #  kataConfigPoolSelector:
    #    matchLabels:
    #      <label_key>: '<label_value>' 
    1
    Copy to Clipboard Toggle word wrap
    1
    可选:如果您应用了节点标签在特定节点上安装 kata-remote,请指定键和值,例如 osc: 'true'
  2. 运行以下命令来创建 KataConfig CR:

    $ oc apply -f example-kataconfig.yaml
    Copy to Clipboard Toggle word wrap

    新的 KataConfig CR 被创建,并在 worker 节点上作为运行时类安装 kata-remote

    在验证安装前,等待 kata-remote 安装完成,以及 worker 节点重新引导。

  3. 运行以下命令监控安装进度:

    $ watch "oc describe kataconfig | sed -n /^Status:/,/^Events/p"
    Copy to Clipboard Toggle word wrap

    安装 kataNodes 下所有 worker 的状态并且条件 InProgressFalse 时,而不指定原因,则会在集群中安装 kata-remote

  4. 运行以下命令验证守护进程集:

    $ oc get -n openshift-sandboxed-containers-operator ds/osc-caa-ds
    Copy to Clipboard Toggle word wrap
  5. 运行以下命令验证运行时类:

    $ oc get runtimeclass
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME             HANDLER          AGE
    kata-remote      kata-remote      152m
    Copy to Clipboard Toggle word wrap

3.9. 修改每个节点的对等 pod 虚拟机数量

您可以通过编辑 peerpodConfig 自定义资源(CR)来修改每个节点的对等 pod 虚拟机限制。

流程

  1. 运行以下命令检查当前的限制:

    $ oc get peerpodconfig peerpodconfig-openshift -n openshift-sandboxed-containers-operator \
      -o jsonpath='{.spec.limit}{"\n"}'
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令,为 limit 键指定新值:

    $ oc patch peerpodconfig peerpodconfig-openshift -n openshift-sandboxed-containers-operator \
      --type merge --patch '{"spec":{"limit":"<value>"}}'
    Copy to Clipboard Toggle word wrap

3.10. 验证 pod 虚拟机镜像

在集群中安装 kata-remote 后,OpenShift 沙盒容器 Operator 会创建一个 pod 虚拟机镜像,用于创建对等 pod。此过程可能需要很长时间,因为镜像是在云实例上创建的。您可以通过检查您为云供应商创建的配置映射来验证 pod 虚拟机镜像是否已成功创建。

流程

  1. 获取您为对等 pod 创建的配置映射:

    $ oc get configmap peer-pods-cm -n openshift-sandboxed-containers-operator -o yaml
    Copy to Clipboard Toggle word wrap
  2. 检查 YAML 文件 的状态 小节。

    如果 PODVM_AMI_ID 参数被填充,则 pod 虚拟机镜像已创建成功。

故障排除

  1. 运行以下命令来检索事件日志:

    $ oc get events -n openshift-sandboxed-containers-operator --field-selector involvedObject.name=osc-podvm-image-creation
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令来检索作业日志:

    $ oc logs -n openshift-sandboxed-containers-operator jobs/osc-podvm-image-creation
    Copy to Clipboard Toggle word wrap

如果您无法解决这个问题,请提交红帽支持问题单并附加这两个日志的输出。

3.11. 为 OpenShift 沙盒容器配置工作负载

您可以通过将 kata-remote 设置为以下 pod 模板对象的运行时类来配置 OpenShift 沙盒容器的工作负载:

  • Pod 对象
  • ReplicaSet 对象
  • ReplicationController 对象
  • StatefulSet 对象
  • Deployment 对象
  • deploymentConfig 对象
重要

不要在 Operator 命名空间中部署工作负载。为这些资源创建一个专用命名空间。

您可以通过在 YAML 文件中添加注解,定义工作负载是否使用配置映射中定义的默认实例类型部署。

如果您不想手动定义实例类型,您可以添加注解来使用自动实例类型,具体取决于可用内存。

先决条件

  • 您已创建了 KataConfig 自定义资源(CR)。

流程

  1. spec.runtimeClassName: kata-remote 添加到每个 pod 模板工作负载对象的清单中,如下例所示:

    apiVersion: v1
    kind: <object>
    # ...
    spec:
      runtimeClassName: kata-remote
    # ...
    Copy to Clipboard Toggle word wrap
  2. 可选: 要使用手动定义的实例类型,请使用配置映射中定义的实例类型添加以下注解:

    apiVersion: v1
    kind: <object>
    metadata:
      annotations:
        io.katacontainers.config.hypervisor.machine_type: <machine_type>
    # ...
    Copy to Clipboard Toggle word wrap
  3. 可选: 要使用自动实例类型,请添加以下注解:

    apiVersion: v1
    kind: <Pod>
    metadata:
      annotations:
        io.katacontainers.config.hypervisor.default_vcpus: <vcpus>
        io.katacontainers.config.hypervisor.default_memory: <memory>
    # ...
    Copy to Clipboard Toggle word wrap

    工作负载将根据可用内存量在自动实例类型上运行。

  4. 运行以下命令,将更改应用到工作负载对象:

    $ oc apply -f <object.yaml>
    Copy to Clipboard Toggle word wrap

    OpenShift Container Platform 创建工作负载对象并开始调度它。

验证

  • 检查 pod 模板对象的 spec.runtimeClassName 字段。如果值为 kata-remote,则工作负载在 OpenShift 沙盒容器中运行。

第 4 章 在 Azure 上部署 OpenShift 沙盒容器

您可以在 Microsoft Azure Cloud Computing Services 上部署 OpenShift 沙盒容器,

您可以通过执行以下步骤部署 OpenShift 沙盒容器:

  1. 在 Azure 中为对等 pod 子网配置出站连接。
  2. 在 OpenShift Container Platform 集群上安装 OpenShift 沙盒容器 Operator。
  3. 可选:如果选择自定义 pod 虚拟机镜像,您必须为 peer pod 配置 pull secret。
  4. 可选: 选择自定义 pod 虚拟机镜像。
  5. 创建对等 pod 配置映射。
  6. 可选:创建 Azure secret。
  7. 可选:自定义 Kata 代理策略。
  8. 创建 KataConfig 自定义资源。
  9. 可选:修改每个 worker 节点上运行的虚拟机数量。
  10. 为 OpenShift 沙盒容器配置工作负载。

4.1. 先决条件

  • 已安装 Red Hat OpenShift Container Platform 4.16 或更高版本。
  • OpenShift Container Platform 集群至少有一个 worker 节点。
  • 您已为用于 worker 节点和 pod 虚拟机(VM)的子网中的通信启用了端口 15150 和 9000。端口启用在 worker 节点上运行的 Kata shim 和 pod 虚拟机上运行的 Kata 代理之间的通信。

4.2. 配置出站连接

要让对等 pod 与外部网络(如公共互联网)通信,您必须为 pod 虚拟机(VM)子网配置出站连接。这涉及设置 NAT 网关,并选择性地定义子网如何在 Azure 中与集群的虚拟网络(VNet)集成。

对等 pod 和子网
对等 pod 在专用 Azure 子网中操作,这需要显式配置出站访问。此子网可以是 OpenShift Container Platform 节点使用的默认 worker 子网,也可以是专门为对等 pod 创建的自定义子网。
VNet peering
使用单独的子网时,VNet peering 会将对等 pod VNet 连接到集群的 VNet,确保内部通信同时保持隔离。这需要在 VNets 间的非覆盖 CIDR 范围。

您可以通过两种方式配置出站连接:

  • 默认 worker 子网 :修改现有 worker 子网使其包含 NAT 网关。这更简单并重复使用集群资源,但它提供较少的隔离。
  • peer pod VNet:为对等 pod 设置专用 VNet 和子网,附加 NAT 网关,并使用集群 VNet 对等。这在额外的复杂性方面提供了更高的隔离和灵活性。

4.2.1. 为出站连接配置默认 worker 子网

您可以使用 NAT 网关配置默认 worker 子网。

先决条件

  • 已安装并进行身份验证的 Azure CLI (az)。
  • 有对 Azure 资源组和 VNet 的管理员访问权限。

流程

  1. 运行以下命令设置 AZURE_RESOURCE_GROUP 环境变量:

    $ AZURE_RESOURCE_GROUP=$(oc get infrastructure/cluster \
        -o jsonpath='{.status.platformStatus.azure.resourceGroupName}')
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令设置 AZURE_REGION 环境变量:

    $ AZURE_REGION=$(az group show --resource-group ${AZURE_RESOURCE_GROUP}\
        --query "{Location:location}" --output tsv) && \
        echo "AZURE_REGION: \"$AZURE_REGION\""
    Copy to Clipboard Toggle word wrap
  3. 运行以下命令设置 AZURE_VNET_NAME 环境变量:

    $ AZURE_VNET_NAME=$(az network vnet list \
        -g "${AZURE_RESOURCE_GROUP}" --query '[].name' -o tsv)
    Copy to Clipboard Toggle word wrap
  4. 运行以下命令设置 AZURE_SUBNET_ID 环境变量:

    $ AZURE_SUBNET_ID=$(az network vnet subnet list \
        --resource-group "${AZURE_RESOURCE_GROUP}" \
        --vnet-name "${AZURE_VNET_NAME}" --query "[].{Id:id} \
        | [? contains(Id, 'worker')]" --output tsv)
    Copy to Clipboard Toggle word wrap
  5. 运行以下命令,为 peer pod 子网设置 NAT 网关环境变量:

    $ export PEERPOD_NAT_GW=peerpod-nat-gw
    Copy to Clipboard Toggle word wrap
    $ export PEERPOD_NAT_GW_IP=peerpod-nat-gw-ip
    Copy to Clipboard Toggle word wrap
  6. 运行以下命令,为 NAT 网关创建公共 IP 地址:

    $ az network public-ip create -g "${AZURE_RESOURCE_GROUP}" \
        -n "${PEERPOD_NAT_GW_IP}" -l "${AZURE_REGION}" --sku Standard
    Copy to Clipboard Toggle word wrap
  7. 运行以下命令,创建 NAT 网关并将其与公共 IP 地址关联:

    $ az network nat gateway create -g "${AZURE_RESOURCE_GROUP}" \
        -l "${AZURE_REGION}" --public-ip-addresses "${PEERPOD_NAT_GW_IP}" \
        -n "${PEERPOD_NAT_GW}"
    Copy to Clipboard Toggle word wrap
  8. 运行以下命令,更新 VNet 子网以使用 NAT 网关:

    $ az network vnet subnet update --nat-gateway "${PEERPOD_NAT_GW}" \
        --ids "${AZURE_SUBNET_ID}"
    Copy to Clipboard Toggle word wrap

验证

  • 运行以下命令确认 NAT 网关已附加到 VNet 子网:

    $ az network vnet subnet show --ids "${AZURE_SUBNET_ID}" \
        --query "natGateway.id" -o tsv
    Copy to Clipboard Toggle word wrap

    输出中包含 NAT 网关资源 ID。如果没有附加 NAT 网关,输出为空。

    输出示例

    /subscriptions/12345678-1234-1234-1234-1234567890ab/resourceGroups/myResourceGroup/providers/Microsoft.Network/natGateways/myNatGateway
    Copy to Clipboard Toggle word wrap

4.2.2. 为出站连接创建对等 pod VNet

要启用公共互联网访问,您可以为对等 pod 创建专用虚拟网络(VNet),附加网络地址转换(NAT)网关,创建一个子网,并使用非覆盖地址空间启用 VNet 对等。

先决条件

  • 已安装 Azure CLI (az)
  • 您已登录到 Azure。请参阅使用 Azure CLI 对 Azure 进行授权
  • 具有管理员对 Azure 资源组和托管集群的 VNet 的访问权限。
  • 您已验证了集群 VNet 无类别域间路由(CIDR)地址。默认值为 10.0.0.0/14。如果您覆盖默认值,请确保为对等 pod VNet 选择了非覆盖 CIDR 地址。例如,192.168.0.0 /16

流程

  1. 为 peer pod 网络设置环境变量:

    1. 运行以下命令设置 peer pod VNet 环境变量:

      $ export PEERPOD_VNET_NAME="${PEERPOD_VNET_NAME:-peerpod-vnet}"
      Copy to Clipboard Toggle word wrap
      $ export PEERPOD_VNET_CIDR="${PEERPOD_VNET_CIDR:-192.168.0.0/16}"
      Copy to Clipboard Toggle word wrap
    2. 运行以下命令来设置对等 pod 子网环境变量:

      $ export PEERPOD_SUBNET_NAME="${PEERPOD_SUBNET_NAME:-peerpod-subnet}"
      Copy to Clipboard Toggle word wrap
      $ export PEERPOD_SUBNET_CIDR="${PEERPOD_SUBNET_CIDR:-192.168.0.0/16}"
      Copy to Clipboard Toggle word wrap
  2. 为 Azure 设置环境变量:

    $ AZURE_RESOURCE_GROUP=$(oc get infrastructure/cluster \
        -o jsonpath='{.status.platformStatus.azure.resourceGroupName}')
    Copy to Clipboard Toggle word wrap
    $ AZURE_REGION=$(az group show --resource-group ${AZURE_RESOURCE_GROUP}\
        --query "{Location:location}" --output tsv) && \
        echo "AZURE_REGION: \"$AZURE_REGION\""
    Copy to Clipboard Toggle word wrap
    $ AZURE_VNET_NAME=$(az network vnet list \
        -g "${AZURE_RESOURCE_GROUP}" --query '[].name' -o tsv)
    Copy to Clipboard Toggle word wrap
  3. 运行以下命令设置对等 pod NAT 网关环境变量:

    $ export PEERPOD_NAT_GW="${PEERPOD_NAT_GW:-peerpod-nat-gw}"
    Copy to Clipboard Toggle word wrap
    $ export PEERPOD_NAT_GW_IP="${PEERPOD_NAT_PUBLIC_IP:-peerpod-nat-gw-ip}"
    Copy to Clipboard Toggle word wrap
  4. 配置 VNET:

    1. 运行以下命令来创建对等 pod VNet:

      $ az network vnet create --resource-group "${AZURE_RESOURCE_GROUP}" \
          --name "${PEERPOD_VNET_NAME}" \
          --address-prefixes "${PEERPOD_VNET_CIDR}"
      Copy to Clipboard Toggle word wrap
    2. 运行以下命令,为对等 pod VNet 创建公共 IP 地址:

      $ az network public-ip create -g "${AZURE_RESOURCE_GROUP}" \
          -n "${PEERPOD_NAT_GW_IP}" -l "${AZURE_REGION}"
      Copy to Clipboard Toggle word wrap
    3. 运行以下命令,为对等 pod VNet 创建 NAT 网关:

      $ az network nat gateway create -g "${AZURE_RESOURCE_GROUP}" \
          -l "${AZURE_REGION}" \
          --public-ip-addresses "${PEERPOD_NAT_GW_IP}" \
          -n "${PEERPOD_NAT_GW}"
      Copy to Clipboard Toggle word wrap
    4. 运行以下命令,在对等 pod VNet 中创建子网并附加 NAT 网关:

      $ az network vnet subnet create \
          --resource-group "${AZURE_RESOURCE_GROUP}" \
          --vnet-name "${PEERPOD_VNET_NAME}" \
          --name "${PEERPOD_SUBNET_NAME}" \
          --address-prefixes "${PEERPOD_SUBNET_CIDR}" \
          --nat-gateway "${PEERPOD_NAT_GW}"
      Copy to Clipboard Toggle word wrap
  5. 配置虚拟网络对等连接:

    1. 运行以下命令来创建对等连接:

      $ az network vnet peering create -g "${AZURE_RESOURCE_GROUP}" \
          -n peerpod-azure-vnet-to-peerpod-vnet \
          --vnet-name "${AZURE_VNET_NAME}" \
          --remote-vnet "${PEERPOD_VNET_NAME}" --allow-vnet-access \
          --allow-forwarded-traffic
      Copy to Clipboard Toggle word wrap
    2. 运行以下命令来同步对等连接:

      $ az network vnet peering sync -g "${AZURE_RESOURCE_GROUP}" \
          -n peerpod-azure-vnet-to-peerpod-vnet \
          --vnet-name "${AZURE_VNET_NAME}"
      Copy to Clipboard Toggle word wrap
    3. 运行以下命令来完成 peering 连接:

      $ az network vnet peering create -g "${AZURE_RESOURCE_GROUP}" \
          -n peerpod-peerpod-vnet-to-azure-vnet \
          --vnet-name "${PEERPOD_VNET_NAME}" \
          --remote-vnet "${AZURE_VNET_NAME}" --allow-vnet-access \
          --allow-forwarded-traffic
      Copy to Clipboard Toggle word wrap

验证

  1. 运行以下命令,从集群 VNet 检查对等连接状态:

    $ az network vnet peering show -g "${AZURE_RESOURCE_GROUP}" \
        -n peerpod-azure-vnet-to-peerpod-vnet \
        --vnet-name "${AZURE_VNET_NAME}" \
        --query "peeringState" -o tsv
    Copy to Clipboard Toggle word wrap

    这应该返回 Connected

  2. 运行以下命令,验证 NAT 网关是否已附加到对等 pod 子网:

    $ az network vnet subnet show --resource-group "${AZURE_RESOURCE_GROUP}" \
        --vnet-name "${PEERPOD_VNET_NAME}" --name "${PEERPOD_SUBNET_NAME}" \
        --query "natGateway.id" -o tsv
    Copy to Clipboard Toggle word wrap

4.3. 安装 OpenShift 沙盒容器 Operator

您可以使用命令行界面(CLI)安装 OpenShift 沙盒容器 Operator。

先决条件

  • 您可以使用具有 cluster-admin 角色的用户访问集群。

流程

  1. 创建 osc-namespace.yaml 清单文件:

    apiVersion: v1
    kind: Namespace
    metadata:
      name: openshift-sandboxed-containers-operator
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令创建命名空间:

    $ oc apply -f osc-namespace.yaml
    Copy to Clipboard Toggle word wrap
  3. 创建 osc-operatorgroup.yaml 清单文件:

    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: sandboxed-containers-operator-group
      namespace: openshift-sandboxed-containers-operator
    spec:
      targetNamespaces:
      - openshift-sandboxed-containers-operator
    Copy to Clipboard Toggle word wrap
  4. 运行以下命令来创建 operator 组:

    $ oc apply -f osc-operatorgroup.yaml
    Copy to Clipboard Toggle word wrap
  5. 创建 osc-subscription.yaml 清单文件:

    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: sandboxed-containers-operator
      namespace: openshift-sandboxed-containers-operator
    spec:
      channel: stable
      installPlanApproval: Automatic
      name: sandboxed-containers-operator
      source: redhat-operators
      sourceNamespace: openshift-marketplace
      startingCSV: sandboxed-containers-operator.v1.10.1
    Copy to Clipboard Toggle word wrap
  6. 运行以下命令来创建订阅:

    $ oc apply -f osc-subscription.yaml
    Copy to Clipboard Toggle word wrap
  7. 运行以下命令验证 Operator 是否已正确安装:

    $ oc get csv -n openshift-sandboxed-containers-operator
    Copy to Clipboard Toggle word wrap

    此命令可能需要几分钟来完成。

  8. 运行以下命令监控进程:

    $ watch oc get csv -n openshift-sandboxed-containers-operator
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME                             DISPLAY                                  VERSION             REPLACES                   PHASE
    openshift-sandboxed-containers   openshift-sandboxed-containers-operator  1.10.1    1.9.0        Succeeded
    Copy to Clipboard Toggle word wrap

4.4. 创建对等 pod 配置映射

您必须创建对等 pod 配置映射。

流程

  1. 从 Azure 实例获取以下值:

    1. 检索并记录 Azure 资源组:

      $ AZURE_RESOURCE_GROUP=$(oc get infrastructure/cluster \
        -o jsonpath='{.status.platformStatus.azure.resourceGroupName}') \
        && echo "AZURE_RESOURCE_GROUP: \"$AZURE_RESOURCE_GROUP\""
      Copy to Clipboard Toggle word wrap
    2. 检索并记录 Azure VNet 名称:

      $ AZURE_VNET_NAME=$(az network vnet list \
        --resource-group ${AZURE_RESOURCE_GROUP} \
        --query "[].{Name:name}" --output tsv)
      Copy to Clipboard Toggle word wrap

      这个值用于检索 Azure 子网 ID。

    3. 检索并记录 Azure 子网 ID:

      $ AZURE_SUBNET_ID=$(az network vnet subnet list \
        --resource-group ${AZURE_RESOURCE_GROUP} --vnet-name $AZURE_VNET_NAME \
        --query "[].{Id:id} | [? contains(Id, 'worker')]" --output tsv) \
         && echo "AZURE_SUBNET_ID: \"$AZURE_SUBNET_ID\""
      Copy to Clipboard Toggle word wrap
    4. 检索并记录 Azure 网络安全组(NSG) ID:

      $ AZURE_NSG_ID=$(az network nsg list --resource-group ${AZURE_RESOURCE_GROUP} \
        --query "[].{Id:id}" --output tsv) && echo "AZURE_NSG_ID: \"$AZURE_NSG_ID\""
      Copy to Clipboard Toggle word wrap
    5. 检索并记录 Azure 区域:

      $ AZURE_REGION=$(az group show --resource-group ${AZURE_RESOURCE_GROUP} \
        --query "{Location:location}" --output tsv) \
        && echo "AZURE_REGION: \"$AZURE_REGION\""
      Copy to Clipboard Toggle word wrap
  2. 根据以下示例创建 peer-pods-cm.yaml 清单文件:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: peer-pods-cm
      namespace: openshift-sandboxed-containers-operator
    data:
      CLOUD_PROVIDER: "azure"
      VXLAN_PORT: "9000"
      PROXY_TIMEOUT: "5m"
      AZURE_INSTANCE_SIZE: "Standard_B2als_v2"
      AZURE_INSTANCE_SIZES: "Standard_B2als_v2,Standard_D2as_v5,Standard_D4as_v5,Standard_D2ads_v5"
      AZURE_SUBNET_ID: "<azure_subnet_id>"
      AZURE_NSG_ID: "<azure_nsg_id>"
      AZURE_IMAGE_ID: "<azure_image_id>"
      AZURE_REGION: "<azure_region>"
      AZURE_RESOURCE_GROUP: "<azure_resource_group>"
      TAGS: "key1=value1,key2=value2"
      PEERPODS_LIMIT_PER_NODE: "10"
      ROOT_VOLUME_SIZE: "6"
      DISABLECVM: "true"
    Copy to Clipboard Toggle word wrap
    AZURE_INSTANCE_SIZE
    如果工作负载对象中没有定义实例大小,则定义使用的默认实例大小。
    AZURE_INSTANCE_SIZES
    指定实例大小(没有空格)用于创建 pod。您可以为需要较少的内存和更少的 CPU 或更大实例大小的工作负载定义较小的实例大小。
    标签
    您可以将自定义标签配置为 pod 虚拟机实例的 key:value 对,以跟踪对等 pod 成本或标识不同集群中的对等 pod。
    PEERPODS_LIMIT_PER_NODE
    您可以增加这个值以在节点上运行更多对等 pod。默认值为 10
    ROOT_VOLUME_SIZE
    您可以为带有更大容器镜像的 pod 增加这个值。指定 pod 虚拟机的 root 卷大小,以 GB 为单位。默认和最小大小为 6 GB。
  3. 运行以下命令来创建配置映射:

    $ oc create -f peer-pods-cm.yaml
    Copy to Clipboard Toggle word wrap

4.5. 为对等 pod 配置 pull secret

要从私有 registry 中拉取 pod 虚拟机镜像,您必须为对等 pod 配置 pull secret。

然后,您可以将 pull secret 链接到 default 服务帐户,也可以在对等 pod 清单中指定 pull secret。

流程

  1. NS 变量设置为部署对等 pod 的命名空间:

    $ NS=<namespace>
    Copy to Clipboard Toggle word wrap
  2. 将 pull secret 复制到对等 pod 命名空间:

    $ oc get secret pull-secret -n openshift-config -o yaml \
      | sed "s/namespace: openshift-config/namespace: ${NS}/" \
      | oc apply -n "${NS}" -f -
    Copy to Clipboard Toggle word wrap

    您可以使用集群 pull secret,如下例所示或自定义 pull secret。

  3. 可选:将 pull secret 链接到 default 服务帐户:

    $ oc secrets link default pull-secret --for=pull -n ${NS}
    Copy to Clipboard Toggle word wrap
  4. 或者,将 pull secret 添加到对等 pod 清单中:

    apiVersion: v1
    kind: <Pod>
    spec:
      containers:
      - name: <container_name>
        image: <image_name>
      imagePullSecrets:
      - name: pull-secret
    # ...
    Copy to Clipboard Toggle word wrap

4.6. 选择自定义对等 pod 虚拟机镜像

您可以通过向 pod 清单添加注解来选择自定义对等 pod 虚拟机(VM)镜像,根据您的工作负载要求量身定制。自定义镜像覆盖对等 pod 配置映射中指定的默认镜像。

先决条件

  • 您有自定义 pod 虚拟机镜像的 ID,该镜像与您的云供应商或 hypervisor 兼容。

流程

  1. 根据以下示例创建 my-pod-manifest.yaml 文件:

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod-manifest
      annotations:
        io.katacontainers.config.hypervisor.image: "<custom_image_id>"
    spec:
      runtimeClassName: kata-remote
      containers:
      - name: <example_container>
        image: registry.access.redhat.com/ubi9/ubi:9.3
        command: ["sleep", "36000"]
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令来创建 pod:

    $ oc create -f my-pod-manifest.yaml
    Copy to Clipboard Toggle word wrap

4.7. 创建 Azure secret

您必须创建 SSH 密钥 secret,这是 Azure 虚拟机(VM)创建 API 所需的。Azure 只需要 SSH 公钥。OpenShift 沙盒容器会禁用虚拟机中的 SSH,因此密钥在虚拟机中无效。

流程

  1. 运行以下命令来生成 SSH 密钥对:

    $ ssh-keygen -f ./id_rsa -N ""
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令来创建 Secret 对象:

    $ oc create secret generic ssh-key-secret \
      -n openshift-sandboxed-containers-operator \
      --from-file=id_rsa.pub=./id_rsa.pub \
      --from-file=id_rsa=./id_rsa
    Copy to Clipboard Toggle word wrap
  3. 删除您创建的 SSH 密钥:

    $ shred --remove id_rsa.pub id_rsa
    Copy to Clipboard Toggle word wrap

4.8. 自定义 Kata 代理策略

Kata 代理策略是一种安全机制,用于控制使用 Kata 运行时运行的 pod 的代理 API 请求。使用 Rego 编写并由 Pod 虚拟机(VM)中的 Kata 代理强制,此策略决定哪些操作被允许或拒绝。

您可以针对特定用例使用自定义策略来覆盖默认策略,如在安全不是关注的地方进行开发和测试。例如,您可以在 control plane 可以被信任的环境中运行。您可以通过几种方法应用自定义策略:

  • 将其嵌入到 pod 虚拟机镜像中。
  • 修补对等 pod 配置映射。
  • 为工作负载 pod YAML 添加注解。

对于生产环境系统,首选的方法是使用 initdata 覆盖 Kata 代理策略。以下流程使用 io.katacontainers.config.agent.policy 注解将自定义策略应用到单独的 pod。该策略以 Base64 编码的 Rego 格式提供。此方法会在创建 Pod 时覆盖默认策略,而不修改 pod 虚拟机镜像。

注意

自定义策略完全替换了默认策略。要只修改特定的 API,请包含完整的策略并调整相关规则。

流程

  1. 使用自定义策略创建 policy.rego 文件。以下示例显示了所有可配置的 API:

    package agent_policy
    
    default AddARPNeighborsRequest := true
    default AddSwapRequest := true
    default CloseStdinRequest := true
    default CopyFileRequest := true
    default CreateContainerRequest := true
    default CreateSandboxRequest := true
    default DestroySandboxRequest := true
    default ExecProcessRequest := true
    default GetMetricsRequest := true
    default GetOOMEventRequest := true
    default GuestDetailsRequest := true
    default ListInterfacesRequest := true
    default ListRoutesRequest := true
    default MemHotplugByProbeRequest := true
    default OnlineCPUMemRequest := true
    default PauseContainerRequest := true
    default PullImageRequest := true
    default ReadStreamRequest := true
    default RemoveContainerRequest := true
    default RemoveStaleVirtiofsShareMountsRequest := true
    default ReseedRandomDevRequest := true
    default ResumeContainerRequest := true
    default SetGuestDateTimeRequest := true
    default SetPolicyRequest := true
    default SignalProcessRequest := true
    default StartContainerRequest := true
    default StartTracingRequest := true
    default StatsContainerRequest := true
    default StopTracingRequest := true
    default TtyWinResizeRequest := true
    default UpdateContainerRequest := true
    default UpdateEphemeralMountsRequest := true
    default UpdateInterfaceRequest := true
    default UpdateRoutesRequest := true
    default WaitProcessRequest := true
    default WriteStreamRequest := true
    Copy to Clipboard Toggle word wrap

    默认策略允许所有 API 调用。根据您的需要,调整 truefalse 值以进一步自定义策略。

  2. 运行以下命令,将 policy.rego 文件转换为 Base64 编码的字符串:

    $ base64 -w0 policy.rego
    Copy to Clipboard Toggle word wrap

    将输出保存到 yaml 文件中。

  3. 将 Base64 编码的策略添加到 my-pod.yaml pod 规格文件中:

    apiVersion: v1
    kind: Pod
    metadata:
      name: <pod_name>
      annotations:
        io.katacontainers.config.agent.policy: <base64_encoded_policy>
    spec:
      runtimeClassName: kata-remote
      containers:
      - name: <container_name>
        image: registry.access.redhat.com/ubi9/ubi:latest
        command:
        - sleep
        - "36000"
        securityContext:
          privileged: false
          seccompProfile:
            type: RuntimeDefault
    Copy to Clipboard Toggle word wrap
  4. 运行以下命令来应用 pod 清单:

    $ oc apply -f my-pod.yaml
    Copy to Clipboard Toggle word wrap

4.9. 创建 KataConfig 自定义资源

您必须创建 KataConfig 自定义资源(CR)来作为 worker 节点上的运行时类安装 kata-remote

OpenShift 沙盒容器将 kata-remote 安装为集群上的 辅助 可选运行时,而不是主运行时。

创建 KataConfig CR 会自动重启 worker 节点。重启可能需要 10 到 60 分钟。以下因素可以提高重启时间:

  • 带有更多 worker 节点的大型 OpenShift Container Platform 部署。
  • 激活 BIOS 和 Diagnostics 实用程序。
  • 在硬盘而不是 SSD 上部署。
  • 在物理节点上部署,如裸机,而不是在虚拟节点上部署。
  • CPU 和网络较慢。

流程

  1. 根据以下示例创建 example-kataconfig.yaml 清单文件:

    apiVersion: kataconfiguration.openshift.io/v1
    kind: KataConfig
    metadata:
      name: example-kataconfig
    spec:
      enablePeerPods: true
      logLevel: info
    #  kataConfigPoolSelector:
    #    matchLabels:
    #      <label_key>: '<label_value>' 
    1
    Copy to Clipboard Toggle word wrap
    1
    可选:如果您应用了节点标签在特定节点上安装 kata-remote,请指定键和值,例如 osc: 'true'
  2. 运行以下命令来创建 KataConfig CR:

    $ oc apply -f example-kataconfig.yaml
    Copy to Clipboard Toggle word wrap

    新的 KataConfig CR 被创建,并在 worker 节点上作为运行时类安装 kata-remote

    在验证安装前,等待 kata-remote 安装完成,以及 worker 节点重新引导。

  3. 运行以下命令监控安装进度:

    $ watch "oc describe kataconfig | sed -n /^Status:/,/^Events/p"
    Copy to Clipboard Toggle word wrap

    安装 kataNodes 下所有 worker 的状态并且条件 InProgressFalse 时,而不指定原因,则会在集群中安装 kata-remote

  4. 运行以下命令验证守护进程集:

    $ oc get -n openshift-sandboxed-containers-operator ds/osc-caa-ds
    Copy to Clipboard Toggle word wrap
  5. 运行以下命令验证运行时类:

    $ oc get runtimeclass
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME             HANDLER          AGE
    kata-remote      kata-remote      152m
    Copy to Clipboard Toggle word wrap

4.10. 修改每个节点的对等 pod 虚拟机数量

您可以通过编辑 peerpodConfig 自定义资源(CR)来修改每个节点的对等 pod 虚拟机限制。

流程

  1. 运行以下命令检查当前的限制:

    $ oc get peerpodconfig peerpodconfig-openshift -n openshift-sandboxed-containers-operator \
      -o jsonpath='{.spec.limit}{"\n"}'
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令,为 limit 键指定新值:

    $ oc patch peerpodconfig peerpodconfig-openshift -n openshift-sandboxed-containers-operator \
      --type merge --patch '{"spec":{"limit":"<value>"}}'
    Copy to Clipboard Toggle word wrap

4.11. 验证 pod 虚拟机镜像

在集群中安装 kata-remote 后,OpenShift 沙盒容器 Operator 会创建一个 pod 虚拟机镜像,用于创建对等 pod。此过程可能需要很长时间,因为镜像是在云实例上创建的。您可以通过检查您为云供应商创建的配置映射来验证 pod 虚拟机镜像是否已成功创建。

流程

  1. 获取您为对等 pod 创建的配置映射:

    $ oc get configmap peer-pods-cm -n openshift-sandboxed-containers-operator -o yaml
    Copy to Clipboard Toggle word wrap
  2. 检查 YAML 文件 的状态 小节。

    如果 AZURE_IMAGE_ID 参数被填充,则 pod 虚拟机镜像已被成功创建。

故障排除

  1. 运行以下命令来检索事件日志:

    $ oc get events -n openshift-sandboxed-containers-operator --field-selector involvedObject.name=osc-podvm-image-creation
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令来检索作业日志:

    $ oc logs -n openshift-sandboxed-containers-operator jobs/osc-podvm-image-creation
    Copy to Clipboard Toggle word wrap

如果您无法解决这个问题,请提交红帽支持问题单并附加这两个日志的输出。

4.12. 为 OpenShift 沙盒容器配置工作负载

您可以通过将 kata-remote 设置为以下 pod 模板对象的运行时类来配置 OpenShift 沙盒容器的工作负载:

  • Pod 对象
  • ReplicaSet 对象
  • ReplicationController 对象
  • StatefulSet 对象
  • Deployment 对象
  • deploymentConfig 对象
重要

不要在 Operator 命名空间中部署工作负载。为这些资源创建一个专用命名空间。

您可以通过在 YAML 文件中添加注解,定义工作负载是否使用配置映射中定义的默认实例大小进行部署。

如果您不想手动定义实例大小,您可以添加注解来使用自动实例大小,具体取决于可用内存。

先决条件

  • 您已创建了 KataConfig 自定义资源(CR)。

流程

  1. spec.runtimeClassName: kata-remote 添加到每个 pod 模板工作负载对象的清单中,如下例所示:

    apiVersion: v1
    kind: <object>
    # ...
    spec:
      runtimeClassName: kata-remote
    # ...
    Copy to Clipboard Toggle word wrap
  2. 可选: 要使用手动定义的实例大小,请使用配置映射中定义的实例大小添加以下注解:

    apiVersion: v1
    kind: <object>
    metadata:
      annotations:
        io.katacontainers.config.hypervisor.machine_type: <machine_type>
    # ...
    Copy to Clipboard Toggle word wrap
  3. 可选: 要使用自动实例大小,请添加以下注解:

    apiVersion: v1
    kind: <Pod>
    metadata:
      annotations:
        io.katacontainers.config.hypervisor.default_vcpus: <vcpus>
        io.katacontainers.config.hypervisor.default_memory: <memory>
    # ...
    Copy to Clipboard Toggle word wrap

    工作负载将根据可用内存量在自动实例大小上运行。

  4. 运行以下命令,将更改应用到工作负载对象:

    $ oc apply -f <object.yaml>
    Copy to Clipboard Toggle word wrap

    OpenShift Container Platform 创建工作负载对象并开始调度它。

验证

  • 检查 pod 模板对象的 spec.runtimeClassName 字段。如果值为 kata-remote,则工作负载在 OpenShift 沙盒容器中运行。

您可以在 Google Cloud 上部署 OpenShift 沙盒容器,

重要

Google Cloud 上的 Red Hat OpenShift 沙盒容器只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

您可以通过执行以下步骤部署 OpenShift 沙盒容器:

  1. 在 OpenShift Container Platform 集群上安装 OpenShift 沙盒容器 Operator。
  2. 启用端口以允许内部与对等 pod 通信。
  3. 创建对等 pod 配置映射。
  4. 创建 pod 虚拟机镜像配置映射。
  5. 可选:自定义 Kata 代理策略。
  6. 创建 KataConfig 自定义资源。
  7. 可选:修改每个 worker 节点上运行的虚拟机数量。
  8. 为 OpenShift 沙盒容器配置工作负载。

5.1. 先决条件

  • 已安装 Red Hat OpenShift Container Platform 4.17 或更高版本。
  • OpenShift Container Platform 集群至少有一个 worker 节点。
  • 您已为用于 worker 节点和 pod 虚拟机(VM)的子网中的通信启用了端口 15150 和 9000。端口启用在 worker 节点上运行的 Kata shim 和 pod 虚拟机上运行的 Kata 代理之间的通信。

5.2. 安装 OpenShift 沙盒容器 Operator

您可以使用命令行界面(CLI)安装 OpenShift 沙盒容器 Operator。

先决条件

  • 您可以使用具有 cluster-admin 角色的用户访问集群。

流程

  1. 创建 osc-namespace.yaml 清单文件:

    apiVersion: v1
    kind: Namespace
    metadata:
      name: openshift-sandboxed-containers-operator
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令创建命名空间:

    $ oc apply -f osc-namespace.yaml
    Copy to Clipboard Toggle word wrap
  3. 创建 osc-operatorgroup.yaml 清单文件:

    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: sandboxed-containers-operator-group
      namespace: openshift-sandboxed-containers-operator
    spec:
      targetNamespaces:
      - openshift-sandboxed-containers-operator
    Copy to Clipboard Toggle word wrap
  4. 运行以下命令来创建 operator 组:

    $ oc apply -f osc-operatorgroup.yaml
    Copy to Clipboard Toggle word wrap
  5. 创建 osc-subscription.yaml 清单文件:

    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: sandboxed-containers-operator
      namespace: openshift-sandboxed-containers-operator
    spec:
      channel: stable
      installPlanApproval: Automatic
      name: sandboxed-containers-operator
      source: redhat-operators
      sourceNamespace: openshift-marketplace
      startingCSV: sandboxed-containers-operator.v1.10.1
    Copy to Clipboard Toggle word wrap
  6. 运行以下命令来创建订阅:

    $ oc apply -f osc-subscription.yaml
    Copy to Clipboard Toggle word wrap
  7. 运行以下命令验证 Operator 是否已正确安装:

    $ oc get csv -n openshift-sandboxed-containers-operator
    Copy to Clipboard Toggle word wrap

    此命令可能需要几分钟来完成。

  8. 运行以下命令监控进程:

    $ watch oc get csv -n openshift-sandboxed-containers-operator
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME                             DISPLAY                                  VERSION             REPLACES                   PHASE
    openshift-sandboxed-containers   openshift-sandboxed-containers-operator  1.10.1    1.9.0        Succeeded
    Copy to Clipboard Toggle word wrap

5.3. 为 Google Cloud 启用端口 15150

您必须启用端口 15150,以允许内部与 Compute Engine 上运行的对等 pod 通信。

先决条件

  • 已安装 Google Cloud 命令行界面(CLI)工具。
  • 您可以使用具有 roles/container.admin 角色的用户访问 OpenShift Container Platform 集群。

流程

  1. 运行以下命令来设置项目 ID 变量:

    $ export GCP_PROJECT_ID="<project_id>"
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令登录到 Google Cloud:

    $ gcloud auth login
    Copy to Clipboard Toggle word wrap
  3. 运行以下命令来设置 Google Cloud 项目 ID:

    $ gcloud config set project ${GCP_PROJECT_ID}
    Copy to Clipboard Toggle word wrap
  4. 运行以下命令打开端口 15150 :

    $ gcloud compute firewall-rules create allow-port-15150-restricted \
       --project=${GCP_PROJECT_ID} \
       --network=default \
       --allow=tcp:15150 \
       --source-ranges=<external_ip_cidr-1>[,<external_ip_cidr-2>,...] 
    1
    Copy to Clipboard Toggle word wrap
    1
    以 CIDR 格式指定一个或多个 IP 地址或范围,用逗号分开。例如,203.0.113.5/32,198.51.100.0/24

验证

  • 运行以下命令验证端口 15150 已被打开:

    $ gcloud compute firewall-rule list
    Copy to Clipboard Toggle word wrap

5.4. 创建对等 pod 配置映射

您必须创建对等 pod 配置映射。

流程

  1. 登录到您的 Compute Engine 实例以设置以下环境变量:

    1. 运行以下命令来获取项目 ID:

      $ GCP_PROJECT_ID=$(gcloud config get-value project)
      Copy to Clipboard Toggle word wrap
    2. 运行以下命令来获取区:

      $ GCP_ZONE=$(gcloud config get-value compute/zone)
      Copy to Clipboard Toggle word wrap
    3. 运行以下命令来检索网络名称列表:

      $ gcloud compute networks list --format="value(name)"
      Copy to Clipboard Toggle word wrap
    4. 运行以下命令来指定网络:

      $ GCP_NETWORK=<network_name>
      Copy to Clipboard Toggle word wrap

      仅支持 auto-mode 网络。目前不支持自定义网络。

  2. 根据以下示例创建 peer-pods-cm.yaml 清单文件:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: peer-pods-cm
      namespace: openshift-sandboxed-containers-operator
    data:
      CLOUD_PROVIDER: "gcp"
      VXLAN_PORT: "9000"
      PROXY_TIMEOUT: "5m"
      GCP_MACHINE_TYPE: "e2-medium"
      GCP_PROJECT_ID: "<project_id>"
      GCP_ZONE: "<gcp_zone>"
      GCP_NETWORK: "<gcp_network>"
      TAGS: "key1=value1,key2=value2"
      PEERPODS_LIMIT_PER_NODE: "10"
      ROOT_VOLUME_SIZE: "6"
      DISABLECVM: "true"
    Copy to Clipboard Toggle word wrap
    GCP_MACHINE_TYPE
    如果工作负载对象中没有定义机器类型,则定义使用的默认机器类型。
    标签
    您可以将自定义标签配置为 pod 虚拟机实例的 key:value 对,以跟踪对等 pod 成本或标识不同集群中的对等 pod。
    PEERPODS_LIMIT_PER_NODE
    您可以增加这个值以在节点上运行更多对等 pod。默认值为 10
    ROOT_VOLUME_SIZE
    您可以为带有更大容器镜像的 pod 增加这个值。指定 pod 虚拟机的 root 卷大小,以 GB 为单位。默认和最小大小为 6 GB。
  3. 运行以下命令来创建配置映射:

    $ oc create -f peer-pods-cm.yaml
    Copy to Clipboard Toggle word wrap

5.5. 创建对等 pod 虚拟机镜像

您必须创建一个 QCOW2 peer pod 虚拟机(VM)镜像。

先决条件

  • 已安装 podman
  • 您可以访问容器 registry。

流程

  1. 运行以下命令克隆 OpenShift 沙盒容器存储库:

    $ git clone https://github.com/openshift/sandboxed-containers-operator.git
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令,进入 sandboxed-containers-operator/config/peerpods/podvm/bootc

    $ cd sandboxed-containers-operator/config/peerpods/podvm/bootc
    Copy to Clipboard Toggle word wrap
  3. 运行以下命令登录到 registry.redhat.io

    $ podman login registry.redhat.io
    Copy to Clipboard Toggle word wrap

    您必须登录 registry.redhat.io,因为 podman 构建进程 必须访问托管在 registry 上的 Containerfile.rhel 容器镜像。

  4. 运行以下命令,为您的容器 registry 设置镜像路径:

    $ IMG="<container_registry_url>/<username>/podvm-bootc:latest"
    Copy to Clipboard Toggle word wrap
  5. 运行以下命令构建 pod 虚拟机 bootc 镜像:

    $ podman build -t ${IMG} -f Containerfile.rhel .
    Copy to Clipboard Toggle word wrap
  6. 运行以下命令登录到您的容器 registry:

    $ podman login <container_registry_url>
    Copy to Clipboard Toggle word wrap
  7. 运行以下命令将镜像推送到容器 registry 中:

    $ podman push ${IMG}
    Copy to Clipboard Toggle word wrap

    对于测试和开发,您可以使镜像变为公共镜像。

  8. 运行以下命令验证 podvm-bootc 镜像:

    $ podman images
    Copy to Clipboard Toggle word wrap

    输出示例

    REPOSITORY                               TAG     IMAGE ID      CREATED         SIZE
    example.com/example_user/podvm-bootc     latest  88ddab975a07  2 seconds ago   1.82 GB
    Copy to Clipboard Toggle word wrap

5.6. 创建对等 pod 虚拟机镜像配置映射

为 pod 虚拟机(VM)镜像创建配置映射。

流程

  1. 使用以下内容创建 podvm-image-cm.yaml 清单:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: podvm-image-cm
      namespace: openshift-sandboxed-containers-operator
    data:
      IMAGE_TYPE: pre-built
      PODVM_IMAGE_URI: <container_registry_url>/<username>/podvm-bootc:latest
      IMAGE_BASE_NAME: "podvm-image"
      IMAGE_VERSION: "0-0-0"
    
      INSTALL_PACKAGES: "no"
      DISABLE_CLOUD_CONFIG: "true"
      UPDATE_PEERPODS_CM: "yes"
      BOOT_FIPS: "no"
    
      BOOTC_BUILD_CONFIG: |
        [[customizations.user]]
        name = "peerpod"
        password = "peerpod"
        groups = ["wheel", "root"]
    
        [[customizations.filesystem]]
        mountpoint = "/"
        minsize = "5 GiB"
    
        [[customizations.filesystem]]
        mountpoint = "/var/kata-containers"
        minsize = "15 GiB"
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令来创建配置映射:

    $ oc create -f podvm-image-cm.yaml
    Copy to Clipboard Toggle word wrap

5.7. 自定义 Kata 代理策略

Kata 代理策略是一种安全机制,用于控制使用 Kata 运行时运行的 pod 的代理 API 请求。使用 Rego 编写并由 Pod 虚拟机(VM)中的 Kata 代理强制,此策略决定哪些操作被允许或拒绝。

您可以针对特定用例使用自定义策略来覆盖默认策略,如在安全不是关注的地方进行开发和测试。例如,您可以在 control plane 可以被信任的环境中运行。您可以通过几种方法应用自定义策略:

  • 将其嵌入到 pod 虚拟机镜像中。
  • 修补对等 pod 配置映射。
  • 为工作负载 pod YAML 添加注解。

对于生产环境系统,首选的方法是使用 initdata 覆盖 Kata 代理策略。以下流程使用 io.katacontainers.config.agent.policy 注解将自定义策略应用到单独的 pod。该策略以 Base64 编码的 Rego 格式提供。此方法会在创建 Pod 时覆盖默认策略,而不修改 pod 虚拟机镜像。

注意

自定义策略完全替换了默认策略。要只修改特定的 API,请包含完整的策略并调整相关规则。

流程

  1. 使用自定义策略创建 policy.rego 文件。以下示例显示了所有可配置的 API:

    package agent_policy
    
    default AddARPNeighborsRequest := true
    default AddSwapRequest := true
    default CloseStdinRequest := true
    default CopyFileRequest := true
    default CreateContainerRequest := true
    default CreateSandboxRequest := true
    default DestroySandboxRequest := true
    default ExecProcessRequest := true
    default GetMetricsRequest := true
    default GetOOMEventRequest := true
    default GuestDetailsRequest := true
    default ListInterfacesRequest := true
    default ListRoutesRequest := true
    default MemHotplugByProbeRequest := true
    default OnlineCPUMemRequest := true
    default PauseContainerRequest := true
    default PullImageRequest := true
    default ReadStreamRequest := true
    default RemoveContainerRequest := true
    default RemoveStaleVirtiofsShareMountsRequest := true
    default ReseedRandomDevRequest := true
    default ResumeContainerRequest := true
    default SetGuestDateTimeRequest := true
    default SetPolicyRequest := true
    default SignalProcessRequest := true
    default StartContainerRequest := true
    default StartTracingRequest := true
    default StatsContainerRequest := true
    default StopTracingRequest := true
    default TtyWinResizeRequest := true
    default UpdateContainerRequest := true
    default UpdateEphemeralMountsRequest := true
    default UpdateInterfaceRequest := true
    default UpdateRoutesRequest := true
    default WaitProcessRequest := true
    default WriteStreamRequest := true
    Copy to Clipboard Toggle word wrap

    默认策略允许所有 API 调用。根据您的需要,调整 truefalse 值以进一步自定义策略。

  2. 运行以下命令,将 policy.rego 文件转换为 Base64 编码的字符串:

    $ base64 -w0 policy.rego
    Copy to Clipboard Toggle word wrap

    将输出保存到 yaml 文件中。

  3. 将 Base64 编码的策略添加到 my-pod.yaml pod 规格文件中:

    apiVersion: v1
    kind: Pod
    metadata:
      name: <pod_name>
      annotations:
        io.katacontainers.config.agent.policy: <base64_encoded_policy>
    spec:
      runtimeClassName: kata-remote
      containers:
      - name: <container_name>
        image: registry.access.redhat.com/ubi9/ubi:latest
        command:
        - sleep
        - "36000"
        securityContext:
          privileged: false
          seccompProfile:
            type: RuntimeDefault
    Copy to Clipboard Toggle word wrap
  4. 运行以下命令来应用 pod 清单:

    $ oc apply -f my-pod.yaml
    Copy to Clipboard Toggle word wrap

5.8. 创建 KataConfig 自定义资源

您必须创建 KataConfig 自定义资源(CR)来作为 worker 节点上的运行时类安装 kata-remote

OpenShift 沙盒容器将 kata-remote 安装为集群上的 辅助 可选运行时,而不是主运行时。

创建 KataConfig CR 会自动重启 worker 节点。重启可能需要 10 到 60 分钟。以下因素可以提高重启时间:

  • 带有更多 worker 节点的大型 OpenShift Container Platform 部署。
  • 激活 BIOS 和 Diagnostics 实用程序。
  • 在硬盘而不是 SSD 上部署。
  • 在物理节点上部署,如裸机,而不是在虚拟节点上部署。
  • CPU 和网络较慢。

流程

  1. 根据以下示例创建 example-kataconfig.yaml 清单文件:

    apiVersion: kataconfiguration.openshift.io/v1
    kind: KataConfig
    metadata:
      name: example-kataconfig
    spec:
      enablePeerPods: true
      logLevel: info
    #  kataConfigPoolSelector:
    #    matchLabels:
    #      <label_key>: '<label_value>' 
    1
    Copy to Clipboard Toggle word wrap
    1
    可选:如果您应用了节点标签在特定节点上安装 kata-remote,请指定键和值,例如 osc: 'true'
  2. 运行以下命令来创建 KataConfig CR:

    $ oc apply -f example-kataconfig.yaml
    Copy to Clipboard Toggle word wrap

    新的 KataConfig CR 被创建,并在 worker 节点上作为运行时类安装 kata-remote

    在验证安装前,等待 kata-remote 安装完成,以及 worker 节点重新引导。

  3. 运行以下命令监控安装进度:

    $ watch "oc describe kataconfig | sed -n /^Status:/,/^Events/p"
    Copy to Clipboard Toggle word wrap

    安装 kataNodes 下所有 worker 的状态并且条件 InProgressFalse 时,而不指定原因,则会在集群中安装 kata-remote

  4. 运行以下命令验证守护进程集:

    $ oc get -n openshift-sandboxed-containers-operator ds/osc-caa-ds
    Copy to Clipboard Toggle word wrap
  5. 运行以下命令验证运行时类:

    $ oc get runtimeclass
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME             HANDLER          AGE
    kata-remote      kata-remote      152m
    Copy to Clipboard Toggle word wrap

5.9. 修改每个节点的对等 pod 虚拟机数量

您可以通过编辑 peerpodConfig 自定义资源(CR)来修改每个节点的对等 pod 虚拟机限制。

流程

  1. 运行以下命令检查当前的限制:

    $ oc get peerpodconfig peerpodconfig-openshift -n openshift-sandboxed-containers-operator \
      -o jsonpath='{.spec.limit}{"\n"}'
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令,为 limit 键指定新值:

    $ oc patch peerpodconfig peerpodconfig-openshift -n openshift-sandboxed-containers-operator \
      --type merge --patch '{"spec":{"limit":"<value>"}}'
    Copy to Clipboard Toggle word wrap

5.10. 验证 pod 虚拟机镜像

在集群中安装 kata-remote 后,OpenShift 沙盒容器 Operator 会创建一个 pod 虚拟机镜像,用于创建对等 pod。此过程可能需要很长时间,因为镜像是在云实例上创建的。您可以通过检查您为云供应商创建的配置映射来验证 pod 虚拟机镜像是否已成功创建。

流程

  1. 获取您为对等 pod 创建的配置映射:

    $ oc get configmap peer-pods-cm -n openshift-sandboxed-containers-operator -o yaml
    Copy to Clipboard Toggle word wrap
  2. 检查 YAML 文件 的状态 小节。

    如果 PODVM_IMAGE_NAME 参数被填充,则 pod 虚拟机镜像已被成功创建。

故障排除

  1. 运行以下命令来检索事件日志:

    $ oc get events -n openshift-sandboxed-containers-operator --field-selector involvedObject.name=osc-podvm-image-creation
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令来检索作业日志:

    $ oc logs -n openshift-sandboxed-containers-operator jobs/osc-podvm-image-creation
    Copy to Clipboard Toggle word wrap

如果您无法解决这个问题,请提交红帽支持问题单并附加这两个日志的输出。

5.11. 为 OpenShift 沙盒容器配置工作负载

您可以通过将 kata-remote 设置为以下 pod 模板对象的运行时类来配置 OpenShift 沙盒容器的工作负载:

  • Pod 对象
  • ReplicaSet 对象
  • ReplicationController 对象
  • StatefulSet 对象
  • Deployment 对象
  • deploymentConfig 对象
重要

不要在 Operator 命名空间中部署工作负载。为这些资源创建一个专用命名空间。

先决条件

  • 您已创建了 KataConfig 自定义资源(CR)。

流程

  1. spec.runtimeClassName: kata-remote 添加到每个 pod 模板工作负载对象的清单中,如下例所示:

    apiVersion: v1
    kind: <object>
    # ...
    spec:
      runtimeClassName: kata-remote
    # ...
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令,将更改应用到工作负载对象:

    $ oc apply -f <object.yaml>
    Copy to Clipboard Toggle word wrap

    OpenShift Container Platform 创建工作负载对象并开始调度它。

验证

  • 检查 pod 模板对象的 spec.runtimeClassName 字段。如果值为 kata-remote,则工作负载在 OpenShift 沙盒容器中运行。

您可以在 IBM Z® 和 IBM® LinuxONE 上部署 OpenShift 沙盒容器,

您可以通过执行以下步骤部署 OpenShift 沙盒容器:

  1. 在 OpenShift Container Platform 集群上安装 OpenShift 沙盒容器 Operator。
  2. 可选:配置 libvirt 卷。
  3. 可选:创建自定义对等 pod 虚拟机镜像。
  4. 创建对等 pod secret。
  5. 创建对等 pod 配置映射。
  6. 创建 pod 虚拟机镜像配置映射。
  7. 创建 KVM 主机 secret。
  8. 可选: 选择自定义对等 pod 虚拟机镜像。
  9. 可选:自定义 Kata 代理策略。
  10. 创建 KataConfig 自定义资源。
  11. 可选:修改每个 worker 节点上运行的虚拟机数量。
  12. 为 OpenShift 沙盒容器配置工作负载。
重要

IBM Z® 和 IBM® LinuxONE 上的 OpenShift 沙盒容器只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

6.1. 先决条件

  • 已安装 Red Hat OpenShift Container Platform 4.16 或更高版本。
  • OpenShift Container Platform 集群有三个 control plane 节点,以及至少两个 worker 节点。
  • 集群节点和对等 pod 位于相同的 IBM Z® KVM 主机逻辑分区中。
  • 集群节点和对等 pod 连接到同一子网。

6.2. 安装 OpenShift 沙盒容器 Operator

您可以使用命令行界面(CLI)安装 OpenShift 沙盒容器 Operator。

先决条件

  • 您可以使用具有 cluster-admin 角色的用户访问集群。

流程

  1. 创建 osc-namespace.yaml 清单文件:

    apiVersion: v1
    kind: Namespace
    metadata:
      name: openshift-sandboxed-containers-operator
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令创建命名空间:

    $ oc apply -f osc-namespace.yaml
    Copy to Clipboard Toggle word wrap
  3. 创建 osc-operatorgroup.yaml 清单文件:

    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: sandboxed-containers-operator-group
      namespace: openshift-sandboxed-containers-operator
    spec:
      targetNamespaces:
      - openshift-sandboxed-containers-operator
    Copy to Clipboard Toggle word wrap
  4. 运行以下命令来创建 operator 组:

    $ oc apply -f osc-operatorgroup.yaml
    Copy to Clipboard Toggle word wrap
  5. 创建 osc-subscription.yaml 清单文件:

    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: sandboxed-containers-operator
      namespace: openshift-sandboxed-containers-operator
    spec:
      channel: stable
      installPlanApproval: Automatic
      name: sandboxed-containers-operator
      source: redhat-operators
      sourceNamespace: openshift-marketplace
      startingCSV: sandboxed-containers-operator.v1.10.1
    Copy to Clipboard Toggle word wrap
  6. 运行以下命令来创建订阅:

    $ oc apply -f osc-subscription.yaml
    Copy to Clipboard Toggle word wrap
  7. 运行以下命令验证 Operator 是否已正确安装:

    $ oc get csv -n openshift-sandboxed-containers-operator
    Copy to Clipboard Toggle word wrap

    此命令可能需要几分钟来完成。

  8. 运行以下命令监控进程:

    $ watch oc get csv -n openshift-sandboxed-containers-operator
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME                             DISPLAY                                  VERSION             REPLACES                   PHASE
    openshift-sandboxed-containers   openshift-sandboxed-containers-operator  1.10.1    1.9.0        Succeeded
    Copy to Clipboard Toggle word wrap

6.3. 配置 libvirt 卷

OpenShift 沙盒容器 Operator 在安装过程中自动配置 KVM 主机上的 libvirt 卷和池。如果需要,您可以手动配置或创建额外的 libvirt 卷和池。

先决条件

  • 已使用 OpenShift Container Platform Web 控制台或命令行在 OpenShift Container Platform 集群上安装 OpenShift 沙盒容器 Operator。
  • 您有 KVM 主机的管理员特权。
  • 您已在 KVM 主机上安装了 podman
  • 您已在 KVM 主机上安装了 virt-customize
  • 您的镜像有一个 /var/lib/libvirt/images/ 目录。

流程

  1. 登录到 KVM 主机。
  2. 运行以下命令设置 libvirt 池的名称:

    $ export LIBVIRT_POOL=<libvirt_pool>
    Copy to Clipboard Toggle word wrap

    您需要 LIBVIRT_POOL 值来为 libvirt 提供程序创建 secret。

  3. 运行以下命令设置 libvirt 卷的名称:

    $ export LIBVIRT_VOL_NAME=<libvirt_volume>
    Copy to Clipboard Toggle word wrap

    您需要 LIBVIRT_VOL_NAME 值来为 libvirt 提供程序创建 secret。

  4. 运行以下命令,设置默认存储池位置的路径:

    $ export LIBVIRT_POOL_DIRECTORY="/var/lib/libvirt/images/"
    Copy to Clipboard Toggle word wrap
  5. 运行以下命令来创建 libvirt 池:

    $ virsh pool-define-as $LIBVIRT_POOL --type dir --target "$LIBVIRT_POOL_DIRECTORY"
    Copy to Clipboard Toggle word wrap
  6. 运行以下命令来启动 libvirt 池:

    $ virsh pool-start $LIBVIRT_POOL
    Copy to Clipboard Toggle word wrap
  7. 运行以下命令,为池创建 libvirt 卷:

    $ virsh -c qemu:///system \
      vol-create-as --pool $LIBVIRT_POOL \
      --name $LIBVIRT_VOL_NAME \
      --capacity 20G \
      --allocation 2G \
      --prealloc-metadata \
      --format qcow2
    Copy to Clipboard Toggle word wrap

6.4. 创建自定义对等 pod 虚拟机镜像

您可以创建自定义对等 pod 虚拟机(VM)镜像,而不是使用默认的 Operator 构建镜像。

您可以使用对等 pod QCOW2 镜像构建开放容器项目(OCI)容器。之后,您将容器 registry URL 和镜像路径添加到对等 pod 虚拟机镜像配置映射。

流程

  1. 创建 Dockerfile.podvm-oci 文件:

    FROM scratch
    
    ARG PODVM_IMAGE_SRC
    ENV PODVM_IMAGE_PATH="/image/podvm.qcow2"
    
    COPY $PODVM_IMAGE_SRC $PODVM_IMAGE_PATH
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令,使用 pod 虚拟机 QCOW2 镜像构建容器:

    $ docker build -t podvm-libvirt \
      --build-arg PODVM_IMAGE_SRC=<podvm_image_source> \ 
    1
    
      --build-arg PODVM_IMAGE_PATH=<podvm_image_path> \ 
    2
    
      -f Dockerfile.podvm-oci .
    Copy to Clipboard Toggle word wrap
    1
    指定主机上的 QCOW2 镜像源。
    2
    可选:如果没有使用默认的 /image/podvm.qcow2,请指定 QCOW2 镜像的路径。

6.5. 创建对等 pod secret

您必须创建一个对等 pod secret。secret 存储用于创建 pod 虚拟机(VM)镜像和对等 pod 实例的凭证。

先决条件

  • LIBVIRT_URI.这个值是 libvirt 网络的默认网关 IP 地址。检查 libvirt 网络设置以获取此值。

    注意

    如果 libvirt 使用默认网桥虚拟网络,您可以通过运行以下命令来获取 LIBVIRT_URI

    $ virtint=$(bridge_line=$(virsh net-info default | grep Bridge);  echo "${bridge_line//Bridge:/}" | tr -d [:blank:])
    
    $ LIBVIRT_URI=$( ip -4 addr show $virtint | grep -oP '(?<=inet\s)\d+(\.\d+){3}')
    
    $ LIBVIRT_GATEWAY_URI="qemu+ssh://root@${LIBVIRT_URI}/system?no_verify=1"
    Copy to Clipboard Toggle word wrap
  • 红帽_OFFLINE_TOKEN.您已生成此令牌,以通过 Red Hat API Tokens 下载 RHEL 镜像。

流程

  1. 根据以下示例创建 peer-pods-secret.yaml 清单文件:

    apiVersion: v1
    kind: Secret
    metadata:
      name: peer-pods-secret
      namespace: openshift-sandboxed-containers-operator
    type: Opaque
    stringData:
      CLOUD_PROVIDER: "libvirt"
      LIBVIRT_URI: "<libvirt_gateway_uri>" 
    1
    
      REDHAT_OFFLINE_TOKEN: "<rh_offline_token>" 
    2
    Copy to Clipboard Toggle word wrap
    1
    指定 libvirt URI。
    2
    指定 Operator 构建的镜像所需的红帽离线令牌。
  2. 运行以下命令来创建 secret:

    $ oc create -f peer-pods-secret.yaml
    Copy to Clipboard Toggle word wrap

6.6. 创建对等 pod 配置映射

您必须创建对等 pod 配置映射。

流程

  1. 根据以下示例创建 peer-pods-cm.yaml 清单文件:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: peer-pods-cm
      namespace: openshift-sandboxed-containers-operator
    data:
      CLOUD_PROVIDER: "libvirt"
      LIBVIRT_POOL: "<libvirt_pool>"
      LIBVIRT_VOL_NAME: "<libvirt_volume>"
      LIBVIRT_DIR_NAME: "/var/lib/libvirt/images/<directory_name>"
      LIBVIRT_NET: "default"
      PEERPODS_LIMIT_PER_NODE: "10"
      ROOT_VOLUME_SIZE: "6"
      DISABLECVM: "true"
    Copy to Clipboard Toggle word wrap
    LIBVIRT_POOL
    如果您手动配置了 libvirt 池,请使用与 KVM 主机配置相同的名称。
    LIBVIRT_VOL_NAME
    如果您手动配置 libvirt 卷,请使用与 KVM 主机配置相同的名称。
    LIBVIRT_DIR_NAME
    指定用于存储虚拟机磁盘镜像的 libvirt 目录,如 .qcow2.raw 文件。为确保 libvirt 具有读写访问权限,请使用 libvirt 存储目录的子目录。默认为 /var/lib/libvirt/images/
    LIBVIRT_NET
    如果您不想使用默认网络,请指定 libvirt 网络。
    PEERPODS_LIMIT_PER_NODE
    您可以增加这个值以在节点上运行更多对等 pod。默认值为 10
    ROOT_VOLUME_SIZE
    您可以为带有更大容器镜像的 pod 增加这个值。指定 pod 虚拟机的 root 卷大小,以 GB 为单位。默认和最小大小为 6 GB。
  2. 运行以下命令来创建配置映射:

    $ oc create -f peer-pods-cm.yaml
    Copy to Clipboard Toggle word wrap

6.7. 创建对等 pod 虚拟机镜像配置映射

您必须为对等 pod 虚拟机(VM)镜像创建配置映射。

先决条件

  • 您必须使用 Red Hat Hybrid Cloud Console 创建激活码。
  • 可选:如果要使用 Cloud API Adaptor 自定义镜像,则必须有镜像的名称、URL 和分支或标签。

流程

  1. 根据以下示例创建 libvirt-podvm-image-cm.yaml 清单:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: libvirt-podvm-image-cm
      namespace: openshift-sandboxed-containers-operator
    data:
      PODVM_DISTRO: "rhel"
      DOWNLOAD_SOURCES: "no" 
    1
    
      CAA_SRC: "https://github.com/confidential-containers/cloud-api-adaptor" 
    2
    
      CAA_REF: "main" 
    3
    
      CONFIDENTIAL_COMPUTE_ENABLED: "yes"
      UPDATE_PEERPODS_CM: "yes"
      ORG_ID: "<rhel_organization_id>"
      ACTIVATION_KEY: "<rhel_activation_key>" 
    4
    
      PODVM_IMAGE_URI: "oci::<image_repo_url>:<image_tag>::<image_path>" 
    5
    
      SE_BOOT: "true" 
    6
    
      BASE_OS_VERSION: "<rhel_image_os_version>" 
    7
    
      SE_VERIFY: "false" 
    8
    Copy to Clipboard Toggle word wrap
    1
    如果要使用自定义 Cloud API Adaptor 源来构建 pod 虚拟机镜像,请指定 yes
    2
    可选:指定 Cloud API Adaptor 自定义镜像的 URL。
    3
    可选:指定 Cloud API Adaptor 自定义镜像的分支或标签。
    4
    指定 RHEL 激活码。
    5
    可选:如果您创建了自定义对等 pod 虚拟机镜像,请指定容器 registry URL、镜像标签和镜像路径(默认为 /image/podvm.qcow2)。否则,将值设为 ""
    6
    默认值为 true,为默认 Operator 构建的镜像启用 IBM Secure Execution。如果您使用自定义对等 pod 虚拟机镜像,请将其设置为 false
    7
    指定 RHEL 镜像操作系统版本。IBM Z® Secure Execution 支持 RHEL 9.5 及更新的版本。
    8
    如果您不想使用 digicert CA 证书验证安全执行,请指定 false。默认值为 true
  2. 运行以下命令来创建配置映射:

    $ oc apply -f libvirt-podvm-image-cm.yaml
    Copy to Clipboard Toggle word wrap

    libvirt pod 虚拟机镜像配置映射为您的 libvirt 供应商创建。

6.8. 创建 KVM 主机 secret

您必须为 KVM 主机创建 secret。

流程

  1. 运行以下命令来生成 SSH 密钥对:

    $ ssh-keygen -f ./id_rsa -N ""
    Copy to Clipboard Toggle word wrap
  2. 将公共 SSH 密钥复制到 KVM 主机:

    $ ssh-copy-id -i ./id_rsa.pub <KVM_HOST_IP> 
    1
    Copy to Clipboard Toggle word wrap
    1
    指定 KVM 主机的 IP 地址或运行对等 pod 虚拟机的 LPAR。例如,192.168.2.1
  3. 运行以下命令来创建 Secret 对象:

    $ oc create secret generic ssh-key-secret \
      -n openshift-sandboxed-containers-operator \
      --from-file=id_rsa.pub=./id_rsa.pub \
      --from-file=id_rsa=./id_rsa
    Copy to Clipboard Toggle word wrap
  4. 删除您创建的 SSH 密钥:

    $ shred --remove id_rsa.pub id_rsa
    Copy to Clipboard Toggle word wrap

6.9. 选择自定义对等 pod 虚拟机镜像

您可以通过向 pod 清单添加注解来选择自定义对等 pod 虚拟机(VM)镜像,根据您的工作负载要求量身定制。自定义镜像覆盖对等 pod 配置映射中指定的默认镜像。

您可以在 libvirt 池中创建新的 libvirt 卷,并将自定义对等 pod 虚拟机镜像上传到新卷。然后,您将 pod 清单更新为使用自定义对等 pod 虚拟机镜像。

流程

  1. 运行以下命令设置 LIBVIRT_POOL 变量:

    $ export LIBVIRT_POOL=<libvirt_pool>
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令,将 LIBVIRT_VOL_NAME 变量设置为新的 libvirt 卷:

    $ export LIBVIRT_VOL_NAME=<new_libvirt_volume>
    Copy to Clipboard Toggle word wrap
  3. 运行以下命令,为池创建 libvirt 卷:

    $ virsh -c qemu:///system \
      vol-create-as --pool $LIBVIRT_POOL \
      --name $LIBVIRT_VOL_NAME \
      --capacity 20G \
      --allocation 2G \
      --prealloc-metadata \
      --format qcow2
    Copy to Clipboard Toggle word wrap
  4. 将自定义对等 pod 虚拟机镜像上传到新的 libvirt 卷:

    $ virsh -c qemu:///system vol-upload \
      --vol $LIBVIRT_VOL_NAME <custom_podvm_image.qcow2> \
      --pool $LIBVIRT_POOL --sparse
    Copy to Clipboard Toggle word wrap
  5. 根据以下示例创建 my-pod-manifest.yaml 文件:

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod-manifest
      annotations:
        io.katacontainers.config.hypervisor.image: "<new_libvirt_volume>"
    spec:
      runtimeClassName: kata-remote
      containers:
      - name: <example_container>
        image: registry.access.redhat.com/ubi9/ubi:9.3
        command: ["sleep", "36000"]
    Copy to Clipboard Toggle word wrap
  6. 运行以下命令来创建 pod:

    $ oc create -f my-pod-manifest.yaml
    Copy to Clipboard Toggle word wrap

6.10. 自定义 Kata 代理策略

Kata 代理策略是一种安全机制,用于控制使用 Kata 运行时运行的 pod 的代理 API 请求。使用 Rego 编写并由 Pod 虚拟机(VM)中的 Kata 代理强制,此策略决定哪些操作被允许或拒绝。

您可以针对特定用例使用自定义策略来覆盖默认策略,如在安全不是关注的地方进行开发和测试。例如,您可以在 control plane 可以被信任的环境中运行。您可以通过几种方法应用自定义策略:

  • 将其嵌入到 pod 虚拟机镜像中。
  • 修补对等 pod 配置映射。
  • 为工作负载 pod YAML 添加注解。

对于生产环境系统,首选的方法是使用 initdata 覆盖 Kata 代理策略。以下流程使用 io.katacontainers.config.agent.policy 注解将自定义策略应用到单独的 pod。该策略以 Base64 编码的 Rego 格式提供。此方法会在创建 Pod 时覆盖默认策略,而不修改 pod 虚拟机镜像。

注意

自定义策略完全替换了默认策略。要只修改特定的 API,请包含完整的策略并调整相关规则。

流程

  1. 使用自定义策略创建 policy.rego 文件。以下示例显示了所有可配置的 API:

    package agent_policy
    
    default AddARPNeighborsRequest := true
    default AddSwapRequest := true
    default CloseStdinRequest := true
    default CopyFileRequest := true
    default CreateContainerRequest := true
    default CreateSandboxRequest := true
    default DestroySandboxRequest := true
    default ExecProcessRequest := true
    default GetMetricsRequest := true
    default GetOOMEventRequest := true
    default GuestDetailsRequest := true
    default ListInterfacesRequest := true
    default ListRoutesRequest := true
    default MemHotplugByProbeRequest := true
    default OnlineCPUMemRequest := true
    default PauseContainerRequest := true
    default PullImageRequest := true
    default ReadStreamRequest := true
    default RemoveContainerRequest := true
    default RemoveStaleVirtiofsShareMountsRequest := true
    default ReseedRandomDevRequest := true
    default ResumeContainerRequest := true
    default SetGuestDateTimeRequest := true
    default SetPolicyRequest := true
    default SignalProcessRequest := true
    default StartContainerRequest := true
    default StartTracingRequest := true
    default StatsContainerRequest := true
    default StopTracingRequest := true
    default TtyWinResizeRequest := true
    default UpdateContainerRequest := true
    default UpdateEphemeralMountsRequest := true
    default UpdateInterfaceRequest := true
    default UpdateRoutesRequest := true
    default WaitProcessRequest := true
    default WriteStreamRequest := true
    Copy to Clipboard Toggle word wrap

    默认策略允许所有 API 调用。根据您的需要,调整 truefalse 值以进一步自定义策略。

  2. 运行以下命令,将 policy.rego 文件转换为 Base64 编码的字符串:

    $ base64 -w0 policy.rego
    Copy to Clipboard Toggle word wrap

    将输出保存到 yaml 文件中。

  3. 将 Base64 编码的策略添加到 my-pod.yaml pod 规格文件中:

    apiVersion: v1
    kind: Pod
    metadata:
      name: <pod_name>
      annotations:
        io.katacontainers.config.agent.policy: <base64_encoded_policy>
    spec:
      runtimeClassName: kata-remote
      containers:
      - name: <container_name>
        image: registry.access.redhat.com/ubi9/ubi:latest
        command:
        - sleep
        - "36000"
        securityContext:
          privileged: false
          seccompProfile:
            type: RuntimeDefault
    Copy to Clipboard Toggle word wrap
  4. 运行以下命令来应用 pod 清单:

    $ oc apply -f my-pod.yaml
    Copy to Clipboard Toggle word wrap

6.11. 创建 KataConfig 自定义资源

您必须创建 KataConfig 自定义资源(CR)来作为 worker 节点上的运行时类安装 kata-remote

OpenShift 沙盒容器将 kata-remote 安装为集群上的 辅助 可选运行时,而不是主运行时。

创建 KataConfig CR 会自动重启 worker 节点。重启可能需要 10 到 60 分钟。以下因素可以提高重启时间:

  • 带有更多 worker 节点的大型 OpenShift Container Platform 部署。
  • 激活 BIOS 和 Diagnostics 实用程序。
  • 在硬盘而不是 SSD 上部署。
  • 在物理节点上部署,如裸机,而不是在虚拟节点上部署。
  • CPU 和网络较慢。

流程

  1. 根据以下示例创建 example-kataconfig.yaml 清单文件:

    apiVersion: kataconfiguration.openshift.io/v1
    kind: KataConfig
    metadata:
      name: example-kataconfig
    spec:
      enablePeerPods: true
      logLevel: info
    #  kataConfigPoolSelector:
    #    matchLabels:
    #      <label_key>: '<label_value>' 
    1
    Copy to Clipboard Toggle word wrap
    1
    可选:如果您应用了节点标签在特定节点上安装 kata-remote,请指定键和值,例如 osc: 'true'
  2. 运行以下命令来创建 KataConfig CR:

    $ oc apply -f example-kataconfig.yaml
    Copy to Clipboard Toggle word wrap

    新的 KataConfig CR 被创建,并在 worker 节点上作为运行时类安装 kata-remote

    在验证安装前,等待 kata-remote 安装完成,以及 worker 节点重新引导。

  3. 运行以下命令监控安装进度:

    $ watch "oc describe kataconfig | sed -n /^Status:/,/^Events/p"
    Copy to Clipboard Toggle word wrap

    安装 kataNodes 下所有 worker 的状态并且条件 InProgressFalse 时,而不指定原因,则会在集群中安装 kata-remote

  4. 运行以下命令,验证您是否已构建对等 pod 镜像并将其上传到 libvirt 卷中:

    $ oc describe configmap peer-pods-cm -n openshift-sandboxed-containers-operator
    Copy to Clipboard Toggle word wrap

    输出示例

    Name: peer-pods-cm
    Namespace: openshift-sandboxed-containers-operator
    Labels: <none>
    Annotations: <none>
    
    Data
    ====
    CLOUD_PROVIDER: libvirt
    
    BinaryData
    ====
    Events: <none>
    Copy to Clipboard Toggle word wrap

  5. 运行以下命令,监控 kata-oc 机器配置池进度,以确保它处于 UPDATED 状态,当 UPDATED MACHINECOUNT 等于 MACHINECOUNT 时:

    $ watch oc get mcp/kata-oc
    Copy to Clipboard Toggle word wrap
  6. 运行以下命令验证守护进程集:

    $ oc get -n openshift-sandboxed-containers-operator ds/osc-caa-ds
    Copy to Clipboard Toggle word wrap
  7. 运行以下命令验证运行时类:

    $ oc get runtimeclass
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME             HANDLER          AGE
    kata-remote      kata-remote      152m
    Copy to Clipboard Toggle word wrap

6.12. 修改每个节点的对等 pod 虚拟机数量

您可以通过编辑 peerpodConfig 自定义资源(CR)来修改每个节点的对等 pod 虚拟机限制。

流程

  1. 运行以下命令检查当前的限制:

    $ oc get peerpodconfig peerpodconfig-openshift -n openshift-sandboxed-containers-operator \
      -o jsonpath='{.spec.limit}{"\n"}'
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令,为 limit 键指定新值:

    $ oc patch peerpodconfig peerpodconfig-openshift -n openshift-sandboxed-containers-operator \
      --type merge --patch '{"spec":{"limit":"<value>"}}'
    Copy to Clipboard Toggle word wrap

6.13. 为 OpenShift 沙盒容器配置工作负载

您可以通过将 kata-remote 设置为以下 pod 模板对象的运行时类来配置 OpenShift 沙盒容器的工作负载:

  • Pod 对象
  • ReplicaSet 对象
  • ReplicationController 对象
  • StatefulSet 对象
  • Deployment 对象
  • deploymentConfig 对象
重要

不要在 Operator 命名空间中部署工作负载。为这些资源创建一个专用命名空间。

先决条件

  • 您已创建了 KataConfig 自定义资源(CR)。

流程

  1. spec.runtimeClassName: kata-remote 添加到每个 pod 模板工作负载对象的清单中,如下例所示:

    apiVersion: v1
    kind: <object>
    # ...
    spec:
      runtimeClassName: kata-remote
    # ...
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令,将更改应用到工作负载对象:

    $ oc apply -f <object.yaml>
    Copy to Clipboard Toggle word wrap

    OpenShift Container Platform 创建工作负载对象并开始调度它。

验证

  • 检查 pod 模板对象的 spec.runtimeClassName 字段。如果值为 kata-remote,则工作负载在 OpenShift 沙盒容器中运行。

!:IBM-osc:

第 7 章 监控

您可以使用 OpenShift Container Platform Web 控制台监控与沙盒工作负载和节点的健康状态相关的指标。

OpenShift 沙盒容器在 OpenShift Container Platform Web 控制台中有一个预先配置的仪表板。管理员还可以通过 Prometheus 访问和查询原始指标。

7.1. 关于指标

OpenShift 沙盒容器指标让管理员能够监控沙盒容器的运行方式。您可以在 OpenShift Container Platform Web 控制台中的 Metrics UI 中查询这些指标。

OpenShift 沙盒容器指标为以下类别收集:

Kata 代理指标
Kata 代理指标显示有关嵌入在沙盒容器中运行的 kata 代理进程的信息。这些指标包括 /proc/<pid>/[io, stat, status] 中的数据。
Kata 客户机操作系统指标
Kata 客户机操作系统指标显示沙盒容器中运行的客户机操作系统中的数据。这些指标包括 /proc/[stats, diskstats, meminfo, vmstats]/proc/net/dev 中的数据。
hypervisor 指标
hypervisor 指标显示有关运行嵌入在沙盒容器中虚拟机的虚拟机监控程序的数据。这些指标主要包括 /proc/<pid>/[io, stat, status] 中的数据。
Kata 监控指标
Kata 监控器是收集指标数据并提供给 Prometheus 的进程。kata 监控指标显示有关 kata-monitor 进程本身的资源使用情况的详细信息。这些指标还包括 Prometheus 数据收集的计数器。
Kata containerd shim v2 指标
Kata containerd shim v2 指标显示有关 kata shim 进程的详细信息。这些指标包括来自 /proc/<pid>/[io, stat, status] 和详细的资源使用量指标的数据。

7.2. 查看指标

您可以在 OpenShift Container Platform Web 控制台的 Metrics 页面中访问 OpenShift 沙盒容器的指标。

先决条件

  • 您可以使用具有 cluster-admin 角色或所有项目的查看权限的用户访问集群。

流程

  1. 在 OpenShift Container Platform web 控制台中进入到 ObserveMetrics
  2. 在输入字段中,输入您要观察到的指标的查询。

    所有与 kata 相关的指标都以 kata 开头。键入 kata 会显示所有可用 kata 指标的列表。

在页面中会视觉化查询的指标。

第 8 章 卸载 OpenShift 沙盒容器

您可以通过执行以下任务卸载 OpenShift 沙盒容器:

  1. 删除工作负载 pod。
  2. 删除 KataConfig 自定义资源(CR)。
  3. 卸载 OpenShift 沙盒容器 Operator。
  4. 删除 KataConfig 自定义资源定义(CRD)。
重要

在删除 KataConfig CR 前,您必须删除工作负载 pod。如果提供,pod 名称通常具有前缀 podvm 和自定义标签。如果您在云供应商上部署 OpenShift 沙盒容器,且按照这些步骤后仍然保留任何资源,您可能会从云供应商处收到这些资源的意外计费。在云供应商上卸载 OpenShift 沙盒容器后,检查云供应商控制台以确保删除所有资源的步骤。

8.1. 删除工作负载 pod

您可以使用 CLI 删除 OpenShift 沙盒容器工作负载 pod。

先决条件

  • 已安装 JSON 处理器(jq)工具。

流程

  1. 运行以下命令来搜索 pod:

    $ oc get pods -A -o json | jq -r '.items[] | \
      select(.spec.runtimeClassName == "<runtime>").metadata.name'
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令来删除每个 pod:

    $ oc delete pod <pod>
    Copy to Clipboard Toggle word wrap
重要

卸载使用云供应商部署的 OpenShift 沙盒容器时,您必须删除所有 pod。任何剩余的 pod 资源都可能会导致云供应商出现意外几率。

8.2. 删除 KataConfig 自定义资源

您可以使用命令行删除 KataConfig 自定义资源(CR)。

流程

  1. 运行以下命令来删除 KataConfig CR:

    $ oc delete kataconfig example-kataconfig
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令验证 CR 移除:

    $ oc get kataconfig example-kataconfig
    Copy to Clipboard Toggle word wrap

    输出示例

    No example-kataconfig instances exist
    Copy to Clipboard Toggle word wrap

重要

您必须确保所有 pod 都被删除。任何剩余的 pod 资源都可能会导致云供应商出现意外几率。

8.3. 卸载 OpenShift 沙盒容器 Operator

您可以使用命令行卸载 OpenShift 沙盒容器 Operator。

流程

  1. 运行以下命令来删除订阅:

    $ oc delete subscription sandboxed-containers-operator -n openshift-sandboxed-containers-operator
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令来删除命名空间:

    $ oc delete namespace openshift-sandboxed-containers-operator
    Copy to Clipboard Toggle word wrap

8.4. 删除 KataConfig CRD

您可以使用命令行删除 KataConfig 自定义资源定义(CRD)。

先决条件

  • 您已删除 KataConfig 自定义资源。
  • 您已卸载了 OpenShift 沙盒容器 Operator。

流程

  1. 运行以下命令来删除 KataConfig CRD:

    $ oc delete crd kataconfigs.kataconfiguration.openshift.io
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令验证 CRD 已被删除:

    $ oc get crd kataconfigs.kataconfiguration.openshift.io
    Copy to Clipboard Toggle word wrap

    输出示例

    Unknown CRD kataconfigs.kataconfiguration.openshift.io
    Copy to Clipboard Toggle word wrap

第 9 章 升级

OpenShift 沙盒容器组件的升级由以下步骤组成:

  1. 升级 OpenShift Container Platform 以更新 Kata 运行时及其依赖项。
  2. 升级 OpenShift 沙盒容器 Operator 以更新 Operator 订阅。

您可以在 OpenShift 沙盒容器 Operator 升级前或之后升级 OpenShift Container Platform,但有以下例外。在升级 OpenShift 沙盒容器 Operator 后,始终立即应用 KataConfig 补丁。

9.1. 升级资源

Red Hat Enterprise Linux CoreOS (RHCOS)扩展将 OpenShift 沙盒容器资源部署到集群中。

RHCOS 扩展 沙盒容器 包含运行 OpenShift 沙盒容器所需的组件,如 Kata 容器运行时、虚拟机监控程序 QEMU 和其他依赖项。您可以通过将集群升级到 OpenShift Container Platform 的新版本来升级扩展。

有关升级 OpenShift Container Platform 的更多信息,请参阅更新集群

9.2. 升级 Operator

使用 Operator Lifecycle Manager (OLM) 手动或自动升级 OpenShift 沙盒容器 Operator。在初始部署期间,选择手动或自动升级可决定将来的升级模式。对于手动升级,OpenShift Container Platform Web 控制台会显示集群管理员可安装的可用更新。

有关在 Operator Lifecycle Manager (OLM)中升级 OpenShift 沙盒容器 Operator 的更多信息,请参阅更新已安装的 Operator

9.3. 更新 pod 虚拟机镜像

对于对等 pod 部署,您必须更新 pod 虚拟机镜像。当 enablePeerpods:true 时,升级 OpenShift 沙盒容器 Operator 不会自动更新 pod 虚拟机镜像。您还必须删除并重新创建 KataConfig 自定义资源(CR)。

注意

您还可以检查 AWS 和 Azure 部署的对等 pod 配置映射,以确保在重新创建 KataConfig CR 前镜像 ID 为空。

9.3.1. 删除 KataConfig 自定义资源

您可以使用命令行删除 KataConfig 自定义资源(CR)。

流程

  1. 运行以下命令来删除 KataConfig CR:

    $ oc delete kataconfig example-kataconfig
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令验证 CR 移除:

    $ oc get kataconfig example-kataconfig
    Copy to Clipboard Toggle word wrap

    输出示例

    No example-kataconfig instances exist
    Copy to Clipboard Toggle word wrap

重要

您必须确保所有 pod 都被删除。任何剩余的 pod 资源都可能会导致云供应商出现意外几率。

9.3.2. 验证镜像 ID 是否为空

对于 AWS 和 Azure 部署,在删除 KataConfig 自定义资源(CR)后,您必须验证对等 pod 配置映射中的镜像 ID 是否为空。

流程

  1. 运行以下命令来获取对等 pod 配置映射:

    $ oc get configmap -n openshift-sandboxed-containers-operator peer-pods-cm -o jsonpath="{.data.<image_id>}" 
    1
    Copy to Clipboard Toggle word wrap
    1
    对于 AWS,将 & lt;image_id& gt; 替换为 PODVM_AMI_ID。对于 Azure,将 & lt;image_id& gt; 替换为 AZURE_IMAGE_ID
  2. 如果值不为空,请运行以下命令更新值并修补配置映射:

    $ oc patch configmap peer-pods-cm -n openshift-sandboxed-containers-operator -p '{"data":{"<image_id>":""}}'
    Copy to Clipboard Toggle word wrap

9.3.3. 创建 KataConfig 自定义资源

您必须创建 KataConfig 自定义资源(CR)来作为 worker 节点上的运行时类安装 kata-remote

OpenShift 沙盒容器将 kata-remote 安装为集群上的 辅助 可选运行时,而不是主运行时。

创建 KataConfig CR 会自动重启 worker 节点。重启可能需要 10 到 60 分钟。以下因素可以提高重启时间:

  • 带有更多 worker 节点的大型 OpenShift Container Platform 部署。
  • 激活 BIOS 和 Diagnostics 实用程序。
  • 在硬盘而不是 SSD 上部署。
  • 在物理节点上部署,如裸机,而不是在虚拟节点上部署。
  • CPU 和网络较慢。

流程

  1. 根据以下示例创建 example-kataconfig.yaml 清单文件:

    apiVersion: kataconfiguration.openshift.io/v1
    kind: KataConfig
    metadata:
      name: example-kataconfig
    spec:
      enablePeerPods: true
      logLevel: info
    #  kataConfigPoolSelector:
    #    matchLabels:
    #      <label_key>: '<label_value>' 
    1
    Copy to Clipboard Toggle word wrap
    1
    可选:如果您应用了节点标签在特定节点上安装 kata-remote,请指定键和值,例如 osc: 'true'
  2. 运行以下命令来创建 KataConfig CR:

    $ oc apply -f example-kataconfig.yaml
    Copy to Clipboard Toggle word wrap

    新的 KataConfig CR 被创建,并在 worker 节点上作为运行时类安装 kata-remote

    在验证安装前,等待 kata-remote 安装完成,以及 worker 节点重新引导。

  3. 运行以下命令监控安装进度:

    $ watch "oc describe kataconfig | sed -n /^Status:/,/^Events/p"
    Copy to Clipboard Toggle word wrap

    安装 kataNodes 下所有 worker 的状态并且条件 InProgressFalse 时,而不指定原因,则会在集群中安装 kata-remote

  4. 运行以下命令,验证您是否已构建对等 pod 镜像并将其上传到 libvirt 卷中:

    $ oc describe configmap peer-pods-cm -n openshift-sandboxed-containers-operator
    Copy to Clipboard Toggle word wrap

    输出示例

    Name: peer-pods-cm
    Namespace: openshift-sandboxed-containers-operator
    Labels: <none>
    Annotations: <none>
    
    Data
    ====
    CLOUD_PROVIDER: libvirt
    
    BinaryData
    ====
    Events: <none>
    Copy to Clipboard Toggle word wrap

  5. 运行以下命令,监控 kata-oc 机器配置池进度,以确保它处于 UPDATED 状态,当 UPDATED MACHINECOUNT 等于 MACHINECOUNT 时:

    $ watch oc get mcp/kata-oc
    Copy to Clipboard Toggle word wrap
  6. 运行以下命令验证守护进程集:

    $ oc get -n openshift-sandboxed-containers-operator ds/osc-caa-ds
    Copy to Clipboard Toggle word wrap
  7. 运行以下命令验证运行时类:

    $ oc get runtimeclass
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME             HANDLER          AGE
    kata-remote      kata-remote      152m
    Copy to Clipboard Toggle word wrap

第 10 章 故障排除

当对 OpenShift 沙盒容器进行故障排除时,您可以创建一个支持问题单,并使用 must-gather 工具提供调试信息。

如果您是集群管理员,您还可以自行查看日志,启用更详细的日志级别。

10.1. 为红帽支持收集数据

在提交问题单时同时提供您的集群信息,可以帮助红帽支持为您进行排除故障。

您可使用 must-gather 工具来收集有关 OpenShift Container Platform 集群的诊断信息,包括虚拟机和有关 OpenShift 沙盒容器的其他数据。

为了获得快速支持,请提供 OpenShift Container Platform 和 OpenShift 沙盒容器的诊断信息。

使用 must-gather 工具

oc adm must-gather CLI 命令可收集最有助于解决问题的集群信息,包括:

  • 资源定义
  • 服务日志

默认情况下,oc adm must-gather 命令使用默认的插件镜像,并写入 ./must-gather.local

另外,您可以使用适当的参数运行命令来收集具体信息,如以下部分所述:

  • 要收集与一个或多个特定功能相关的数据,请使用 --image 参数和镜像,如以下部分所述。

    例如:

    $ oc adm must-gather --image=registry.redhat.io/openshift-sandboxed-containers/osc-must-gather-rhel9:1.10.1
    Copy to Clipboard Toggle word wrap
  • 要收集审计日志,请使用 -- /usr/bin/gather_audit_logs 参数,如以下部分所述。

    例如:

    $ oc adm must-gather -- /usr/bin/gather_audit_logs
    Copy to Clipboard Toggle word wrap
    注意

    作为默认信息集合的一部分,不会收集审计日志来减小文件的大小。

当您运行 oc adm must-gather 时,集群的新项目中会创建一个带有随机名称的新 pod。在该 pod 上收集数据,并保存至以 must-gather.local 开头的一个新目录中。此目录在当前工作目录中创建。

例如:

NAMESPACE                      NAME                 READY   STATUS      RESTARTS      AGE
...
openshift-must-gather-5drcj    must-gather-bklx4    2/2     Running     0             72s
openshift-must-gather-5drcj    must-gather-s8sdh    2/2     Running     0             72s
...
Copy to Clipboard Toggle word wrap

另外,您可以使用 --run-namespace 选项在特定命名空间中运行 oc adm must-gather 命令。

例如:

$ oc adm must-gather --run-namespace <namespace> --image=registry.redhat.io/openshift-sandboxed-containers/osc-must-gather-rhel9:1.10.1
Copy to Clipboard Toggle word wrap

10.2. 收集日志数据

以下功能和对象与 OpenShift 沙盒容器关联:

  • 属于 OpenShift 沙盒容器资源的所有命名空间及其子对象
  • 所有 OpenShift 沙盒容器自定义资源定义 (CRD)

您可以为使用 kata 运行时运行的每个 pod 收集以下组件日志:

  • Kata 代理日志
  • Kata 运行时日志
  • QEMU 日志
  • 审计日志
  • CRI-O 日志

10.2.1. 为 CRI-O 运行时启用调试日志

您可以通过更新 KataConfig CR 中的 logLevel 字段来启用调试日志。这会更改运行 OpenShift 沙盒容器的 worker 节点的 CRI-O 运行时中的日志级别。

先决条件

  • 已安装 OpenShift CLI(oc)。
  • 您可以使用具有 cluster-admin 角色的用户访问集群。

流程

  1. 将现有 KataConfig CR 中的 logLevel 字段更改为 debug

    $ oc patch kataconfig <kataconfig> --type merge --patch '{"spec":{"logLevel":"debug"}}'
    Copy to Clipboard Toggle word wrap
  2. 监控 kata-oc 机器配置池,直到 UPDATED 的值为 True,表示所有 worker 节点都已更新:

    $ oc get mcp kata-oc
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME     CONFIG                 UPDATED  UPDATING  DEGRADED  MACHINECOUNT  READYMACHINECOUNT  UPDATEDMACHINECOUNT  DEGRADEDMACHINECOUNT  AGE
    kata-oc  rendered-kata-oc-169   False    True      False     3             1                  1                    0                     9h
    Copy to Clipboard Toggle word wrap

验证

  1. 使用机器配置池中的节点启动 debug 会话:

    $ oc debug node/<node_name>
    Copy to Clipboard Toggle word wrap
  2. 将根目录改为 /host

    # chroot /host
    Copy to Clipboard Toggle word wrap
  3. 验证 crio.conf 文件中的更改:

    # crio config | egrep 'log_level
    Copy to Clipboard Toggle word wrap

    输出示例

    log_level = "debug"
    Copy to Clipboard Toggle word wrap

10.2.2. 查看组件的调试日志

集群管理员可以使用调试日志进行故障排除。每个节点的日志会输出到节点日志中。

您可以查看以下 OpenShift 沙盒容器组件的日志:

  • Kata 代理
  • Kata runtime (containerd-shim-kata-v2)
  • virtiofsd

QEMU 仅生成警告和错误日志。这些警告和错误会在 Kata 运行时日志和带有额外的 qemuPid 字段的 CRI-O 日志中打印到节点日志。

QEMU 日志示例

Mar 11 11:57:28 openshift-worker-0 kata[2241647]: time="2023-03-11T11:57:28.587116986Z" level=info msg="Start logging QEMU (qemuPid=2241693)" name=containerd-shim-v2 pid=2241647 sandbox=d1d4d68efc35e5ccb4331af73da459c13f46269b512774aa6bde7da34db48987 source=virtcontainers/hypervisor subsystem=qemu

Mar 11 11:57:28 openshift-worker-0 kata[2241647]: time="2023-03-11T11:57:28.607339014Z" level=error msg="qemu-kvm: -machine q35,accel=kvm,kernel_irqchip=split,foo: Expected '=' after parameter 'foo'" name=containerd-shim-v2 pid=2241647 qemuPid=2241693 sandbox=d1d4d68efc35e5ccb4331af73da459c13f46269b512774aa6bde7da34db48987 source=virtcontainers/hypervisor subsystem=qemu

Mar 11 11:57:28 openshift-worker-0 kata[2241647]: time="2023-03-11T11:57:28.60890737Z" level=info msg="Stop logging QEMU (qemuPid=2241693)" name=containerd-shim-v2 pid=2241647 sandbox=d1d4d68efc35e5ccb4331af73da459c13f46269b512774aa6bde7da34db48987 source=virtcontainers/hypervisor subsystem=qemu
Copy to Clipboard Toggle word wrap

当 QEMU 启动时,Kata 运行时会在 QEMU 启动时打印 Start logging QEMU,并在 QEMU 停止时停止日志记录 QEMU。使用 qemuPid 字段的两个日志消息之间会出现这个错误。QEMU 的实际错误消息以红色显示。

QEMU 客户机的控制台也会输出到节点日志中。您可以查看客户机控制台日志以及 Kata 代理日志。

先决条件

  • 已安装 OpenShift CLI(oc)。
  • 您可以使用具有 cluster-admin 角色的用户访问集群。

流程

  • 要查看 Kata 代理日志和客户机控制台日志,请运行以下命令:

    $ oc debug node/<nodename> -- journalctl -D /host/var/log/journal -t kata -g “reading guest console”
    Copy to Clipboard Toggle word wrap
  • 要查看 Kata 运行时日志,请运行以下命令:

    $ oc debug node/<nodename> -- journalctl -D /host/var/log/journal -t kata
    Copy to Clipboard Toggle word wrap
  • 要查看 virtiofsd 日志,请运行以下命令:

    $ oc debug node/<nodename> -- journalctl -D /host/var/log/journal -t virtiofsd
    Copy to Clipboard Toggle word wrap
  • 要查看 QEMU 日志,请运行以下命令:

    $ oc debug node/<nodename> -- journalctl -D /host/var/log/journal -t kata -g "qemuPid=\d+"
    Copy to Clipboard Toggle word wrap

附录 A. KataConfig 状态信息

下表显示了具有两个 worker 节点的集群的 KataConfig 自定义资源(CR)的状态消息。

Expand
表 A.1. KataConfig 状态信息
Status描述

初始安装

当创建 KataConfig CR 并在两个 worker 上启动 kata-remote 时,会在几秒钟内显示以下状态:

 conditions:
    message: Performing initial installation of kata-remote on cluster
    reason: Installing
    status: 'True'
    type: InProgress
 kataNodes:
   nodeCount: 0
   readyNodeCount: 0
Copy to Clipboard Toggle word wrap

安装

在几秒钟内,状态会改变。

 kataNodes:
   nodeCount: 2
   readyNodeCount: 0
   waitingToInstall:
   - worker-0
   - worker-1
Copy to Clipboard Toggle word wrap

安装 (Worker-1 安装开始)

在短时间内,状态会改变,表示一个节点启动了 kata-remote 安装,另一个则处于等待状态。这是因为在任何给定时间只能有一个节点不可用。nodeCount 保留为 2,因为两个节点最终都会接收 kata-remote,但 readyNodeCount 目前都为 0,因为它们还没有达到该状态。

 kataNodes:
   installing:
   - worker-1
   nodeCount: 2
   readyNodeCount: 0
   waitingToInstall:
   - worker-0
Copy to Clipboard Toggle word wrap

安装 (安装了Worker-1,worker-0 安装已启动)

一段时间后,worker-1 将完成安装,从而导致状态的变化。readyNodeCount 更新至 1,这表示 worker-1 现在已准备好执行 kata-remote 工作负载。在安装过程结束时创建运行时类之前,您无法调度或运行 kata-remote 工作负载。

 kataNodes:
   installed:
   - worker-1
   installing:
   - worker-0
   nodeCount: 2
   readyNodeCount: 1
Copy to Clipboard Toggle word wrap

已安装

安装后,两个 worker 都被列出为 installed,InProgress 条件过渡到 False,而不指定原因,表示集群中成功安装 kata-remote

 conditions:
    message: ""
    reason: ""
    status: 'False'
    type: InProgress
 kataNodes:
   installed:
   - worker-0
   - worker-1
   nodeCount: 2
   readyNodeCount: 2
Copy to Clipboard Toggle word wrap
Expand
Status描述

初始卸载

如果在 worker 上同时安装了 kata-remote,并且您删除 KataConfig 从集群中删除 kata-remote,则两个 worker 都简要进入等待状态。

 conditions:
    message: Removing kata-remote from cluster
    reason: Uninstalling
    status: 'True'
    type: InProgress
 kataNodes:
   nodeCount: 0
   readyNodeCount: 0
   waitingToUninstall:
   - worker-0
   - worker-1
Copy to Clipboard Toggle word wrap

卸装

几秒钟后,其中一个 worker 开始卸载。

 kataNodes:
   nodeCount: 0
   readyNodeCount: 0
   uninstalling:
   - worker-1
   waitingToUninstall:
   - worker-0
Copy to Clipboard Toggle word wrap

卸装

worker-1 完成,worker-0 开始卸载。

 kataNodes:
   nodeCount: 0
   readyNodeCount: 0
   uninstalling:
   - worker-0
Copy to Clipboard Toggle word wrap
注意

reason 字段也可以报告以下原因:

  • 失败 :如果节点无法完成转换,则报告此报告。状态报告 True消息Node <node_name> Degraded: <error_message_from_the_node>
  • BlockedByExistingKataPods :如果在卸载 kata-remote 的群集上运行有 pod,则报告使用 kata-remote 运行时。status 字段为 False消息Existing pod,使用 "kata-remote" RuntimeClass found。Please delete the pods for KataConfig delete to proceed。如果与集群 control plane 的通信失败,则报告的技术错误消息,如 Failed to list kata pod: <error_message >。

法律通告

Copyright © 2025 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat