Dieser Inhalt ist in der von Ihnen ausgewählten Sprache nicht verfügbar.
Chapter 3. Deploying confidential containers on IBM Z and IBM LinuxONE
You deploy confidential containers on a Red Hat OpenShift Container Platform cluster on IBM Z® and IBM® LinuxONE for your workloads.
Confidential containers on IBM Z® and IBM® LinuxONE is a Technology Preview feature only. Technology Preview features are not supported with Red Hat production service level agreements (SLAs) and might not be functionally complete. Red Hat does not recommend using them in production. These features provide early access to upcoming product features, enabling customers to test functionality and provide feedback during the development process.
For more information about the support scope of Red Hat Technology Preview features, see Technology Preview Features Support Scope.
You deploy confidential containers by performing the following steps:
- Install the OpenShift sandboxed containers Operator.
- Create the peer pods secret.
- Enable the confidential containers feature gate.
-
Optional: If you pull a peer pod VM image from a private registry such as
registry.access.redhat.com
, configure the pull secret for peer pods. - Create initdata. See About initdata for details.
- Create the peer pods config map.
- Optional: Apply initdata to a peer pod.
- Optional: Select a custom peer pod VM image.
-
Create the
KataConfig
CR. - Verify the attestation process.
IBM® Hyper Protect Confidential Container (HPCC) for Red Hat OpenShift Container Platform is now production-ready. HPCC enables Confidential Computing technology at the enterprise scale by providing a multiparty Hyper Protect Contract, deployment attestation, and validation of container runtime and OCI image integrity.
HPCC is supported by IBM Z17® and IBM® LinuxONE Emperor 5. For more information, see the IBM HPCC documentation.
3.1. Prerequisites Link kopierenLink in die Zwischenablage kopiert!
- You have installed Red Hat OpenShift Container Platform 4.16 or later on the cluster where you are running your confidential containers workload.
- You have deployed Red Hat build of Trustee on an OpenShift Container Platform cluster in a trusted environment. For more information, see Deploying Red Hat build of Trustee.
- You are using LinuxONE Emperor 4.
- You have enabled Secure Unpack Facility on your Logical Partition (LPAR), which is necessary for the IBM Secure Execution. For more information, see Enabling the KVM host for IBM Secure Execution.
3.2. Installing the OpenShift sandboxed containers Operator Link kopierenLink in die Zwischenablage kopiert!
You install the OpenShift sandboxed containers Operator by using the command line interface (CLI).
Prerequisites
-
You have access to the cluster as a user with the
cluster-admin
role.
Procedure
Create an
osc-namespace.yaml
manifest file:apiVersion: v1 kind: Namespace metadata: name: openshift-sandboxed-containers-operator
apiVersion: v1 kind: Namespace metadata: name: openshift-sandboxed-containers-operator
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create the namespace by running the following command:
oc apply -f osc-namespace.yaml
$ oc apply -f osc-namespace.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create an
osc-operatorgroup.yaml
manifest file:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create the operator group by running the following command:
oc apply -f osc-operatorgroup.yaml
$ oc apply -f osc-operatorgroup.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create an
osc-subscription.yaml
manifest file:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create the subscription by running the following command:
oc apply -f osc-subscription.yaml
$ oc apply -f osc-subscription.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Verify that the Operator is correctly installed by running the following command:
oc get csv -n openshift-sandboxed-containers-operator
$ oc get csv -n openshift-sandboxed-containers-operator
Copy to Clipboard Copied! Toggle word wrap Toggle overflow This command can take several minutes to complete.
Watch the process by running the following command:
watch oc get csv -n openshift-sandboxed-containers-operator
$ watch oc get csv -n openshift-sandboxed-containers-operator
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Example output
NAME DISPLAY VERSION REPLACES PHASE openshift-sandboxed-containers openshift-sandboxed-containers-operator 1.10.1 1.9.0 Succeeded
NAME DISPLAY VERSION REPLACES PHASE openshift-sandboxed-containers openshift-sandboxed-containers-operator 1.10.1 1.9.0 Succeeded
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.3. Creating the peer pods secret Link kopierenLink in die Zwischenablage kopiert!
You must create a peer pods secret. The secret stores credentials for creating the pod virtual machine (VM) image and peer pod instances.
Prerequisites
LIBVIRT_URI
. This value is the default gateway IP address of the libvirt network. Check your libvirt network setup to obtain this value.NoteIf libvirt uses the default bridge virtual network, you can obtain the
LIBVIRT_URI
by running the following commands: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"
$ 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 Copied! Toggle word wrap Toggle overflow -
REDHAT_OFFLINE_TOKEN
. You have generated this token to download the RHEL image at Red Hat API Tokens. -
HOST_KEY_CERTS
. The Host Key Document (HKD) certificate enables secure execution on IBM Z®. For more information, see Obtaining a host key document from Resource Link in the IBM documentation.
Procedure
Create a
peer-pods-secret.yaml
manifest file according to the following example:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create the secret by running the following command:
oc create -f peer-pods-secret.yaml
$ oc create -f peer-pods-secret.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.4. Enabling the confidential containers feature gate Link kopierenLink in die Zwischenablage kopiert!
You enable the confidential containers feature gate by creating the osc-feature-gates
config map.
Procedure
Create a
cc-feature-gate.yaml
manifest file:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create the
osc-feature-gates
config map by running the following command:oc create -f cc-feature-gate.yaml
$ oc create -f cc-feature-gate.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.5. Configuring the pull secret for peer pods Link kopierenLink in die Zwischenablage kopiert!
To pull pod VM images from a private registry, you must configure the pull secret for peer pods.
Then, you can link the pull secret to the default service account or you can specify the pull secret in the peer pod manifest.
Procedure
Set the
NS
variable to the namespace where you deploy your peer pods:NS=<namespace>
$ NS=<namespace>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Copy the pull secret to the peer pod namespace:
oc get secret pull-secret -n openshift-config -o yaml \ | sed "s/namespace: openshift-config/namespace: ${NS}/" \ | oc apply -n "${NS}" -f -
$ 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 Copied! Toggle word wrap Toggle overflow You can use the cluster pull secret, as in this example, or a custom pull secret.
Optional: Link the pull secret to the default service account:
oc secrets link default pull-secret --for=pull -n ${NS}
$ oc secrets link default pull-secret --for=pull -n ${NS}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Alternatively, add the pull secret to the peer pod manifest:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.6. Creating initdata Link kopierenLink in die Zwischenablage kopiert!
You create an initdata.toml
file and convert it to a Base64-encoded string in gzip format.
You specify this string as the INITDATA
value in the peer pods config map, for global configuration, or as an annotation in a peer pod manifest, for a specific pod.
You must delete the kbs_cert
setting if you configure insecure_http = true
in the kbs-config
config map.
Procedure
Obtain the Red Hat build of Trustee IP address by running the following command:
oc get node $(oc get pod -n trustee-operator-system \ -o jsonpath='{.items[0].spec.nodeName}') \ -o jsonpath='{.status.addresses[?(@.type=="InternalIP")].address}'
$ oc get node $(oc get pod -n trustee-operator-system \ -o jsonpath='{.items[0].spec.nodeName}') \ -o jsonpath='{.status.addresses[?(@.type=="InternalIP")].address}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Example output
192.168.122.22
192.168.122.22
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Obtain the port by running the following command:
oc get svc kbs-service -n trustee-operator-system
$ oc get svc kbs-service -n trustee-operator-system
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Example output
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kbs-service NodePort 172.30.116.11 <none> 8080:32178/TCP 12d
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kbs-service NodePort 172.30.116.11 <none> 8080:32178/TCP 12d
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create the
initdata.toml
file:Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
<trustee-url>
: Specify the Red Hat build of Trustee IP address and the port, for example,https://192.168.122.22:32178
. -
<kbs_certificate>
: Specify the Base64-encoded TLS certificate for the attestation agent. -
kbs_cert
: Delete thekbs_cert
setting if you configureinsecure_http = true
in thekbs-config
config map.
-
Convert the
initdata.toml
file to a Base64-encoded string in gzip format in a text file by running the following command:cat initdata.toml | gzip | base64 -w0 > initdata.txt
$ cat initdata.toml | gzip | base64 -w0 > initdata.txt
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Record this string for the peer pods config map or a peer pod manifest.
Calculate the SHA-256 hash of an
initdata.toml
file and assign its value to thehash
variable by running the following command:hash=$(sha256sum initdata.toml | cut -d' ' -f1)
$ hash=$(sha256sum initdata.toml | cut -d' ' -f1)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Assign 32 bytes of 0s to the
initial_pcr
variable by running the following command:initial_pcr=0000000000000000000000000000000000000000000000000000000000000000
$ initial_pcr=0000000000000000000000000000000000000000000000000000000000000000
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Calculate the SHA-256 hash of
hash
andinitial_pcr
and assign its value to thePCR8_HASH
variable by running the following command:PCR8_HASH=$(echo -n "$initial_pcr$hash" | xxd -r -p | sha256sum | cut -d' ' -f1) && echo $PCR8_HASH
$ PCR8_HASH=$(echo -n "$initial_pcr$hash" | xxd -r -p | sha256sum | cut -d' ' -f1) && echo $PCR8_HASH
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Record the
PCR8_HASH
value for the. Calculate the SHA-256 hash of aninitdata.toml
file and assign its value to thehash
variable by running the following command:hash=$(sha256sum initdata.toml | cut -d' ' -f1)
$ hash=$(sha256sum initdata.toml | cut -d' ' -f1)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Assign 32 bytes of 0s to the
initial_pcr
variable by running the following command:initial_pcr=0000000000000000000000000000000000000000000000000000000000000000
$ initial_pcr=0000000000000000000000000000000000000000000000000000000000000000
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Calculate the SHA-256 hash of
hash
andinitial_pcr
and assign its value to thePCR8_HASH
variable by running the following command:PCR8_HASH=$(echo -n "$initial_pcr$hash" | xxd -r -p | sha256sum | cut -d' ' -f1) && echo $PCR8_HASH
$ PCR8_HASH=$(echo -n "$initial_pcr$hash" | xxd -r -p | sha256sum | cut -d' ' -f1) && echo $PCR8_HASH
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Record the
PCR8_HASH
value for the RVPS config map.
3.7. Creating the peer pods config map Link kopierenLink in die Zwischenablage kopiert!
You must create the peer pods config map.
Procedure
Create a
peer-pods-cm.yaml
manifest file according to the following example:Copy to Clipboard Copied! Toggle word wrap Toggle overflow LIBVIRT_POOL
- If you have manually configured the libvirt pool, use the same name as in your KVM host configuration.
LIBVIRT_VOL_NAME
- If you have manually configured the libvirt volume, use the same name as in your KVM host configuration.
LIBVIRT_DIR_NAME
-
Specify the libvirt directory for storing virtual machine disk images, such as
.qcow2
, or.raw
files. To ensure libvirt has read and write access permissions, use a subdirectory of the libvirt storage directory. The default is/var/lib/libvirt/images/
. LIBVIRT_NET
- Specify a libvirt network if you do not want to use the default network.
PEERPODS_LIMIT_PER_NODE
-
You can increase this value to run more peer pods on a node. The default value is
10
. ROOT_VOLUME_SIZE
- You can increase this value for pods with larger container images. Specify the root volume size in gigabytes for the pod VM. The default and minimum size is 6 GB.
Create the config map by running the following command:
oc create -f peer-pods-cm.yaml
$ oc create -f peer-pods-cm.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.8. Applying initdata to a pod Link kopierenLink in die Zwischenablage kopiert!
You can override the global INITDATA
setting you applied in the peer pods config map by applying customized initdata to a specific pod for special use cases, such as development and testing with a relaxed policy, or when using different Red Hat build of Trustee configurations. You can customize initdata by adding an annotation to the workload pod YAML.
Prerequisite
- You have created an initdata string.
Procedure
Add the initdata string to the pod manifest:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Apply the pod manifest by running the following command:
oc apply -f my-pod.yaml
$ oc apply -f my-pod.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.9. Selecting a custom peer pod VM image Link kopierenLink in die Zwischenablage kopiert!
You can select a custom peer pod virtual machine (VM) image, tailored to your workload requirements by adding an annotation to the pod manifest. The custom image overrides the default image specified in the peer pods config map.
You create a new libvirt volume in your libvirt pool and upload the custom peer pod VM image to the new volume. Then, you update the pod manifest to use the custom peer pod VM image.
Procedure
Set the
LIBVIRT_POOL
variable by running the following command:export LIBVIRT_POOL=<libvirt_pool>
$ export LIBVIRT_POOL=<libvirt_pool>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Set the
LIBVIRT_VOL_NAME
variable to a new libvirt volume by running the following command:export LIBVIRT_VOL_NAME=<new_libvirt_volume>
$ export LIBVIRT_VOL_NAME=<new_libvirt_volume>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create a libvirt volume for the pool by running the following command:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Upload the custom peer pod VM image to the new libvirt volume:
virsh -c qemu:///system vol-upload \ --vol $LIBVIRT_VOL_NAME <custom_podvm_image.qcow2> \ --pool $LIBVIRT_POOL --sparse
$ virsh -c qemu:///system vol-upload \ --vol $LIBVIRT_VOL_NAME <custom_podvm_image.qcow2> \ --pool $LIBVIRT_POOL --sparse
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create a
my-pod-manifest.yaml
file according to the following example:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create the pod by running the following command:
oc create -f my-pod-manifest.yaml
$ oc create -f my-pod-manifest.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.10. Creating the KataConfig custom resource Link kopierenLink in die Zwischenablage kopiert!
You must create the KataConfig
custom resource (CR) to install kata-remote
as a runtime class on your worker nodes.
OpenShift sandboxed containers installs kata-remote
as a secondary, optional runtime on the cluster and not as the primary runtime.
Creating the KataConfig
CR automatically reboots the worker nodes. The reboot can take from 10 to more than 60 minutes. The following factors can increase the reboot time:
- A large OpenShift Container Platform deployment with a greater number of worker nodes.
- Activation of the BIOS and Diagnostics utility.
- Deployment on a hard disk drive rather than an SSD.
- Deployment on physical nodes such as bare metal, rather than on virtual nodes.
- A slow CPU and network.
Procedure
Create an
example-kataconfig.yaml
manifest file according to the following example:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- Optional: If you have applied node labels to install
kata-remote
on specific nodes, specify the key and value, for example,cc: 'true'
.
Create the
KataConfig
CR by running the following command:oc apply -f example-kataconfig.yaml
$ oc apply -f example-kataconfig.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow The new
KataConfig
CR is created and installskata-remote
as a runtime class on the worker nodes.Wait for the
kata-remote
installation to complete and the worker nodes to reboot before verifying the installation.Monitor the installation progress by running the following command:
watch "oc describe kataconfig | sed -n /^Status:/,/^Events/p"
$ watch "oc describe kataconfig | sed -n /^Status:/,/^Events/p"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow When the status of all workers under
kataNodes
isinstalled
and the conditionInProgress
isFalse
without specifying a reason, thekata-remote
is installed on the cluster.Verify that you have built the peer pod image and uploaded it to the libvirt volume by running the following command:
oc describe configmap peer-pods-cm -n openshift-sandboxed-containers-operator
$ oc describe configmap peer-pods-cm -n openshift-sandboxed-containers-operator
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Example output
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Monitor the
kata-oc
machine config pool progress to ensure that it is in theUPDATED
state, whenUPDATEDMACHINECOUNT
equalsMACHINECOUNT
, by running the following command:watch oc get mcp/kata-oc
$ watch oc get mcp/kata-oc
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Verify the daemon set by running the following command:
oc get -n openshift-sandboxed-containers-operator ds/osc-caa-ds
$ oc get -n openshift-sandboxed-containers-operator ds/osc-caa-ds
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Verify the runtime classes by running the following command:
oc get runtimeclass
$ oc get runtimeclass
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Example output
NAME HANDLER AGE kata-remote kata-remote 152m
NAME HANDLER AGE kata-remote kata-remote 152m
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.11. Verifying attestation Link kopierenLink in die Zwischenablage kopiert!
You can verify the attestation process by creating a BusyBox pod. The pod image deploys the confidential workload where you can retrieve the key.
This procedure is an example to verify that attestation is working. Do not write sensitive data to standard I/O, because the data can be captured by using a memory dump. Only data written to memory is encrypted.
Procedure
Create a
test-pod.yaml
manifest file:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create the pod by running the following command:
oc create -f test-pod.yaml
$ oc create -f test-pod.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Log in to the pod by running the following command:
oc exec -it busybox -n default -- /bin/sh
$ oc exec -it busybox -n default -- /bin/sh
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Fetch the pod secret by running the following command:
wget http://127.0.0.1:8006/cdh/resource/default/kbsres1/key1
$ wget http://127.0.0.1:8006/cdh/resource/default/kbsres1/key1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Example output
Connecting to 127.0.0.1:8006 (127.0.0.1:8006) saving to 'key1' key1 100% |*******************************************| 8 0:00:00 ETA 'key1' saved
Connecting to 127.0.0.1:8006 (127.0.0.1:8006) saving to 'key1' key1 100% |*******************************************| 8 0:00:00 ETA 'key1' saved
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Display the
key1
value by running the following command:cat key1
$ cat key1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Example output
res1val1/ #
res1val1/ #
Copy to Clipboard Copied! Toggle word wrap Toggle overflow