4.2. 使用命令行部署工作负载


您可以使用命令行部署 OpenShift 沙盒容器工作负载。

4.2.1. 配置 libvirt 卷

您必须在 KVM 主机上配置 libvirt 卷。对等 pod 使用 Cloud API Adaptor 的 libvirt 提供程序来创建和管理虚拟机。

先决条件

  • 已使用 OpenShift Container Platform Web 控制台或命令行在 OpenShift Container Platform 集群上安装 OpenShift 沙盒容器 Operator。
  • 您有 KVM 主机的管理员特权。
  • 您已在 KVM 主机上安装了 podman
  • 您已在 KVM 主机上安装了 virt-customize

流程

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

    $ export LIBVIRT_POOL=<libvirt_pool>

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

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

    $ export LIBVIRT_VOL_NAME=<libvirt_volume>

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

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

    $ export LIBVIRT_POOL_DIRECTORY=<target_directory> 1
    1
    为确保 libvirt 具有读写访问权限,请使用 libvirt 存储目录的子目录。默认为 /var/lib/libvirt/images/
  5. 运行以下命令来创建 libvirt 池:

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

    $ virsh pool-start $LIBVIRT_POOL
  7. 运行以下命令,为池创建 libvirt 卷:

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

4.2.2. 创建 KVM 客户机镜像

您必须创建一个 KVM 客户机镜像,并将其上传到 libvirt 卷。

先决条件

  • IBM z15 或更高版本,或 IBM® LinuxONE114 或更高版本。
  • 至少在使用 KVM 的 RHEL 9 或更高版本中运行一个 LPAR。

流程

  1. 登录您的 OpenShift Container Platform 集群。
  2. 如果您有 RHEL 订阅,请为 Red Hat Subscription Management 设置订阅环境变量:

    • 运行以下命令来设置机构 ID:

      $ export ORG_ID=$(cat ~/.rh_subscription/orgid)
    • 运行以下命令来设置激活码:

      $ export ACTIVATION_KEY=$(cat ~/.rh_subscription/activation_key)
  3. 如果您没有 RHEL 订阅,请为 RHEL 设置订阅值:

    • 运行以下命令来设置机构 ID:

      $ export ORG_ID=<RHEL_ORGID_VALUE> 1
      1
      指定您的 RHEL 机构 ID。
    • 运行以下命令来设置激活码:

      $ export ACTIVATION_KEY=<RHEL_ACTIVATION_KEY> 1
      1
      指定 RHEL 激活码。
  4. 登录到您的 IBM Z® 系统。
  5. s390x RHEL KVM 客户机镜像 从红帽客户门户网站下载 到 libvirt 存储目录,以授予 libvirt 正确访问权限。

    默认目录为 /var/lib/libvirt/images。此镜像用于生成对等 pod 虚拟机镜像,其中包含相关的二进制文件。

  6. 运行以下命令,为下载的镜像设置 IMAGE_URL

    $ export IMAGE_URL=<path/to/image> 1
    1
    指定 KVM 客户机镜像的路径。
  7. 运行以下命令来注册客户端 KVM 镜像:

    $ export REGISTER_CMD="subscription-manager register --org=${ORG_ID} \
      --activationkey=${ACTIVATION_KEY}"
  8. 运行以下命令来自定义客户机 KVM 镜像:

    $ virt-customize -v -x -a ${IMAGE_URL} --run-command "${REGISTER_CMD}"
  9. 运行以下命令设置镜像的校验和:

    $ export IMAGE_CHECKSUM=$(sha256sum ${IMAGE_URL} | awk '{ print $1 }')

4.2.3. 构建对等 pod 虚拟机镜像

您必须构建对等 pod 虚拟机(VM)镜像,并将其上传到 libvirt 卷。

流程

  1. 登录您的 OpenShift Container Platform 集群。
  2. 运行以下命令克隆 cloud-api-adaptor 存储库:

    $ git clone --single-branch https://github.com/confidential-containers/cloud-api-adaptor.git
  3. 运行以下命令,进入 podvm 目录:

    $ cd cloud-api-adaptor && git checkout 8577093
  4. 创建生成最终 QCOW2 镜像的构建器镜像。

    • 如果您有一个订阅的 RHEL 系统,请运行以下命令:

      $ podman build -t podvm_builder_rhel_s390x \
        --build-arg ARCH="s390x" \
        --build-arg GO_VERSION="1.21.3" \
        --build-arg PROTOC_VERSION="25.1" \
        --build-arg PACKER_VERSION="v1.9.4" \
        --build-arg RUST_VERSION="1.72.0" \
        --build-arg YQ_VERSION="v4.35.1" \
        --build-arg YQ_CHECKSUM="sha256:4e6324d08630e7df733894a11830412a43703682d65a76f1fc925aac08268a45" \
        -f podvm/Dockerfile.podvm_builder.rhel .
    • 如果您有未订阅的 RHEL 系统,请运行以下命令:

      $ podman build -t podvm_builder_rhel_s390x \
        --build-arg ORG_ID=$ORG_ID \
        --build-arg ACTIVATION_KEY=$ACTIVATION_KEY \
        --build-arg ARCH="s390x" \
        --build-arg GO_VERSION="1.21.3" \
        --build-arg PROTOC_VERSION="25.1" \
        --build-arg PACKER_VERSION="v1.9.4" \
        --build-arg RUST_VERSION="1.72.0" \
        --build-arg YQ_VERSION="v4.35.1" \
        --build-arg YQ_CHECKSUM="sha256:4e6324d08630e7df733894a11830412a43703682d65a76f1fc925aac08268a45" \
        -f podvm/Dockerfile.podvm_builder.rhel .
  5. 运行以下命令,使用运行对等 pod 所需的二进制文件生成中间镜像软件包:

    $ podman build -t podvm_binaries_rhel_s390x \
      --build-arg BUILDER_IMG="podvm_builder_rhel_s390x:latest" \
      --build-arg ARCH=s390x \
      -f podvm/Dockerfile.podvm_binaries.rhel .

    这个过程需要大量时间。

  6. 运行以下命令,提取二进制文件并构建对等 pod QCOW2 镜像:

    $ podman build -t podvm_rhel_s390x \
      --build-arg ARCH=s390x \
      --build-arg CLOUD_PROVIDER=libvirt \
      --build-arg BUILDER_IMG="localhost/podvm_builder_rhel_s390x:latest" \
      --build-arg BINARIES_IMG="localhost/podvm_binaries_rhel_s390x:latest" \
      -v ${IMAGE_URL}:/tmp/rhel.qcow2:Z \
      --build-arg IMAGE_URL="/tmp/rhel.qcow2" \
      --build-arg IMAGE_CHECKSUM=${IMAGE_CHECKSUM} \
      -f podvm/Dockerfile.podvm.rhel .
  7. 运行以下命令来创建镜像目录环境变量:

    $ export IMAGE_OUTPUT_DIR=<image_output_directory> 1
    1
    指定镜像的目录。
  8. 运行以下命令来创建镜像目录:

    $ mkdir -p $IMAGE_OUTPUT_DIR
  9. 运行以下命令保存提取的对等 pod QCOW2 镜像:

    $ podman save podvm_rhel_s390x | tar -xO --no-wildcards-match-slash '*.tar' | tar -x -C ${IMAGE_OUTPUT_DIR}
  10. 将对等 pod QCOW2 镜像上传到 libvirt 卷:

    $ virsh -c qemu:///system vol-upload \
      --vol $LIBVIRT_VOL_NAME \
      $IMAGE_OUTPUT_DIR/podvm-*.qcow2 \
      --pool $LIBVIRT_POOL --sparse

4.2.4. 创建 secret

您必须在 OpenShift Container Platform 集群中创建 Secret 对象。

先决条件

  • LIBVIRT_POOL.使用您在 KVM 主机上配置 libvirt 时设置的值。
  • LIBVIRT_VOL_NAME.使用您在 KVM 主机上配置 libvirt 时设置的值。
  • 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}')

流程

  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
      LIBVIRT_POOL: "<libvirt_pool>" 2
      LIBVIRT_VOL_NAME: "<libvirt_volume>" 3
    1
    指定 libvirt URI。
    2
    指定 libvirt 池。
    3
    指定 libvirt 卷名称。
  2. 通过应用清单来创建 secret 对象:

    $ oc apply -f peer-pods-secret.yaml
注意

如果更新 peer pod secret,您必须重启 peerpodconfig-ctrl-caa-daemon DaemonSet 来应用更改。

更新 secret 后,应用清单。然后运行以下命令来重启 cloud-api-adaptor pod:

$ oc set env ds/peerpodconfig-ctrl-caa-daemon -n openshift-sandboxed-containers-operator REBOOT="$(date)"

重启守护进程集会重新创建对等 pod。它不会更新现有的 pod。

4.2.5. 创建配置映射

您必须在 OpenShift Container Platform 集群上为 libvirt 供应商创建配置映射。

流程

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

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: peer-pods-cm
      namespace: openshift-sandboxed-containers-operator
    data:
      CLOUD_PROVIDER: "libvirt"
      PROXY_TIMEOUT: "15m"
  2. 应用清单以创建配置映射:

    $ oc apply -f peer-pods-cm.yaml

    为您的 libvirt 供应商创建一个配置映射。

注意

如果更新 peer pod 配置映射,您必须重启 peerpodconfig-ctrl-caa-daemon daemonset 以应用更改。

更新配置映射后,应用清单。然后运行以下命令来重启 cloud-api-adaptor pod:

$ oc set env ds/peerpodconfig-ctrl-caa-daemon -n openshift-sandboxed-containers-operator REBOOT="$(date)"

重启 daemonset 会重新创建对等 pod。它不会更新现有的 pod。

4.2.6. 创建 SSH 密钥 secret

您必须为 KVM 主机创建 SSH 密钥 secret 对象。

流程

  1. 登录您的 OpenShift Container Platform 集群。
  2. 运行以下命令来生成 SSH 密钥对:

    $ ssh-keygen -f ./id_rsa -N ""
  3. 将公共 SSH 密钥复制到 KVM 主机:

    $ ssh-copy-id -i ./id_rsa.pub <KVM_HOST_IP>
  4. 运行以下命令来创建 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

    SSH 密钥 secret 已创建。

  5. 删除您创建的 SSH 密钥:

    $ shred -remove id_rsa.pub id_rsa

4.2.7. 创建 KataConfig 自定义资源

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

创建 KataConfig CR 会触发 OpenShift 沙盒容器 Operator 来执行以下操作:

  • 使用默认配置创建一个名为 kata-remoteRuntimeClass CR。这可让用户在 RuntimeClassName 字段中引用 CR 将工作负载配置为使用 kata-remote 作为运行时。此 CR 也指定运行时的资源开销。

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

重要

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

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

先决条件

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

流程

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

    apiVersion: kataconfiguration.openshift.io/v1
    kind: KataConfig
    metadata:
      name: cluster-kataconfig
    spec:
      enablePeerPods: true
      logLevel: info
  2. 可选: 要在所选节点上安装 kata-remote,请根据以下示例指定节点标签:

    apiVersion: kataconfiguration.openshift.io/v1
    kind: KataConfig
    metadata:
      name: cluster-kataconfig
    spec:
      kataConfigPoolSelector:
        matchLabels:
          <label_key>: '<label_value>' 1
    # ...
    1
    指定所选节点的标签。
  3. 创建 KataConfig CR:

    $ oc create -f cluster-kataconfig.yaml

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

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

验证

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

    $ watch "oc describe kataconfig | sed -n /^Status:/,/^Events/p"

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

详情请参阅 KataConfig 状态信息

4.2.8. 可选:修改每个节点的对等 pod 虚拟机数量

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

流程

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

    $ oc get peerpodconfig peerpodconfig-openshift -n openshift-sandboxed-containers-operator \
    -o jsonpath='{.spec.limit}{"\n"}'
  2. 运行以下命令修改 peerpodConfig CR 的 limit 属性:

    $ oc patch peerpodconfig peerpodconfig-openshift -n openshift-sandboxed-containers-operator \
    --type merge --patch '{"spec":{"limit":"<value>"}}' 1
    1
    将 <value> 替换为您要定义的限制。

4.2.9. 配置工作负载对象

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

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

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

先决条件

  • 您已为供应商创建了 secret 对象。
  • 您已为供应商创建了配置映射。
  • 您已创建了 KataConfig 自定义资源 (CR)。

流程

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

    apiVersion: v1
    kind: <object>
    # ...
    spec:
      runtimeClassName: kata-remote
    # ...

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

验证

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

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.