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
。
流程
- 登录到 KVM 主机。
运行以下命令设置 libvirt 池的名称:
$ export LIBVIRT_POOL=<libvirt_pool>
您需要
LIBVIRT_POOL
值来为 libvirt 提供程序创建 secret。运行以下命令设置 libvirt 池的名称:
$ export LIBVIRT_VOL_NAME=<libvirt_volume>
您需要
LIBVIRT_VOL_NAME
值来为 libvirt 提供程序创建 secret。运行以下命令,设置默认存储池位置的路径:
$ export LIBVIRT_POOL_DIRECTORY=<target_directory> 1
- 1
- 为确保 libvirt 具有读写访问权限,请使用 libvirt 存储目录的子目录。默认为
/var/lib/libvirt/images/
。
运行以下命令来创建 libvirt 池:
$ virsh pool-define-as $LIBVIRT_POOL --type dir --target "$LIBVIRT_POOL_DIRECTORY"
运行以下命令来启动 libvirt 池:
$ virsh pool-start $LIBVIRT_POOL
运行以下命令,为池创建 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。
流程
- 登录您的 OpenShift Container Platform 集群。
如果您有 RHEL 订阅,请为 Red Hat Subscription Management 设置订阅环境变量:
运行以下命令来设置机构 ID:
$ export ORG_ID=$(cat ~/.rh_subscription/orgid)
运行以下命令来设置激活码:
$ export ACTIVATION_KEY=$(cat ~/.rh_subscription/activation_key)
如果您没有 RHEL 订阅,请为 RHEL 设置订阅值:
- 登录到您的 IBM Z® 系统。
将
s390x
RHEL KVM 客户机镜像 从红帽客户门户网站下载 到 libvirt 存储目录,以授予 libvirt 正确访问权限。默认目录为
/var/lib/libvirt/images
。此镜像用于生成对等 pod 虚拟机镜像,其中包含相关的二进制文件。运行以下命令,为下载的镜像设置
IMAGE_URL
:$ export IMAGE_URL=<path/to/image> 1
- 1
- 指定 KVM 客户机镜像的路径。
运行以下命令来注册客户端 KVM 镜像:
$ export REGISTER_CMD="subscription-manager register --org=${ORG_ID} \ --activationkey=${ACTIVATION_KEY}"
运行以下命令来自定义客户机 KVM 镜像:
$ virt-customize -v -x -a ${IMAGE_URL} --run-command "${REGISTER_CMD}"
运行以下命令设置镜像的校验和:
$ export IMAGE_CHECKSUM=$(sha256sum ${IMAGE_URL} | awk '{ print $1 }')
4.2.3. 构建对等 pod 虚拟机镜像
您必须构建对等 pod 虚拟机(VM)镜像,并将其上传到 libvirt 卷。
流程
- 登录您的 OpenShift Container Platform 集群。
运行以下命令克隆 cloud-api-adaptor 存储库:
$ git clone --single-branch https://github.com/confidential-containers/cloud-api-adaptor.git
运行以下命令,进入
podvm
目录:$ cd cloud-api-adaptor && git checkout 8577093
创建生成最终 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 .
运行以下命令,使用运行对等 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 .
这个过程需要大量时间。
运行以下命令,提取二进制文件并构建对等 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 .
运行以下命令来创建镜像目录环境变量:
$ export IMAGE_OUTPUT_DIR=<image_output_directory> 1
- 1
- 指定镜像的目录。
运行以下命令来创建镜像目录:
$ mkdir -p $IMAGE_OUTPUT_DIR
运行以下命令保存提取的对等 pod QCOW2 镜像:
$ podman save podvm_rhel_s390x | tar -xO --no-wildcards-match-slash '*.tar' | tar -x -C ${IMAGE_OUTPUT_DIR}
将对等 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}')
流程
根据以下示例创建
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
通过应用清单来创建
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 供应商创建配置映射。
流程
根据以下示例创建
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"
应用清单以创建配置映射:
$ 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
对象。
流程
- 登录您的 OpenShift Container Platform 集群。
运行以下命令来生成 SSH 密钥对:
$ ssh-keygen -f ./id_rsa -N ""
将公共 SSH 密钥复制到 KVM 主机:
$ ssh-copy-id -i ./id_rsa.pub <KVM_HOST_IP>
运行以下命令来创建
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 已创建。
删除您创建的 SSH 密钥:
$ shred -remove id_rsa.pub id_rsa
4.2.7. 创建 KataConfig 自定义资源
您必须创建一个 KataConfig
自定义资源(CR)来作为 worker 节点上的运行时类安装 kata-remote
。
创建 KataConfig
CR 会触发 OpenShift 沙盒容器 Operator 来执行以下操作:
-
使用默认配置创建一个名为
kata-remote
的RuntimeClass
CR。这可让用户在RuntimeClassName
字段中引用 CR 将工作负载配置为使用kata-remote
作为运行时。此 CR 也指定运行时的资源开销。
OpenShift 沙盒容器将 kata-remote
安装为集群上的 辅助 可选运行时,而不是主运行时。
创建 KataConfig
CR 会自动重启 worker 节点。重启可能需要 10 到 60 分钟。妨碍重启时间的因素如下:
- 带有更多 worker 节点的大型 OpenShift Container Platform 部署。
- 激活 BIOS 和 Diagnostics 实用程序。
- 在硬盘而不是 SSD 上部署。
- 在物理节点上部署,如裸机,而不是在虚拟节点上部署。
- CPU 和网络较慢。
先决条件
-
您可以使用具有
cluster-admin
角色的用户访问集群。
流程
根据以下示例创建
cluster-kataconfig.yaml
清单文件:apiVersion: kataconfiguration.openshift.io/v1 kind: KataConfig metadata: name: cluster-kataconfig spec: enablePeerPods: true logLevel: info
可选: 要在所选节点上安装
kata-remote
,请根据以下示例指定节点标签:apiVersion: kataconfiguration.openshift.io/v1 kind: KataConfig metadata: name: cluster-kataconfig spec: kataConfigPoolSelector: matchLabels: <label_key>: '<label_value>' 1 # ...
- 1
- 指定所选节点的标签。
创建
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 的状态并且条件InProgress
为False
时,而不指定原因,则会在集群中安装kata-remote
。
详情请参阅 KataConfig 状态信息。
4.2.8. 可选:修改每个节点的对等 pod 虚拟机数量
您可以通过编辑 peerpodConfig
自定义资源(CR)来更改每个节点对等 pod 虚拟机(VM)的限制。
流程
运行以下命令检查当前的限制:
$ oc get peerpodconfig peerpodconfig-openshift -n openshift-sandboxed-containers-operator \ -o jsonpath='{.spec.limit}{"\n"}'
运行以下命令修改
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)。
流程
将
spec.runtimeClassName: kata-remote
添加到每个 pod 模板工作负载对象的清单中,如下例所示:apiVersion: v1 kind: <object> # ... spec: runtimeClassName: kata-remote # ...
OpenShift Container Platform 创建工作负载对象并开始调度它。
验证
-
检查 pod 模板对象的
spec.runtimeClassName
字段。如果值为kata-remote
,则工作负载在 OpenShift 沙盒容器上运行,使用对等 pod。