EX380 Advanced OpenShift Cheatsheet

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