Skip to content

Infrastructure Setup

Required: - [ ] Bastion (RHEL9) - [ ] haproxy - [ ] httpd - [ ] bind (?) - [ ] bind-utils Binaries Required: - [ ] mirror-registry - [ ] oc cli - [ ] oc-mirror - [ ] openshift-install - [ ] bind-utils (for nslookup and dig -- for troubleshooting) - [ ] 3x Control Plane (CoreOS) - [ ] 1x Bootstrap (CoreOS)

DNSes

  • api.clustername.baseDomain --> haproxy host
  • api-int.clustername.baseDomain --> haproxy host
  • *.apps.clustername.baseDomain --> haproxy host
  • bootstrap.clustername.baseDomain
  • controlPlane_n.clustername.baseDomain

Firewall Ports

The following ports need to be opened on the HAProxy/LB. - [ ]

# Allow ports permanently in the public zone                                       
sudo firewall-cmd --permanent --add-port=6443/tcp                                  
sudo firewall-cmd --permanent --add-port=22623/tcp                                 
sudo firewall-cmd --permanent --add-port=443/tcp                                   
sudo firewall-cmd --permanent --add-port=80/tcp

# For httpd
sudo firewall-cmd --permanent --add-port=81/tcp                                    
# Reload firewall to apply changes                                                 
sudo firewall-cmd --reload                                                         
# (Optional) Verify that the ports are open                                        
sudo firewall-cmd --list-ports

Dependencies Install

  • sudo dnf install -y haproxy httpd bind-utils
    

HAProxy config

  • global
      log         127.0.0.1 local2
      pidfile     /var/run/haproxy.pid
      maxconn     4000
      daemon
    defaults
      mode                    http
      log                     global
      option                  dontlognull
      option http-server-close
      option                  redispatch
      retries                 3
      timeout http-request    10s
      timeout queue           1m
      timeout connect         10s
      timeout client          1m
      timeout server          1m
      timeout http-keep-alive 10s
      timeout check           10s
      maxconn                 3000
    listen api-server-6443 
      bind *:6443
      mode tcp
      balance roundrobin
      server bootstrap discobootstrap.discoshift.pond.local:6443 verify none check check-ssl inter 10s fall 2 rise 3 backup 
      server master1 discophrog1.discoshift.pond.local:6443 weight 1 check inter 10s fall 2 rise 3
      server master2 discophrog2.discoshift.pond.local:6443 weight 1 check inter 10s fall 2 rise 3
      server master3 discophrog3.discoshift.pond.local:6443 weight 1 check inter 10s fall 2 rise 3
    listen machine-config-server-22623 
      bind *:22623
      mode tcp
      server bootstrap discobootstrap.discoshift.pond.local:22623 check inter 1s backup 
      server master1 discophrog1.discoshift.pond.local:22623 check inter 1s
      server master2 discophrog2.discoshift.pond.local:22623 check inter 1s
      server master3 discophrog3.discoshift.pond.local:22623 check inter 1s
    listen ingress-router-443 
      bind *:443
      mode tcp
      balance source
      server compute1 discophrog1.discoshift.pond.local:443 check inter 1s
      server compute2 discophrog2.discoshift.pond.local:443 check inter 1s
      server compute3 discophrog3.discoshift.pond.local:443 check inter 1s
    listen ingress-router-80
      bind *:80
      mode tcp
      balance source
      server compute1 discophrog1.discoshift.pond.local:80 check inter 1s
      server compute2 discophrog2.discoshift.pond.local:80 check inter 1s
      server compute3 discophrog3.discoshift.pond.local:80 check inter 1s
    

Quay

SSL Certs for Quay

  1. SSL cert needs to be setup via OpenSSL. Do not use self-signed certs.
    openssl req -newkey rsa:4096 -nodes -keyout quay.key -x509 -days 365 -out quay.crt \
    -subj "/CN=mirror.discoshift.mlopslab.ncs" \
    -addext "subjectAltName=DNS:mirror.discoshift.mlopslab.ncs"\
    

openssl req -newkey rsa:4096 -nodes -keyout quay.key -x509 -days 365 -out quay.crt -subj "/CN=mirror.discoshift.mlopslab.ncs" --addext "subjectAltName=DNS:mirror.discoshift.mlopslab.ncs"

Mirror Registry Setup

  1. To setup the mirror registry, mirror-registry binary must be in the machine already.
  2. sudo ./mirror-registry install --quayHostname mirror.discoshift.mlopslab.ncs --quayRoot /root/ocInstall-files/quay/ --sslCert /root/ocInstall-files/quay/certs/quay.crt --sslKey /root/ocInstall-files/quay/certs/quay.key --initPassword P@ssw0rd
    

  3. Acquire the pull secrets from Hybrid Cloud Console (To mirror from RedHat to Local Machine)

  4.  cd <path to install>/secrets
     mkdir -p $XDG_RUNTIME_DIR/containers \
     cat <dir-to-rh-pull-secret>/pull-secret | jq . > $XDG_RUNTIME_DIR/containers/auth.json
    

  5. From 1, use the initPassword and initUser to create an entry to the auth.json file you just created in 2.

  6. echo -n "init:password" | base64 -w0
    
    Output: **aW5pdDpwYXNzd29yZGhlcmU==**
    
vi $XDG_RUNTIME_DIR/containers/auth.json
  "auths": {
    "<mirror_registry_url>": { 
      "auth": "**aW5pdDpwYXNzd29yZGhlcmU==**", 
      "email": "you@example.com"                      #Anything works here.
    },
    .#Other stuff
    .
    .
    .
  }
Useful to jq the .json to check for validity.
jq . ./pull.json

2. ImageSetConfig

The ImageSetConfig.yaml is the input configuration file for the oc-mirror tool, and tells what OpenShift release and operators to mirror. - [ ] ``` yaml #Base Image apiVersion: mirror.openshift.io/v2alpha1 kind: ImageSetConfiguration mirror: platform: channels: - name: stable-4.18 type: ocp minVersion: "4.18.17" maxVersion: "4.18.17" graph: false additionalImages: [] operators: []

  • catalog: registry.redhat.io/redhat/certified-operator-index:v4.18 packages:

    • name: gpu-operator-certified channels:
      • name: v25.3
    • name: nutanixcsioperator
      channels:
      • name: stable-3.x
  • catalog: registry.redhat.io/redhat/community-operator-index:v4.18 packages:

    • name: grafana-operator channels:
      • name: v5
  • catalog: registry.redhat.io/redhat/redhat-operator-index:v4.18 packages:

    • name: serverless-operator
      channels:
      • name: stable
    • name: cluster-logging channels:
      • name: stable-6.2
    • name: loki-operator channels:
      • name: stable-6.2
    • name: quay-operator channels:
      • name: stable-3.14
    • name: compliance-operator channels:
      • name: stable
    • name: nfd channels:
      • name: stable
    • name: rhacs-operator channels:
      • name: stable
    • name: cluster-observability-operator channels:
      • name: stable
        ``` sh
        # For the operators and additional images field, you can check the release channel and packages if required:
        podman login -u registry.redhat.io
        # Core Red Hat operators
        oc mirror list operators \
          --catalog=registry.redhat.io/redhat/redhat-operator-index:v4.18
        # Community-sourced operators
        oc mirror list operators \
          --catalog=registry.redhat.io/redhat/community-operator-index:v4.18
        # ISV-certified operators
        oc mirror list operators \
          --catalog=registry.redhat.io/redhat/certified-operator-index:v4.18
        

3. Mirroring to Local Disk

Before pushing the image to the mirror registry, 1. Mirror OCP images to local directory: - [ ]

nohup oc-mirror -c <path_to_imageSetConfig.yaml> file://<path_to_mirror_dest> --authfile --v2 &
- root/prod41817/metaTest/ is the directory where the tarball will be mirrored to.

4. Mirroring from Local Disk to Mirror Registry (Quay)

Once the images have been mirrored locally, it can then be pushed to the mirror registry.

  1. Mirror from Local to Quay:
  2. oc-mirror --from=file:///home/ocInstall/ docker://registry.local.jackhww.me:8443 --dest-tls-verify=false --v2 --config=/home/install/imageSetConfig.yaml --authfile=...
    

  3. Once successful, the ImageDigestMirrorSet and ImageTagMirrorSet will be stored in /root/prod41817/metaTest/working-dir/cluster-resources

  4. In a true disconnected environment, if facing issues with dial tcp lookup... pinging container registry registry.redhat.io..., amend /etc/containers/registry.conf with the following entries:

    [[registry]]
        prefix = "registry.redhat.io"
        location = "registry.local.jackhww.me:8443"
        insecure = true
    

  5. If facing issues with Error 413: entity too large...

    vi /etc/systemd/system/quay-app.service
    -e MAX_REQUEST_BODY_SIZE=524288000
    
    sudo systemctl daemon-reload
    sudo systemctl restart quay-app
    

  6. This will be used in the install-config.yaml later on when igniting the install-config.
    output:
    2025/06/25 23:59:17  [INFO] : === Results ===                                      
    2025/06/25 23:59:17  [INFO]   :  βœ“ 189 / 189 release images mirrored successfully  
    2025/06/25 23:59:17  [INFO]   :  βœ“ 147 / 147 operator images mirrored successfully
    2025/06/25 23:59:17  [INFO] : πŸ“¦ Preparing the tarball archive...                  
    2025/06/26 00:47:41  [INFO] : πŸ•΅  going to discover the necessary images...        
    2025/06/26 00:47:41  [INFO] :  πŸ” collecting release images...                      
    2025/06/26 00:47:41  [INFO] : πŸ” collecting operator images...                     
    2025/06/26 00:47:42  [INFO] : πŸ” collecting additional images...                   
    2025/06/26 00:47:42  [INFO] : πŸ” collecting helm images...                         
    2025/06/26 00:47:42  [INFO] : πŸš€ Start copying the images...                       
    2025/06/26 00:47:42  [INFO] : πŸ“Œ images to copy 336                                
    2025/06/26 01:28:20  [INFO] : === Results ===                                      
    2025/06/26 01:28:20  [INFO]   :  βœ“ 189 / 189 release images mirrored successfully  
    2025/06/26 01:28:20  [INFO]   :  βœ“ 147 / 147 operator images mirrored successfully 
    2025/06/26 01:28:20  [INFO] : πŸ“„ Generating IDMS file...                           
    2025/06/26 01:28:20  [INFO]   : /root/prod41817/metaTest/working-dir/cluster-resources/idms-oc-mirror.yaml file created                                         2025/06/26 01:28:20  [INFO] : πŸ“„ Generating ITMS file...                           2025/06/26 01:28:20  [INFO]   : /root/prod41817/metaTest/working-dir/cluster-resources/itms-oc-mirror.yaml file created                             2025/06/26 01:28:20  [INFO] : πŸ“„ Generating CatalogSource file...                  
    2025/06/26 01:28:20  [INFO]   : /root/prod41817/metaTest/working-dir/cluster-resources/cs-certified-operator-index-v4-18.yaml file created                      
    2025/06/26 01:28:20  [INFO]   : /root/prod41817/metaTest/working-dir/cluster-resources/cs-community-operator-index-v4-18.yaml file created                      
    2025/06/26 01:28:20  [INFO]   : /root/prod41817/metaTest/working-dir/cluster-resources/cs-redhat-operator-index-v4-18.yaml file created                         
    2025/06/26 01:28:20  [INFO] : πŸ“„ Generating ClusterCatalog file...                 
    2025/06/26 01:28:20  [INFO]   : /root/prod41817/metaTest/working-dir/cluster-resources/cc-certified-operator-index-v4-18.yaml file created                      2025/06/26 01:28:20  [INFO]   : /root/prod41817/metaTest/working-dir/cluster-resources/cc-community-operator-index-v4-18.yaml file created                      
    2025/06/26 01:28:20  [INFO]   : /root/prod41817/metaTest/working-dir/cluster-resources/cc-redhat-operator-index-v4-18.yaml file created                         
    2025/06/26 01:28:20  [INFO] : πŸ“„ Generating Signature Configmap...                 
    2025/06/26 01:28:20  [INFO]   : /root/prod41817/metaTest/working-dir/cluster-resources/signature-configmap.json file created                                    
    2025/06/26 01:28:20  [INFO]   : /root/prod41817/metaTest/working-dir/cluster-resources/signature-configmap.yaml file created                                    
    2025/06/26 01:28:20  [INFO] : mirror time     : 54m19.39647969s                    
    2025/06/26 01:28:20  [INFO] : πŸ‘‹ Goodbye, thank you for using oc-mirror
    

5. Preignition

Customize the install-config.yaml file to your needs accordingly.

SSH Key Generation

ssh-keygen -t ed25519
This will be consumed upon use so remember to keep a backup. - [ ]
apiVersion: v1
baseDomain: pond.local
compute: 
- hyperthreading: Enabled 
  name: worker
  replicas: 0 
controlPlane: 
  hyperthreading: Enabled 
  name: master
  replicas: 3 
metadata:
  name: discoshift
networking:
  clusterNetwork:
  - cidr: 10.128.0.0/14 
    hostPrefix: 23 
  networkType: OVNKubernetes 
  serviceNetwork: 
  - 172.30.0.0/16
platform:
  none: {} 
fips: false 
pullSecret: '{"auths":{"registry.local.jackhww.me:8443": {"auth": "aW5pdDpQQHNzdzByZA=","email": "jack@local.jackhww.me"}}}' 
sshKey: 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINYCby3Sy+QKj2KfdoOpmTylaDADhS9fprW9EIpv4oh6 root@registry.local.jackhww.me' 
additionalTrustBundle: | 
  -----BEGIN CERTIFICATE-----
  MIIFTzCCAzegAwIBAgIUYB69NpcFhD0LNmfNAYw3Tbogz9QwDQYJKoZIhvcNAQEL
  BQAwJDEiMCAGA1UEAwwZcmVnaXN0cnkubG9jYWwuamFja2h3dy5tZTAeFw0yNTA3
  MDEwMjU3MzVaFw0yNjA3MDEwMjU3MzVaMCQxIjAgBgNVBAMMGXJlZ2lzdHJ5Lmxv
  Y2FsLmphY2tod3cubWUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDD
  mnaMatTTDT/IoqYcTN0c1HmdQYTOILhgKTfvy1RFWN3D8evFfFQKKxFsEHzhZ7N3
  2eq3BWcR8aHZrx4TVIa4yXdcg/I6Xtd6EjYPd0QLxERqWaps5vn3HMqBNkykKtCT
  pkWN5LJPYUbzjwU8vjG1zX7LCvcY7wMz+esqxZ7y28wof18vrjj6lrewZkFpMzmQ
  BGE9fAbvxUIxXV1R1sVRevEdWPxGIlj8IaHBwdMiD05rv6evSZ/yRSUa8ObWLG65
  gvla04S2KAwz/fR0tPJDcpeQ7TXvRABSXmFFYhBQQ7SWqNNjT332kNyF+wBXdYmb
  VGqf8a77gFw/gzi2x/9KSN5hwSMWYaR3Sb2cqL+GHlJb90uRPNZh4MvblBJoApBV
  ewTnkoYCKhQxGLh4CJ1jQwMw8Jai7IEp4HsXqKyaE/jVWlB0UjYReh0EevRzVX5T
  FJb8pmt6LYhLFcLPhZ80OyHIpbbmZZAu4mldcW2z8MopCGFfDVxhQQplpMScwVvN
  4eWPBPJC5lmTLEsomXErsWE/h3VaT3J50oYeXVbSZ+NnY+NCu81+My6xsnacLTyy
  39CKIBIi8SwjUWOfvxHm/nJndXVD/dk6X2hILpgi0TGRfXt19rSrksAH+JG8H7cz
  lkUfjFZ6PRpxFC+AkBiKsnY7uZXyLpcP33nUUYmy2wIDAQABo3kwdzAdBgNVHQ4E
  FgQU04aeQe0a3rsrsJEdSvLopr7b3F4wHwYDVR0jBBgwFoAU04aeQe0a3rsrsJEd
  SvLopr7b3F4wDwYDVR0TAQH/BAUwAwEB/zAkBgNVHREEHTAbghlyZWdpc3RyeS5s
  b2NhbC5qYWNraHd3Lm1lMA0GCSqGSIb3DQEBCwUAA4ICAQA+6g7uv7tp3Rd98gkQ
  X6SKfWCV0Qs+6n0h9SFscTNFiqpKyrJWaTuNfTGQcW9FPzJ7q09vT+bpVQKYd6V1
  FIgUl/1IzFPosUW92RlzohAN1PTTzTBieaYtFGk39oTnnXYsA+MGnayqWaISu6Ab
  XYHtGeADLhJ4GoYUyl/fX4zXN7E1Y2qObF5dZv8chYQFQBns+WXp6v/AXPIl7y39
  VjAgNoMch3/vxhXNbrlo0bzj2WcOwv/whvR7AZehRzaqbPfNrDjhmA7EcJD7IEnR
  uV0gqCxdoHyR2O1+qimYGTwISwQiWXv0+fCtpMaovOdfu3t8ICGZCzfeWtrw1Hry
  MPUJyoi1m3rfAq1IMOC0LdViSf4rCVi7Tw04G5HvREP3pTSNy83ip7eLQyN3acpk
  M6Loz7d8+kmKoBeYP8rHBY6qETVo30MHzOIO7o4/pjhwWfdA+EPmF61aoy5FduQt
  q7foh7J4XAP8K07ptOAE2jK+FPhQajXF78RbsXwSmYHH4/x/BuUAlyjpTwsC0N+P
  DRu3g4sKA/B1GQo+8c1mbEDhrlmOMXFjpwyo37OHhmcfSaudZXjb2GjN/YlAfdya
  9volar/xT0RLt1qlGngfcl4nQIml8K0LevYjyai0aP06ltI1mWjsojXnD3KnvghP
  IuZKPtbdfygo82F1VAr/+U1Kkg==
  -----END CERTIFICATE-----
imageContentSources: 
- mirrors:
  - registry.local.jackhww.me:8443/openshift/release-images
  source: quay.io/openshift-release-dev/ocp-release
- mirrors:
  - registry.local.jackhww.me:8443/openshift/release
  source: quay.io/openshift-release-dev/ocp-v4.0-art-dev
- mirrors:
  - registry.local.jackhww.me:8443/nvidia/cloud-native
  source: nvcr.io/nvidia/cloud-native
- mirrors:
  - registry.local.jackhww.me:8443/sig-storage
  source: registry.k8s.io/sig-storage
- mirrors:
  - registry.local.jackhww.me:8443/openshift-serverless-1
  source: registry.redhat.io/openshift-serverless-1
- mirrors:
  - registry.local.jackhww.me:8443/cluster-observability-operator
  source: registry.redhat.io/cluster-observability-operator
- mirrors:
  - registry.local.jackhww.me:8443/rhel8
  source: registry.redhat.io/rhel8
- mirrors:
  - registry.local.jackhww.me:8443/openshift-service-mesh
  source: registry.redhat.io/openshift-service-mesh
- mirrors:
  - registry.local.jackhww.me:8443/nvidia/k8s
  source: nvcr.io/nvidia/k8s
- mirrors:
  - registry.local.jackhww.me:8443/advanced-cluster-security
  source: registry.redhat.io/advanced-cluster-security
- mirrors:
  - registry.local.jackhww.me:8443/compliance
  source: registry.redhat.io/compliance
- mirrors:
  - registry.local.jackhww.me:8443/ubi8
  source: registry.access.redhat.com/ubi8
- mirrors:
  - registry.local.jackhww.me:8443/grafana
  source: ghcr.io/grafana
- mirrors:
  - registry.local.jackhww.me:8443/grafana
  source: docker.io/library/grafana
- mirrors:
  - registry.local.jackhww.me:8443/nutanix
  source: registry.connect.redhat.com/nutanix
- mirrors:
  - registry.local.jackhww.me:8443/nvidia
  source: nvcr.io/nvidia
- mirrors:
  - registry.local.jackhww.me:8443/quay
  source: registry.redhat.io/quay
- mirrors:
  - registry.local.jackhww.me:8443/nvidia
  source: registry.connect.redhat.com/nvidia
- mirrors:
  - registry.local.jackhww.me:8443/openshift4
  source: registry.redhat.io/openshift4
- mirrors:
  - registry.local.jackhww.me:8443/openshift-logging
  source: registry.redhat.io/openshift-logging
- mirrors:
  - registry.local.jackhww.me:8443/community-operator-pipeline-prod
  source: quay.io/community-operator-pipeline-prod

6. Ignition

  1. Create ignition config files from the install-config.yaml:
    ./openshift-install create manifests --dir .
    
    Ignition files will be consumed upon creating the manifests. Make sure to create a backup.
  2. Ensure that Masters are schedulable if doing a 3 Node install - or according to requirements. <installation_directory>/manifests/cluster-scheduler-02-config.yml
  3. Create the ignition files once all is in order:
    ./openshift-install create ignition-configs --dir <installation_directory>
    

7. cronyd

  1. Create a .bu file 99-worker-chrony.bu
    variant: openshift
    version: 4.18.0
    metadata:
      name: 99-master-chrony #Replace with Master if 3 Node 
      labels:
        machineconfiguration.openshift.io/role: worker #Replace with Master if 3 nodes
    storage:
      files:
      - path: /etc/chrony.conf
        mode: 0644 
        overwrite: true
        contents:
          inline: |
            pool 0.rhel.pool.ntp.org iburst 
            driftfile /var/lib/chrony/drift
            makestep 1.0 3
            rtcsync
            logdir /var/log/chrony
    
  2. Specify an octal value mode for theΒ modeΒ field in the machine config file. After creating the file and applying the changes, theΒ modeΒ is converted to a decimal value. You can check the YAML file with the commandΒ oc get mc <mc-name> -o yaml

  3. Generate the .yaml config file

    butane 99-worker-chrony.bu -o 99-worker-chrony.yaml
    

  4. Add it into the <installation_directory>/openshift directory.

8. HTTP Server

  1. Install httpd. If not installed:
    sudo dnf install -y httpd
    
  2. # Change the listening port to 81:
    vi /etc/httpd/conf/httpd.conf 
    
    
    # Listen: Allows you to bind Apache to specific IP addresses and/or                
    # ports, instead of the default. See also the                         
    # directive.
    # Change this to Listen on a specific IP address, but note that if                 
    # httpd.service is enabled to run at boot time, the address may not be             
    # available when the service starts.  See the httpd.service(8) man                 
    # page for more information.                                                       
    #Listen 12.34.56.78:80                                                             
    
    Listen 81 # --> Change to whatever port 
    
  3. Once up, copy the .ign files over to the html serving directory: /var/www/html/ignite
    mkdir /var/www/html/ignite
    cd <installation_dir>/ignite/
    mv *.ign /var/www/html/ignite
    
  4. Ensure you can curl it with another machine:
    curl -v <server>:81/ignite/bootstrap.ign
    
  5. If errored out due to Permission denied:
     sudo chcon -Rt httpd_sys_content_t /var/www/html/ignite
    

9. Bootstrapping

On your bootstrap cluster, ensure the prerequisites: - [ ] Network configured: - [ ] DNS - [ ] Gateway - [ ] Hostname - [ ] Reverse DNS lookup - [ ] IPv6 Disabled (Can cause host to be unreachable if trying to SSH into core@bootstrap. Ping them after rebooting.) - [ ] LB configured: - [ ] Warnings are expected before bootstrapping, but ensure that the service is running and the LB is able to resolve the Masters/Workers - [ ] Complete 1. On the bootstrap CLI:

sudo coreos-installer install /dev/sda --ignition-url http://registry.local.jackhww.me:81/ignition/bootstrap.ign --copy-network --insecure-ignition

  1. On the master CLI:
    sudo coreos-installer install /dev/sda --ignition-url http://registry.local.jackhww.me:81/ignition/master.ign --copy-network --insecure-ignition
    
  2. At this stage, take a snapshot of the machines so that rollback is easier and the commands are saved.
  3. Once done, reboot the machines and ensure it boots to /dev/sda.
    1. To prevent X509 Cert not yet valid/expired errors, make sure to reboot the Master nodes first before the bootstrap node. This ensures that the master's time in case of time desync is always ahead of the bootstrap.
  4. On the Bastion, you can then check the bootstrap process:
    ./openshift-install --dir . wait-for bootstrap-complete --log-level=info
    
  5. On the Bootstrap, you can check the process:
    #On Bastion:
    ssh core@bootstrap.local
    journalctl -b -f -u release-image.service -u bootkube.service
    
  6. Once Kubernetes API is up, you can then copy the kubeconfig to ~/.kube/config.
  7. Wait for the output to tell you that the bootstrap resources can be removed before shutting down the Bootstrap machine.

Post Install

Disabling the internet sources of OperatorHub

oc patch operatorhub cluster \
  --type merge \
  -p '{"spec":{"disableAllDefaultSources":true}}'
apiVersion: operators.coreos.com/v1alpha1
kind: CatalogSource
metadata:
  name: redhat-operators
  namespace: openshift-marketplace
spec:
  sourceType: grpc
  image: registry.local.jackhww.me:8443/olm/redhat-operator-index:v4.18
  displayName: Red Hat Operators (Disconnected)
  publisher: Local Registry
  updateStrategy:
    registryPoll:
      interval: 30m

oc-mirror error

  1. Failing due to:
    error mirroring image registry.redhat.io/ubi9/ubi@sha256:20f695d2a91352d4eaa25107535126727b5945bff38ed36a3e59590f495046f0 error: copying image 1/4 from manifest list: writing blob: uploading layer chunked: StatusCode: 413, "<html>\r\n<head><title>413 Request Entity Too Large<..." error mirroring image docker://docker.io/rocm/device-metrics-exporter@sha256:6c946c6ca10d5c0f40e67b5759759f12d51c45e3b934cb1af912821d5fd76e6e (Operator bundles: [amd-gpu-operator.v1.3.2] - Operators: [amd-gpu-operator]) error: writing blob: uploading layer chunked: StatusCode: 413, "<html>\r\n<head><title>413 Request **Entity Too Large**<..." error mirroring image docker://registry.connect.redhat.com/amd/gpu-operator-v1@sha256:8a92a0d18a5ae6a837ca6590c2beb65d889cd744a098c22d3f01d2fffdc4dc57 error: skipping operator bundle docker://registry.connect.redhat.com/amd/gpu-operator-v1@sha256:8a92a0d18a5ae6a837ca6590c2beb65d889cd744a098c22d3f01d2fffdc4dc57 because one of its related images failed to mirror
    
    1. Fix:
      sudo podman cp quay-app:/quay-registry/conf/nginx/nginx.conf /tmp/nginx.conf
      
      sudo vi /tmp/nginx.conf
      
      # Add the following lines to port 8443 or the guilty port:
      
      client_max_body_size 0;
      proxy_request_buffering off;
      proxy_read_timeout 3600;
      proxy_send_timeout 3600;
      client_body_buffer_size 512k;
      
      sudo podman cp /tmp/nginx.conf quay-app:/quay-registry/conf/nginx/nginx.conf
      
      sudo podman restart quay-app
      

Copy Paste Ignition

Bootstrap

nmcli con mod Wired\ connection\ 1 ipv4.addresses 192.168.1.14/24 ipv4.gateway "192.168.1.10" ipv4.dns "120.1.1.100" ipv4.method manual ipv6.method disabled
nmcli con up Wired\ connection\ 1
sudo hostnamectl hostname discobootstrap.discoshift.mlopslab.ncs
sudo coreos-installer install /dev/vda --ignition-url=http://192.168.1.50:8080/ignite/bootstrap.ign --copy-network --insecure-ignition

Master 01

nmcli con mod Wired\ connection\ 1 ipv4.addresses 192.168.1.11/24 ipv4.gateway "192.168.1.10" ipv4.dns "120.1.1.100" ipv4.method manual ipv6.method disabled
sudo hostnamectl hostname discomaster01.discoshift.mlopslab.ncs
nmcli con up Wired\ connection\ 1 
sudo coreos-installer install /dev/vda --ignition-url=http://192.168.1.50:8080/ignite/master.ign --copy-network --insecure-ignition

Master 02

nmcli con mod Wired\ connection\ 1 ipv4.addresses 192.168.1.12/24 ipv4.gateway "192.168.1.10" ipv4.dns "120.1.1.100" ipv4.method manual ipv6.method disabled

nmcli con up Wired\ connection\ 1 
sudo hostnamectl hostname discomaster02.discoshift.mlopslab.ncs
sudo coreos-installer install /dev/vda --ignition-url=http://192.158.1.50:8080/ignite/master.ign --copy-network --insecure-ignition

Master 03

nmcli con mod Wired\ connection\ 1 ipv4.addresses 192.168.1.13/24 ipv4.gateway "192.168.1.10" ipv4.dns "120.1.1.100" ipv4.method manual ipv6.method disabled
nmcli con up Wired\ connection\ 1 
sudo hostnamectl hostname discomaster03.discoshift.mlopslab.ncs
sudo coreos-installer install /dev/vda --ignition-url=http://192.168.1.50:8080/ignite/master.ign --copy-network --insecure-ignition

Worker Nodes

nmcli con mod Wired\ connection\ 1 ipv4.addresses 192.168.1.15/24 ipv4.gateway "192.168.1.10" ipv4.dns "120.1.1.100" ipv4.method manual ipv6.method disabled
nmcli con up Wired\ connection\ 1 
sudo hostnamectl hostname amd01.discoshift.mlopslab.ncs
sudo coreos-installer install /dev/vda --ignition-url=http://192.168.1.50:8080/ignite/worker.ign --copy-network --insecure-ignition

Draining nodes

oc adm drain <node> \
  --ignore-daemonsets \
  --delete-emptydir-data \
  --force \
oc patch vm discobootstrap  \
  --type=json \
  -p='[
    {
      "op": "add",
      "path": "/spec/template/spec/nodeSelector",
      "value": {
        "kubernetes.io/hostname": "bmgpu-01.ocp.mlopslab.ncs"
      }
    }
  ]'

eno8303 8403

nmcli con mod Wired\ connection\ 1 ipv4.addresses 192.168.1.12/24 ipv4.gateway "192.168.1.10" ipv4.dns "120.1.1.100" ipv4.method manual ipv6.method disabled
nmcli con mod Wired\ connection\ 1 ipv4.addresses 192.168.1.13/24 ipv4.gateway "192.168.1.10" ipv4.dns "120.1.1.100" ipv4.method manual ipv6.method disabled
sudo coreos-installer install /dev/vda --ignition-url=http://120.1.1.120:8080/ignite/worker.ign --copy-network --insecure-ignition
nmcli con mod Wired\ connection\ 1 ipv4.addresses 192.168.1.15/24 ipv4.gateway "192.168.1.10" ipv4.dns "120.1.1.100" ipv4.method manual ipv6.method disabled