OpenShift/OKD Prerequisites
Additional prerequisites for deploying CM Platform on OpenShift Container Platform (OCP) or OKD.
Air-gapped installations: all manifests referenced below are included in the installation tarball under
workstation/openshift-prerequisites/— apply them from there instead of the URLs.
Istio (OpenShift Service Mesh 3)
CM Platform uses Istio for service mesh. On OCP, install it via the Red Hat OpenShift Service Mesh 3 operator before running the Helm installation.
1. Install OSSM3 Operator
kubectl apply -f https://raw.githubusercontent.com/ConfidentialMind/examples/main/platform-deployment/openshift-prerequisites/ossm3-operator.yaml
Wait until the Istio CRDs are available before proceeding. OLM installs the operator asynchronously (this can take a few minutes), and
kubectl waitfails withNotFoundon a CRD that has not been registered yet — poll for existence first:until kubectl get crd istios.sailoperator.io >/dev/null 2>&1; do sleep 10; donekubectl wait --for=condition=Established crd/istios.sailoperator.io --timeout=120s
2. Install Istio CNI
kubectl apply -f https://raw.githubusercontent.com/ConfidentialMind/examples/main/platform-deployment/openshift-prerequisites/istio-cni.yaml
3. Install Istio
kubectl apply -f https://raw.githubusercontent.com/ConfidentialMind/examples/main/platform-deployment/openshift-prerequisites/istio.yaml
Node Feature Discovery (NFD)
NFD is required for GPU node labeling.
1. Install NFD Operator
kubectl apply -f https://raw.githubusercontent.com/ConfidentialMind/examples/main/platform-deployment/openshift-prerequisites/nfd-operator.yaml
Wait until the NFD CRDs are available before applying the CR (same async-operator pattern as the Istio section — poll for existence, then wait):
until kubectl get crd nodefeaturediscoveries.nfd.openshift.io >/dev/null 2>&1; do sleep 10; donekubectl wait --for=condition=Established crd/nodefeaturediscoveries.nfd.openshift.io --timeout=120s
2. Apply NFD CR
kubectl apply -f https://raw.githubusercontent.com/ConfidentialMind/examples/main/platform-deployment/openshift-prerequisites/nfd-cr.yaml
User workload monitoring
PurplePill GPU metrics are collected by OpenShift user workload monitoring. A cluster administrator
must enable it in the existing cluster-monitoring-config ConfigMap before installing CM Platform:
apiVersion: v1
kind: ConfigMap
metadata:
name: cluster-monitoring-config
namespace: openshift-monitoring
data:
config.yaml: |
enableUserWorkload: true
Merge this setting with any existing monitoring configuration; do not replace the ConfigMap's other
settings. After installation creates the monitoring namespace, ensure it is not excluded from user
workload monitoring:
kubectl label namespace monitoring openshift.io/user-monitoring-
If CM Platform is already installed, apply these settings now; they can be changed at any time. Until user
workload monitoring is on and the monitoring namespace is included in it, no GPU metrics are collected.
If the namespace uses default-deny ingress policies, allow OpenShift user workload Prometheus to
reach PurplePill pods on TCP port 9531.
MachineConfig Resources
Use your normal process to apply the below MachineConfig resources to configure worker nodes at the OS level.
Apply each manifest before running the CM Platform installation:
(!) The Machine Config Operator will roll out the configuration and reboot affected nodes. Wait until all nodes return to
Readystate before proceeding.
For Hosted Control Planes (HyperShift) "how to" see the note below.
99-worker-web-service-mnt-data
Creates and SELinux-labels /mnt/data on worker nodes for GPU model cache storage.
kubectl apply -f https://raw.githubusercontent.com/ConfidentialMind/examples/main/platform-deployment/openshift-prerequisites/99-worker-web-service-mnt-data.yaml
99-worker-ome-llm-cache
Creates and SELinux-labels /mnt/llm_cache on worker nodes for OME LLM model cache.
kubectl apply -f https://raw.githubusercontent.com/ConfidentialMind/examples/main/platform-deployment/openshift-prerequisites/99-worker-ome-llm-cache.yaml
99-worker-otel-checkpoint-dir
Creates and SELinux-labels /var/otel/file-checkpoints on worker nodes for persistent OpenTelemetry
filelog receiver checkpoints. Apply this MachineConfig before installing or upgrading CM Platform: the
log collector deliberately requires the prepared directory instead of allowing Kubernetes to create it
with an incompatible host SELinux label. The manifest targets the worker pool only; if log-collecting
nodes belong to another MachineConfigPool, apply a copy with the matching
machineconfiguration.openshift.io/role label, or the collector pods on those nodes never start.
kubectl apply -f https://raw.githubusercontent.com/ConfidentialMind/examples/main/platform-deployment/openshift-prerequisites/99-worker-otel-checkpoint-dir.yaml
Updating an existing cluster to this MachineConfig repairs the label on the existing directory and its
checkpoint files without deleting them. The service reapplies the label on every subsequent node boot.
After the MachineConfigPool finishes updating, verify every node eligible to run the log collector reports
container_file_t:s0:
oc debug node/<node> -- chroot /host ls -RZ /var/otel/file-checkpoints
Hosted Control Planes (HyperShift)
If your OpenShift cluster uses hosted control planes (HyperShift), the standard MachineConfigs are not applicable at the hosted clusters level. Look for Red Hat documentation regarding "Handling machine configuration for hosted control planes", e.g. OCP 4.19: https://docs.redhat.com/en/documentation/openshift_container_platform/4.19/html/hosted_control_planes/handling-machine-configuration-for-hosted-control-planes .
Re-encrypt Routes (optional)
If your environment requires reencrypt TLS termination at the load balancer level, use the openshift-tls-reencrypt chart. Routes with reencrypt termination require destinationCACertificate, which must be read at runtime from the cm-selfsigned-ca Secret created by cert-manager. Because ArgoCD renders Helm charts via helm template (no cluster access), this chart must be installed directly with helm install/upgrade, where lookup can fetch the current CA.
Run the below after the Platform deployment. Take the "self signed TLS" path when installing the Platform.
Onceplatform-installerhas run and the self-signed CA Secret bacame ready:
helm install \
openshift-tls-reencrypt oci://confidentialmindpub.azurecr.io/openshift-tls-reencrypt \
--namespace cm-platform --create-namespace \
--values basic-values.yaml
Re-run helm upgrade after cert rotation — lookup fetches the current CA on every render. The cm-selfsigned-ca certificate is valid for 10 years and cert-manager renews it a year before it expires, so in normal operation that re-run is needed once a decade.