6.2. 在 IBM Z 和 IBM LinuxONE 上部署 OpenShift 沙盒容器
您可以使用命令行界面(CLI)在 IBM Z® 和 IBM® LinuxONE 上部署 OpenShift 沙盒容器来执行以下任务:
- 安装 OpenShift 沙盒容器 Operator。
- 可选:配置 libvirt 卷。
- 可选:创建自定义对等 pod 虚拟机镜像。
- 创建对等 pod secret。
- 创建对等 pod 配置映射。
- 创建 pod 虚拟机镜像配置映射。
- 创建 KVM 主机 secret。
- 可选: 选择自定义对等 pod 虚拟机镜像。
- 可选:自定义 Kata 代理策略。
-
创建
KataConfig自定义资源。 - 可选:修改每个 worker 节点上运行的虚拟机数量。
- 配置 OpenShift 沙盒容器工作负载对象。
6.2.1. 安装 OpenShift 沙盒容器 Operator 复制链接链接已复制到粘贴板!
您可以使用 CLI 安装 OpenShift 沙盒容器 Operator。
先决条件
-
已安装 OpenShift CLI(
oc)。 -
您可以使用具有
cluster-admin角色的用户访问集群。
流程
创建
osc-namespace.yaml清单文件:apiVersion: v1 kind: Namespace metadata: name: openshift-sandboxed-containers-operator运行以下命令创建命名空间:
$ oc apply -f osc-namespace.yaml创建
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运行以下命令来创建 operator 组:
$ oc apply -f osc-operatorgroup.yaml创建
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.9.0运行以下命令来创建订阅:
$ oc apply -f osc-subscription.yaml运行以下命令验证 Operator 是否已正确安装:
$ oc get csv -n openshift-sandboxed-containers-operator此命令可能需要几分钟来完成。
运行以下命令监控进程:
$ watch oc get csv -n openshift-sandboxed-containers-operator输出示例
NAME DISPLAY VERSION REPLACES PHASE openshift-sandboxed-containers openshift-sandboxed-containers-operator 1.9.0 1.8.1 Succeeded
6.2.2. 配置 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/目录。
流程
- 登录到 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="/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
6.2.3. 创建自定义对等 pod 虚拟机镜像 复制链接链接已复制到粘贴板!
您可以创建自定义对等 pod 虚拟机(VM)镜像,而不是使用默认的 Operator 构建镜像。
您可以使用对等 pod QCOW2 镜像构建开放容器项目(OCI)容器。之后,您将容器 registry URL 和镜像路径添加到对等 pod 虚拟机镜像配置映射。
流程
创建
Dockerfile.podvm-oci文件:FROM scratch ARG PODVM_IMAGE_SRC ENV PODVM_IMAGE_PATH="/image/podvm.qcow2" COPY $PODVM_IMAGE_SRC $PODVM_IMAGE_PATH运行以下命令,使用 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 .
6.2.4. 更新对等 pod secret 复制链接链接已复制到粘贴板!
您必须更新对等 pod secret。
secret 存储用于创建 pod 虚拟机(VM)镜像和对等 pod 实例的凭证。
默认情况下,OpenShift 沙盒容器 Operator 根据用于创建集群的凭证创建 secret。但是,您可以手动创建使用不同的凭证的 secret。
先决条件
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"-
红帽_OFFLINE_TOKEN.您已生成此令牌,以通过 Red Hat API Tokens 下载 RHEL 镜像。
流程
根据以下示例创建
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 运行以下命令来创建 secret:
$ oc apply -f peer-pods-secret.yaml
6.2.5. 创建对等 pod 配置映射 复制链接链接已复制到粘贴板!
您必须为 OpenShift 沙盒容器创建对等 pod 配置映射。
流程
根据以下示例创建
peer-pods-cm.yaml清单文件:apiVersion: v1 kind: ConfigMap metadata: name: peer-pods-cm namespace: openshift-sandboxed-containers-operator data: CLOUD_PROVIDER: "libvirt" PEERPODS_LIMIT_PER_NODE: "10"1 LIBVIRT_POOL: "<libvirt_pool>"2 LIBVIRT_VOL_NAME: "<libvirt_volume>"3 LIBVIRT_DIR_NAME: "/var/lib/libvirt/images/<directory_name>"4 LIBVIRT_NET: "default"5 DISABLECVM: "true"运行以下命令来创建配置映射:
$ oc apply -f peer-pods-cm.yaml
6.2.6. 创建对等 pod 虚拟机镜像配置映射 复制链接链接已复制到粘贴板!
您必须为对等 pod 虚拟机(VM)镜像创建配置映射。
先决条件
- 您必须使用 Red Hat Hybrid Cloud Console 创建激活码。
- 可选:如果要使用 Cloud API Adaptor 自定义镜像,则必须有镜像的名称、URL 和分支或标签。
流程
根据以下示例创建
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 IMAGE_NAME: "<podvm_libvirt_image>"5 PODVM_IMAGE_URI: "oci::<image_repo_url>:<image_tag>::<image_path>"6 SE_BOOT: "true"7 BASE_OS_VERSION: "<rhel_image_os_version>"8 - 1
- 如果要使用自定义 Cloud API Adaptor 源来构建 pod 虚拟机镜像,请指定
yes。 - 2
- 可选:指定 Cloud API Adaptor 自定义镜像的 URL。
- 3
- 可选:指定 Cloud API Adaptor 自定义镜像的分支或标签。
- 4
- 指定 RHEL 激活码。
- 5
- 指定自定义 peer pod VM 镜像名称。
- 6
- 可选:如果您创建了自定义对等 pod 虚拟机镜像,请指定容器 registry URL、镜像标签和镜像路径(默认为
/image/podvm.qcow2)。否则,将值设为""。 - 7
- 默认值为
true,为默认 Operator 构建的镜像启用 IBM Secure Execution。如果您使用自定义对等 pod 虚拟机镜像,请将其设置为false。 - 8
- 指定 RHEL 镜像操作系统版本。IBM Z® Secure Execution 支持 RHEL 9.5 及更新的版本。
运行以下命令来创建配置映射:
$ oc apply -f libvirt-podvm-image-cm.yamllibvirt pod 虚拟机镜像配置映射为您的 libvirt 供应商创建。
6.2.7. 创建 KVM 主机 secret 复制链接链接已复制到粘贴板!
您必须为 KVM 主机创建 secret。
流程
运行以下命令来生成 SSH 密钥对:
$ ssh-keygen -f ./id_rsa -N ""将公共 SSH 密钥复制到 KVM 主机:
$ ssh-copy-id -i ./id_rsa.pub <KVM_HOST_IP>1 - 1
- 指定 KVM 主机的 IP 地址或运行对等 pod 虚拟机的 LPAR。例如,192.168.2.1
。
运行以下命令来创建
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 密钥:
$ shred --remove id_rsa.pub id_rsa
6.2.8. 选择自定义对等 pod 虚拟机镜像 复制链接链接已复制到粘贴板!
您可以通过向 pod 清单添加注解来选择自定义对等 pod 虚拟机(VM)镜像,根据您的工作负载要求量身定制。自定义镜像覆盖对等 pod 配置映射中指定的默认镜像。您可以在 libvirt 池中创建新的 libvirt 卷,并将自定义对等 pod 虚拟机镜像上传到新卷。然后,您将 pod 清单更新为使用自定义对等 pod 虚拟机镜像。
先决条件
- 要使用的自定义 pod 虚拟机镜像的 ID,与云供应商或 hypervisor 兼容。
流程
运行以下命令设置 libvirt 池的名称:
$ export LIBVIRT_POOL=<libvirt_pool>1 - 1
- 指定现有的 libvirt 池名称。
运行以下命令,设置新 libvirt 卷的名称:
$ export LIBVIRT_VOL_NAME=<new_libvirt_volume>运行以下命令,为池创建 libvirt 卷:
$ virsh -c qemu:///system \ vol-create-as --pool $LIBVIRT_POOL \ --name $LIBVIRT_VOL_NAME \ --capacity 20G \ --allocation 2G \ --prealloc-metadata \ --format qcow2将自定义对等 pod 虚拟机镜像上传到 libvirt 卷:
$ virsh -c qemu:///system vol-upload \ --vol $LIBVIRT_VOL_NAME <custom_podvm_image.qcow2> \1 --pool $LIBVIRT_POOL --sparse- 1
- 指定自定义 peer pod VM 镜像名称。
根据以下示例创建
pod-manifest.yaml清单文件:apiVersion: v1 kind: Pod metadata: name: pod-manifest annotations: io.katacontainers.config.hypervisor.image: "<new_libvirt_volume>"1 spec: runtimeClassName: kata-remote2 containers: - name: <example_container>3 image: registry.access.redhat.com/ubi9/ubi:9.3 command: ["sleep", "36000"]运行以下命令来创建 pod:
$ oc apply -f pod-manifest.yaml
6.2.9. 自定义 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,请包含完整的策略并调整相关规则。
流程
使用自定义策略创建
policy.rego文件。以下示例显示了所有可配置的 API,并且为演示启用了exec和log:package agent_policy import future.keywords.in import input default CopyFileRequest := false default CreateContainerRequest := false default CreateSandboxRequest := true default DestroySandboxRequest := true default ExecProcessRequest := true # Enabled to allow exec API default GetOOMEventRequest := true default GuestDetailsRequest := true default OnlineCPUMemRequest := true default PullImageRequest := true default ReadStreamRequest := true # Enabled to allow log API default RemoveContainerRequest := true default RemoveStaleVirtiofsShareMountsRequest := true default SignalProcessRequest := true default StartContainerRequest := true default StatsContainerRequest := true default TtyWinResizeRequest := true default UpdateEphemeralMountsRequest := true default UpdateInterfaceRequest := true default UpdateRoutesRequest := true default WaitProcessRequest := true default WriteStreamRequest := false此策略启用
exec(ExecProcessRequest)和log(ReadStreamRequest) API。根据您的需要,调整true或false值以进一步自定义策略。运行以下命令,将
policy.rego文件转换为 Base64 编码的字符串:$ base64 -w0 policy.rego将输出保存到 yaml 文件中。
将 Base64 编码的策略添加到
my-pod.yamlpod 规格文件中: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运行以下命令来应用 pod 清单:
$ oc apply -f my-pod.yaml
6.2.10. 创建 KataConfig 自定义资源 复制链接链接已复制到粘贴板!
您必须创建 KataConfig 自定义资源(CR)来作为 worker 节点上的运行时类安装 kata-remote。
创建 KataConfig CR 会触发 OpenShift 沙盒容器 Operator 来执行以下操作:
-
使用默认配置创建一个名为
kata-remote的RuntimeClassCR。这可让用户在RuntimeClassName字段中引用 CR 将工作负载配置为使用kata-remote作为运行时。此 CR 也指定运行时的资源开销。
OpenShift 沙盒容器将 kata-remote 安装为集群上的 辅助 可选运行时,而不是主运行时。
创建 KataConfig CR 会自动重启 worker 节点。重启可能需要 10 到 60 分钟。妨碍重启时间的因素如下:
- 带有更多 worker 节点的大型 OpenShift Container Platform 部署。
- 激活 BIOS 和 Diagnostics 实用程序。
- 在硬盘而不是 SSD 上部署。
- 在物理节点上部署,如裸机,而不是在虚拟节点上部署。
- CPU 和网络较慢。
先决条件
-
您可以使用具有
cluster-admin角色的用户访问集群。
流程
根据以下示例创建
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 - 1
- 可选:如果您应用了节点标签在特定节点上安装
kata-remote,请指定键和值,例如osc: 'true'。
运行以下命令来创建
KataConfigCR:$ oc apply -f example-kataconfig.yaml新的
KataConfigCR 被创建,并在 worker 节点上作为运行时类安装kata-remote。在验证安装前,等待
kata-remote安装完成,以及 worker 节点重新引导。运行以下命令监控安装进度:
$ watch "oc describe kataconfig | sed -n /^Status:/,/^Events/p"安装kataNodes下所有 worker 的状态并且条件InProgress为False时,而不指定原因,则会在集群中安装kata-remote。运行以下命令,验证您是否已构建对等 pod 镜像并将其上传到 libvirt 卷中:
$ oc describe configmap peer-pods-cm -n openshift-sandboxed-containers-operator输出示例
Name: peer-pods-cm Namespace: openshift-sandboxed-containers-operator Labels: <none> Annotations: <none> Data ==== CLOUD_PROVIDER: libvirt BinaryData ==== Events: <none>运行以下命令,监控
kata-oc机器配置池进度,以确保它处于UPDATED状态,当UPDATED等于 MACHINECOUNT 时:MACHINECOUNT$ watch oc get mcp/kata-oc运行以下命令验证守护进程集:
$ oc get -n openshift-sandboxed-containers-operator ds/osc-caa-ds运行以下命令验证运行时类:
$ oc get runtimeclass输出示例
NAME HANDLER AGE kata kata 152m kata-remote kata-remote 152m
6.2.11. 修改每个节点的对等 pod 虚拟机数量 复制链接链接已复制到粘贴板!
您可以通过编辑 peerpodConfig 自定义资源(CR)来修改每个节点的对等 pod 虚拟机限制。
流程
运行以下命令检查当前的限制:
$ oc get peerpodconfig peerpodconfig-openshift -n openshift-sandboxed-containers-operator \ -o jsonpath='{.spec.limit}{"\n"}'运行以下命令修改
peerpodConfigCR 的limit属性:$ oc patch peerpodconfig peerpodconfig-openshift -n openshift-sandboxed-containers-operator \ --type merge --patch '{"spec":{"limit":"<value>"}}'1 - 1
- 将 <value> 替换为您要定义的限制。
6.2.12. 配置工作负载对象 复制链接链接已复制到粘贴板!
您必须通过将 kata-remote 设置为以下 pod 模板对象的运行时类来配置 OpenShift 沙盒容器工作负载对象:
-
Pod对象 -
ReplicaSet对象 -
ReplicationController对象 -
StatefulSet对象 -
Deployment对象 -
deploymentConfig对象
不要在 Operator 命名空间中部署工作负载。为这些资源创建一个专用命名空间。
先决条件
-
您已创建了
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。