EX380 Cheatsheet: alle gevorderde OpenShift commando’s op één pagina
De essentiële commando’s en YAML-patronen voor het EX380 examen op één pagina. Vereist: actieve kennis van EX280 commando’s — dit is het gevorderde vervolg.
🔐 Authenticatie — LDAP en Keycloak
# OAuth resource bewerken (centrale plek voor alle identity providers)
oc edit oauth cluster
# LDAP identity provider voorbeeld
spec:
identityProviders:
- name: bedrijf-ldap
mappingMethod: claim
type: LDAP
ldap:
attributes:
id: [dn]
email: [mail]
name: [cn]
preferredUsername: [uid]
bindDN: "cn=openshiftbind,ou=serviceaccounts,dc=voorbeeld,dc=nl"
bindPassword:
name: ldap-bind-secret
insecure: false
ca:
name: ldap-ca
url: "ldap://ldap.voorbeeld.nl/ou=gebruikers,dc=voorbeeld,dc=nl?uid"
# LDAP groepssynchronisatie
oc adm groups sync --sync-config=ldapsync.yaml --confirm=false # Droge run
oc adm groups sync --sync-config=ldapsync.yaml | oc apply -f - # Toepassen
oc adm groups sync --sync-config=ldapsync.yaml \
--whitelist=whitelist.txt | oc apply -f - # Met whitelist
oc get groups # Groepen bekijken
⚙️ MachineConfig Operator
# MachineConfig en pools bekijken
oc get machineconfig
oc get machineconfigpool
oc describe mcp worker
# Kernel parameters instellen via MachineConfig
apiVersion: machineconfiguration.openshift.io/v1
kind: MachineConfig
metadata:
name: 99-worker-hugepages
labels:
machineconfiguration.openshift.io/role: worker
spec:
kernelArguments:
- "hugepagesz=2M"
- "hugepages=512"
# Bestand op node plaatsen via MachineConfig
spec:
config:
ignition:
version: 3.2.0
storage:
files:
- path: /etc/mijn-config
mode: 0644
contents:
source: data:,mijn%20instelling%0A
# Systemd unit via MachineConfig
spec:
config:
systemd:
units:
- name: mijn-service.service
enabled: true
contents: |
[Unit]
Description=Mijn service
[Service]
ExecStart=/usr/local/bin/mijn-script.sh
[Install]
WantedBy=multi-user.target
⚠️ Elke MachineConfig-wijziging triggert een rollende herstart van de MachineConfigPool. Volg de voortgang met
oc get mcp -w
💾 OADP — Back-up en herstel
# OADP Operator installeren via OperatorHub
# Namespace: openshift-adp
# S3-credentials secret
oc create secret generic cloud-credentials \
--namespace openshift-adp \
--from-file cloud=credentials-velero
# BackupStorageLocation aanmaken
apiVersion: velero.io/v1
kind: BackupStorageLocation
metadata:
name: default
namespace: openshift-adp
spec:
provider: aws
objectStorage:
bucket: mijn-backup-bucket
prefix: openshift
config:
region: eu-west-1
# Status controleren
oc get backupstoragelocations -n openshift-adp # Moet Available zijn
# Back-up aanmaken
apiVersion: velero.io/v1
kind: Backup
metadata:
name: mijn-backup
namespace: openshift-adp
spec:
includedNamespaces: ["mijn-app"]
ttl: 720h0m0s
storageLocation: default
# Restore uitvoeren
apiVersion: velero.io/v1
kind: Restore
metadata:
name: mijn-restore
namespace: openshift-adp
spec:
backupName: mijn-backup
includedNamespaces: ["mijn-app"]
# Status volgen
oc get backup,restore -n openshift-adp
🎯 Geavanceerde pod-scheduling
# NodeAffinity — pods alleen op specifieke nodes
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node-role.kubernetes.io/infra
operator: Exists
# PodAntiAffinity — pods verspreid over nodes
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: mijn-app
topologyKey: kubernetes.io/hostname
# Taint op node instellen
oc adm taint nodes worker-1 dedicated=gpu:NoSchedule
# Toleration in pod
spec:
tolerations:
- key: "dedicated"
operator: "Equal"
value: "gpu"
effect: "NoSchedule"
# PodDisruptionBudget
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: mijn-app-pdb
spec:
minAvailable: 2
selector:
matchLabels:
app: mijn-app
# Infra nodes aanmaken
oc label node worker-2 node-role.kubernetes.io/infra=
oc adm taint nodes worker-2 node-role.kubernetes.io/infra=:NoSchedule
🔄 OpenShift GitOps (Argo CD)
# OpenShift GitOps operator installeert Argo CD in openshift-gitops namespace
# Argo CD CLI inloggen
argocd login --grpc-web \
$(oc get route openshift-gitops-server -n openshift-gitops -o jsonpath='{.spec.host}')
# Wachtwoord ophalen
oc extract secret/openshift-gitops-cluster \
-n openshift-gitops --to=-
# Application aanmaken
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: mijn-app
namespace: openshift-gitops
spec:
project: default
source:
repoURL: https://github.com/mijnorg/mijn-app
targetRevision: main
path: overlays/productie
destination:
server: https://kubernetes.default.svc
namespace: productie
syncPolicy:
automated:
prune: true # Verwijder wat niet in Git staat
selfHeal: true # Herstel handmatige wijzigingen
syncOptions:
- CreateNamespace=true
# App-beheer
argocd app list
argocd app sync mijn-app
argocd app diff mijn-app
argocd app rollback mijn-app
# AppProject voor team-isolatie
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: team-platform
namespace: openshift-gitops
spec:
sourceRepos: ["https://github.com/mijnorg/*"]
destinations:
- namespace: "productie-*"
server: https://kubernetes.default.svc
📊 Monitoring en alerting
# Cluster monitoring config (user workload monitoring inschakelen)
apiVersion: v1
kind: ConfigMap
metadata:
name: cluster-monitoring-config
namespace: openshift-monitoring
data:
config.yaml: |
enableUserWorkload: true
# Aangepaste alertregel
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: mijn-alerts
namespace: mijn-namespace
labels:
openshift.io/prometheus-rule-evaluation-scope: leaf-prometheus
spec:
groups:
- name: mijn.alerts
rules:
- alert: HoogCpuGebruik
expr: |
sum(rate(container_cpu_usage_seconds_total
{namespace="mijn-namespace",container!=""}[5m])) > 0.8
for: 5m
labels:
severity: warning
annotations:
summary: "Hoog CPU-gebruik gedetecteerd"
# Alertmanager receiver configureren
oc edit alertmanager main -n openshift-monitoring
📋 Logging — Vector en Loki
# Loki Operator installeren via OperatorHub
# S3 secret voor Loki opslag
oc create secret generic logging-loki-s3 \
--from-literal=bucketnames=mijn-loki-bucket \
--from-literal=endpoint=https://s3.eu-west-1.amazonaws.com \
--from-literal=region=eu-west-1 \
--from-literal=access_key_id=AKIAIOSFODNN7EXAMPLE \
--from-literal=access_key_secret=geheim \
-n openshift-logging
# ClusterLogging met Loki
apiVersion: logging.openshift.io/v1
kind: ClusterLogging
metadata:
name: instance
namespace: openshift-logging
spec:
logStore:
type: lokistack
lokistack:
name: logging-loki
collection:
type: vector
# Logs bekijken via oc
oc logs -n mijn-namespace deployment/mijn-app
oc logs -n mijn-namespace deployment/mijn-app --since=1h
# ClusterLogForwarder voor externe log-forwarding
apiVersion: logging.openshift.io/v1
kind: ClusterLogForwarder
metadata:
name: instance
namespace: openshift-logging
spec:
outputs:
- name: splunk-receiver
type: splunk
url: https://splunk.voorbeeld.nl:8088
secret:
name: splunk-secret
pipelines:
- name: forward-to-splunk
inputRefs: [application, infrastructure]
outputRefs: [splunk-receiver]
⚡ Examentips EX380
- 4 uur is lang maar de taken zijn complex — plan je tijd: sla vastgelopen taken over en kom terug
- MachineConfig-wijzigingen triggeren node-reboots — begin hier vroeg mee zodat de pool tijd heeft te herstellen
- Test LDAP-configuratie altijd met een droge run (
--confirm=false) voor je toepast - OADP BackupStorageLocation moet “Available” zijn voordat je een back-up kunt aanmaken
- Argo CD: ken het verschil tussen sync en refresh — refresh haalt nieuwe manifesten op, sync past toe
- Officiële Red Hat documentatie is beschikbaar tijdens het examen — weet waar je snel dingen vindt