Red Hat Developer Hub 2.1

Accelerate AI development with OpenShift AI Connector for Red Hat Developer Hub

Installing, configuring, and troubleshooting OpenShift AI Connector for Red Hat Developer Hub

Red Hat Customer Content Services

Abstract

Integrate AI models and model servers discovered from KServe and the Kubeflow Model Catalog directly into the Red Hat Developer Hub (RHDH) Catalog to provide a unified hub for discovering and consuming AI components.

Preface

Integrate AI models and model servers discovered from KServe and the Kubeflow Model Catalog directly into the Red Hat Developer Hub (RHDH) Catalog to provide a unified hub for discovering and consuming AI components.

Chapter 1. How AI assets map to the Red Hat Developer Hub Catalog

Important

This section describes Developer Preview features in the OpenShift AI Connector for Red Hat Developer Hub plugin. Developer Preview features are not supported by Red Hat in any way and are not functionally complete or production-ready. Do not use Developer Preview features for production or business-critical workloads. Developer Preview features provide early access to functionality in advance of possible inclusion in a Red Hat product offering. Customers can use these features to test functionality and provide feedback during the development process. Developer Preview features might not have any documentation, are subject to change or removal at any time, and have received limited testing. Red Hat might provide ways to submit feedback on Developer Preview features without an associated SLA.

For more information about the support scope of Red Hat Developer Preview features, see Developer Preview Support Scope.

The OpenShift AI Connector for Red Hat Developer Hub discovers AI model servers that are deployed as KServe InferenceService and LLMInferenceService resources on your clusters, and converts them and their models into Backstage catalog entities to provide a unified view for developer teams.

The connector is a standalone Backstage backend plugin. It runs inside the main RHDH backend container and communicates directly with the KServe and Kubeflow Model Catalog APIs. It does not require any sidecar containers or bridge services.

The connector watches serving.kserve.io InferenceService and LLMInferenceService resources through a Kubernetes informer, reconciles the resources that are ready, and exposes the discovered model servers and models through authenticated Backstage REST routes. Companion plugins consume these routes to generate AiModelServerAPI catalog entities and to import model cards as TechDocs.

When an InferenceService or LLMInferenceService is annotated to reference a model card in the Kubeflow Model Catalog, the connector fetches that model card and imports it as RHDH TechDocs.

Note

Earlier Developer Preview versions of the connector integrated with the Kubeflow Model Registry. Because Red Hat OpenShift AI has moved away from the Kubeflow Model Registry, the connector no longer integrates with it. Model and model server metadata is now sourced directly from KServe InferenceService resources and the Kubeflow Model Catalog. Migration of data from an earlier Model Registry-based deployment is not provided.

1.1. Model-to-entity mapping

The following table maps the KServe and Kubeflow Model Catalog sources that the connector reads to Backstage entity kinds.

Source artifactRHDH/Backstage entity kindRHDH/Backstage entity typePurpose

Model server (KServe InferenceService or LLMInferenceService)

AiModelServerAPI

ai-model-server

Represents a running, accessible AI model server endpoint that is discovered from a KServe InferenceService or LLMInferenceService resource.

Model (from a KServe InferenceService or LLMInferenceService)

AiModelServerAPI (spec.models)

ai-model-server

Represents an individual model that is served by the model server. Models are listed in the spec.models field of the generated AiModelServerAPI entity.

Model card (Kubeflow Model Catalog)

TechDocs

N/A

Associates a model card from the Kubeflow Model Catalog with the generated entity as RHDH TechDocs. Model cards are imported when the InferenceService or LLMInferenceService is annotated to reference a catalog source and model.

After you install and configure the OpenShift AI Connector for RHDH, the transfer of information from your clusters commences automatically on the configured schedule.

1.2. Data mapping specifications

Review the key data that the connector automatically propagates from KServe and the Kubeflow Model Catalog.

  • KServe InferenceService and LLMInferenceService resources (generated AiModelServerAPI entities):

    • URL of the model server endpoint (spec.serverUrl), discovered from the OpenShift Container Platform Route or the Kubernetes Service.
    • Optional: Model serving protocol or platform type (spec.serverType).
    • Authentication requirement status (spec.requiresApiKey).
    • The models served by the model server (spec.models), including the following optional fields:

      • The default model (spec.models.default).
      • Whether the models are discoverable (spec.models.discoverable), set to true when the /v1/models endpoint returns a list of models.
  • Kubeflow Model Catalog:

    • Model card content, imported as RHDH TechDocs.

The entity owner, lifecycle, and system values are inherited from the RHDH software catalog base entity kind. The connector also applies the owner, lifecycle, and system values that you set through rhdh.io/ annotations on the InferenceService or LLMInferenceService, or through the connector default configuration. For more information, see KServe InferenceService annotations reference.

Chapter 2. Install the OpenShift AI Connector for Red Hat Developer Hub

Install the OpenShift AI Connector for Red Hat Developer Hub as a set of dynamic plugins and grant it the Kubernetes permissions to discover KServe InferenceService and LLMInferenceService resources. The connector runs inside the RHDH backend container and requires no sidecar containers.

Important

This section describes Developer Preview features in the OpenShift AI Connector for Red Hat Developer Hub plugin. Developer Preview features are not supported by Red Hat in any way and are not functionally complete or production-ready. Do not use Developer Preview features for production or business-critical workloads. Developer Preview features provide early access to functionality in advance of possible inclusion in a Red Hat product offering. Customers can use these features to test functionality and provide feedback during the development process. Developer Preview features might not have any documentation, are subject to change or removal at any time, and have received limited testing. Red Hat might provide ways to submit feedback on Developer Preview features without an associated SLA.

For more information about the support scope of Red Hat Developer Preview features, see Developer Preview Support Scope.

Prerequisites

  • You have cluster-admin access to a Kubernetes or OpenShift Container Platform cluster where KServe is installed. The cluster can be a Red Hat OpenShift AI cluster or a generic KServe installation.
  • You have installed KServe and deployed one or more model servers as serving.kserve.io InferenceService or LLMInferenceService resources.
  • To import model cards as TechDocs, the Kubeflow Model Catalog is available on the cluster and your InferenceService or LLMInferenceService resources are annotated to reference their model cards.
  • You have installed the RHDH Operator or Helm chart and can update your dynamic plugin configuration.

Procedure

  1. Configure the Kubernetes role-based access control (RBAC) and credentials that the connector uses to access the cluster.

    The connector requires a Kubernetes ServiceAccount with least-privilege, read-only access to the KServe and OpenShift Container Platform resources that it discovers. Create the following resources, replacing the namespace (ai-rhdh) as needed for your RHDH deployment:

    1. A ServiceAccount for the connector. For example:

      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: rhdh-kserve-kubeflow-connector
        namespace: ai-rhdh
    2. A ClusterRole and ClusterRoleBinding that grant read-only access to InferenceService and LLMInferenceService resources, OpenShift Container Platform Route resources, and ServiceAccount resources. For example:

      # Example ClusterRole
      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRole
      metadata:
        name: rhdh-kserve-kubeflow-connector
      rules:
        - apiGroups: ["serving.kserve.io"]
          resources: ["inferenceservices", "llminferenceservices"]
          verbs: ["get", "list", "watch"]
        - apiGroups: ["route.openshift.io"]
          resources: ["routes"]
          verbs: ["get", "list", "watch"]
        - apiGroups: [""]
          resources: ["serviceaccounts"]
          verbs: ["get", "list", "watch"]
      # Example ClusterRoleBinding
      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRoleBinding
      metadata:
        name: rhdh-kserve-kubeflow-connector
      roleRef:
        apiGroup: rbac.authorization.k8s.io
        kind: ClusterRole
        name: rhdh-kserve-kubeflow-connector
      subjects:
        - kind: ServiceAccount
          name: rhdh-kserve-kubeflow-connector
          namespace: ai-rhdh
      Note

      The connector reads OpenShift Container Platform Route resources only when you do not configure a Kubeflow Model Catalog URL and the connector must discover the route automatically. It reads ServiceAccount resources to detect whether a model server requires authentication.

    3. A Secret of type kubernetes.io/service-account-token for the ServiceAccount. For example:

      apiVersion: v1
      kind: Secret
      metadata:
        name: rhdh-kserve-kubeflow-connector-token
        namespace: ai-rhdh
        annotations:
          kubernetes.io/service-account.name: rhdh-kserve-kubeflow-connector
      type: kubernetes.io/service-account-token
  2. Update your RHDH dynamic plugin configuration to install the connector and its companion plugins.

    In your RHDH dynamic plugins configuration, add the following plugins:

    plugins:
      - disabled: false
        package: oci://ghcr.io/redhat-developer/rhdh-plugin-export-overlays/red-hat-developer-hub-backstage-plugin-kserve-kubeflow-connector-backend:<tag>
      - disabled: false
        package: oci://ghcr.io/redhat-developer/rhdh-plugin-export-overlays/red-hat-developer-hub-backstage-plugin-catalog-backend-module-ai-model-server:<tag>
      - disabled: false
        package: oci://ghcr.io/redhat-developer/rhdh-plugin-export-overlays/red-hat-developer-hub-backstage-plugin-catalog-backend-module-model-catalog:<tag>
      - disabled: false
        package: oci://ghcr.io/redhat-developer/rhdh-plugin-export-overlays/red-hat-developer-hub-backstage-plugin-catalog-techdoc-url-reader-backend:<tag>

    where:

    <tag>
    Enter your RHDH version of Backstage and the plugin version, in the format bs_<backstage-version>__<plugin-version> (note the double underscore delimiter). To find these versions, complete the following steps:
  3. Find your Backstage version in the RHDH release notes preface.
  4. Locate the plugin version in the Dynamic Plugins Reference guide. For example, for a RHDH version based on Backstage <backstage-version>, use the format bs_<backstage-version>__<plugin-version>.

    Tip

    To ensure environment stability, use a SHA256 digest instead of a version tag. See Determining SHA256 Digests.

    where:

    kserve-kubeflow-connector-backend
    The connector backend plugin. It watches KServe InferenceService and LLMInferenceService resources and exposes the REST routes that the other plugins consume.
    catalog-backend-module-ai-model-server
    The catalog module that registers the AiModelServerAPI entity kind so that the catalog accepts the entities that the connector generates.
    catalog-backend-module-model-catalog
    The entity provider that calls the connector REST route and emits AiModelServerAPI catalog entities.
    catalog-techdoc-url-reader-backend
    The TechDocs URL reader that resolves model-card content through the connector for TechDocs generation.
  5. Allow the AiModelServerAPI entity kind in your catalog rules by adding it to your app-config.yaml file:

    catalog:
      rules:
        - allow:
            [
              Component,
              System,
              API,
              AiModelServerAPI,
              Resource,
              Location,
              User,
              Group,
            ]

Next steps

Chapter 3. Configure the OpenShift AI Connector for Red Hat Developer Hub

Configure the OpenShift AI Connector for Red Hat Developer Hub with access to the cluster that hosts your KServe model servers. The connector supports two modes for cluster access: reuse a cluster already configured for the Backstage Kubernetes plugin, or supply the connection details directly.

The connector integrates with the following API versions:

  • KServe serving.kserve.io/v1beta1 InferenceService resources.
  • KServe serving.kserve.io/v1alpha2 LLMInferenceService resources.
  • Kubeflow Model Catalog v1alpha1 model card sources.

Prerequisites

Procedure

  1. Configure cluster access by using one of the following modes.

    • Mode 1: Reuse the Backstage Kubernetes plugin cluster

      If the Backstage Kubernetes plugin is already configured with access to the cluster that hosts KServe, point the connector at that cluster by using the kubernetesPluginRef field. Add the following configuration to your app-config.yaml file:

      kubernetes:
        serviceLocatorMethod:
          type: 'multiTenant'
        clusterLocatorMethods:
          - type: 'config'
            clusters:
              - name: my-k8s-cluster
                url: '${K8S_CLUSTER_URL}'
                serviceAccountToken: '${K8S_SA_TOKEN}'
                authProvider: serviceAccount
                skipTLSVerify: false
                caData: '${K8S_CA_DATA:-}'
      catalog:
        providers:
          modelCatalog:
            kserve-kubeflow-connector:
              cluster-1:
                name: my-k8s-cluster
                kubernetesPluginRef: my-k8s-cluster
                default-owner: '${OWNER:-default-owner}'
                default-lifecycle: '${LIFECYCLE:-production}'

      For more information about configuring cluster access for the Backstage Kubernetes plugin, see the Configuring Red Hat Developer Hub guide.

    • Mode 2: Direct cluster connection

      If the Backstage Kubernetes plugin is not installed, or it does not define the target cluster, supply the connection fields directly on the connector cluster entry. Add the following configuration to your app-config.yaml file:

      catalog:
        providers:
          modelCatalog:
            kserve-kubeflow-connector:
              cluster-1:
                name: my-k8s-cluster
                url: '${K8S_CLUSTER_URL:-}'
                serviceAccountToken: '${K8S_SA_TOKEN:-}'
                skipTLSVerify: false
                caData: '${K8S_CA_DATA:-}'
                default-owner: '${OWNER:-default-owner}'
                default-lifecycle: '${LIFECYCLE:-production}'

    where:

    cluster-1
    A unique key that identifies the cluster entry. You can define multiple cluster entries.
    name
    The display name of the cluster.
    kubernetesPluginRef
    In Mode 1, the name of the cluster that is defined under kubernetes.clusterLocatorMethods.
    url
    In Mode 2, the URL of the cluster API server.
    serviceAccountToken
    In Mode 2, the ServiceAccount token that the connector uses to authenticate to the cluster.
    skipTLSVerify
    Whether to skip TLS verification of the cluster API server certificate. Set this to false in production.
    caData
    The base64-encoded PEM certificate authority (CA) bundle for the cluster API server. For more information, see Configure TLS for the connector.
    default-owner
    The default owner that is applied to generated entities when an InferenceService or LLMInferenceService does not specify an owner.
    default-lifecycle
    The default lifecycle that is applied to generated entities when an InferenceService or LLMInferenceService does not specify a lifecycle.
  2. Optional: To import model cards from the Kubeflow Model Catalog, configure the model catalog URL by adding the kubeflow-model-catalog-url field to the cluster entry:

    catalog:
      providers:
        modelCatalog:
          kserve-kubeflow-connector:
            cluster-1:
              name: my-k8s-cluster
              kubernetesPluginRef: my-k8s-cluster
              default-owner: my-team
              default-lifecycle: production
              kubeflow-model-catalog-url: https://model-catalog.apps.example.com

    where:

    kubeflow-model-catalog-url
    The URL of the Kubeflow Model Catalog service. When you omit this field, the connector attempts to discover the model catalog route automatically on the cluster.

    Verification

    • Restart your RHDH instance and confirm that model servers from your cluster appear in the RHDH Catalog as AiModelServerAPI entities.

3.1. Configure TLS for the connector

When TLS verification is enabled, the connector needs the certificate authority (CA) certificate that signed the cluster API server’s external serving certificate. This CA is not necessarily the one that is mounted inside pods for internal cluster communication.

The connector caData field, like the Backstage Kubernetes plugin, expects a base64-encoded PEM CA bundle. This is the same format as the certificate-authority-data field in a kubeconfig file. For general RHDH TLS configuration in Kubernetes, see the Configuring Red Hat Developer Hub guide.

3.1.1. Clusters with a publicly trusted certificate

If the cluster API server presents a publicly trusted certificate, for example, a cluster that uses a Let’s Encrypt certificate, you do not need to provide caData. The certificate chain is already trusted by the default certificate store. Set skipTLSVerify to false and omit caData:

catalog:
  providers:
    modelCatalog:
      kserve-kubeflow-connector:
        cluster-1:
          name: my-cluster
          url: '${K8S_CLUSTER_URL}'
          serviceAccountToken: '${K8S_SA_TOKEN}'
          skipTLSVerify: false
          # caData is not required when the API server uses a publicly trusted certificate

To confirm that the API server presents a publicly trusted certificate, run the following command and check that the issuer is a public CA:

$ echo | openssl s_client -connect api.my-cluster.example.com:6443 -showcerts 2>/dev/null | openssl x509 -noout -issuer -subject

3.1.2. Clusters with a self-signed or internal CA

If the cluster API server uses a self-signed or internally signed certificate, provide the CA bundle in the caData field:

catalog:
  providers:
    modelCatalog:
      kserve-kubeflow-connector:
        cluster-1:
          name: my-cluster
          url: '${K8S_CLUSTER_URL}'
          serviceAccountToken: '${K8S_SA_TOKEN}'
          skipTLSVerify: false
          caData: '${K8S_CA_DATA}' # base64-encoded PEM CA bundle

You can obtain the base64-encoded CA bundle in several ways:

  • From a kubeconfig file, extract the certificate-authority-data value, which is already base64-encoded:

    $ oc config view --raw -o jsonpath='{.clusters[?(@.name=="<cluster-name>")].cluster.certificate-authority-data}'
  • From the cluster CA config map, when you are already logged in:

    $ oc get configmap kube-root-ca.crt -n openshift-config -o jsonpath='{.data.ca\.crt}' | base64 -w0
  • From the API server directly, when you have network access:

    $ echo | openssl s_client -connect api.my-cluster.example.com:6443 -showcerts 2>/dev/null | awk '/BEGIN CERT/,/END CERT/' | base64 -w0

3.1.3. Skip TLS verification for development clusters

For a local development cluster, you can skip TLS verification instead of providing caData:

catalog:
  providers:
    modelCatalog:
      kserve-kubeflow-connector:
        cluster-1:
          name: my-dev-cluster
          url: '${K8S_CLUSTER_URL}'
          serviceAccountToken: '${K8S_SA_TOKEN}'
          skipTLSVerify: true
          # caData is not required when TLS verification is skipped
Important

The skipTLSVerify field applies only to the Kubernetes API calls that the connector makes through the Kubernetes client, such as the InferenceService and LLMInferenceService informers. Calls that fetch model cards from the Kubeflow Model Catalog route perform their own TLS validation and ignore skipTLSVerify. To make the connector trust a self-signed CA for all of its HTTPS calls, set the NODE_EXTRA_CA_CERTS environment variable on the RHDH backend container to the path of the CA PEM bundle. Do not disable TLS verification for all calls in production.

Chapter 4. KServe InferenceService annotations

The connector reads rhdh.io/ annotations from KServe InferenceService and LLMInferenceService resources to control how it builds the generated AiModelServerAPI catalog entities and associates Kubeflow Model Catalog model cards. The same set of annotations applies to both resource kinds.

4.1. Annotations that control entity generation

Use the following annotations to adjust how the model server metadata is built when the connector imports an InferenceService or LLMInferenceService into the catalog.

AnnotationEntity field populatedDescription

rhdh.io/system

spec.system

Links the generated entity to a parent Backstage System entity.

rhdh.io/serverType

spec.serverType

Overrides the detected model serving protocol or platform type, for example, openai-v1 or grpc.

rhdh.io/owner

spec.owner

Overrides the entity owner. When omitted, the connector uses the configured default-owner.

rhdh.io/lifecycle

spec.lifecycle

Overrides the entity lifecycle, for example, production or experimental. When omitted, the connector uses the configured default-lifecycle.

rhdh.io/default

spec.models

Sets the default model for the model server.

rhdh.io/model-*

spec.models

Creates multiple model objects from a single InferenceService. Add one annotation for each model that the server exposes.

rhdh.io/api-entity-ref

spec.apiEntityRef

References a separate Backstage API entity that holds the OpenAPI specification for the model server. The connector copies this reference into the generated entity so that the Definition tab can render the API documentation. For more information, see Populate the API Definition tab in RHDH API entities.

4.2. Annotations that associate a model card

To import a model card from the Kubeflow Model Catalog as RHDH TechDocs, annotate the InferenceService or LLMInferenceService with the catalog source and model that identify the model card. When both annotations are present, the connector fetches the model card and makes it available for TechDocs generation.

AnnotationDescription

rhdh.io/catalog-source

Identifies the Kubeflow Model Catalog source that contains the model card.

rhdh.io/catalog-model

Identifies the model within the catalog source whose model card is imported.

4.3. Example annotated InferenceService

The following example shows an InferenceService that sets the owner, lifecycle, and server type, and references a model card in the Kubeflow Model Catalog:

apiVersion: serving.kserve.io/v1beta1
kind: InferenceService
metadata:
  name: my-model-server
  namespace: my-models
  annotations:
    rhdh.io/owner: my-team
    rhdh.io/lifecycle: production
    rhdh.io/serverType: openai-v1
    rhdh.io/catalog-source: my-catalog-source
    rhdh.io/catalog-model: my-model
spec:
  predictor:
    model:
      modelFormat:
        name: pytorch

To apply the same annotations to an LLMInferenceService, use the serving.kserve.io/v1alpha2 API version and the LLMInferenceService kind:

apiVersion: serving.kserve.io/v1alpha2
kind: LLMInferenceService
metadata:
  name: my-model-server
  namespace: my-models
  annotations:
    rhdh.io/owner: my-team
    rhdh.io/lifecycle: production
    rhdh.io/serverType: openai-v1
    rhdh.io/catalog-source: my-catalog-source
    rhdh.io/catalog-model: my-model

Chapter 5. Populate the API Definition tab in API entities

To render interactive API documentation in the Definition tab of an AiModelServerAPI entity, store its OpenAPI specification as a separate API entity and reference it in your KServe InferenceService or LLMInferenceService resource.

Important

This section describes Developer Preview features in the OpenShift AI Connector for Red Hat Developer Hub plugin. Developer Preview features are not supported by Red Hat in any way and are not functionally complete or production-ready. Do not use Developer Preview features for production or business-critical workloads. Developer Preview features provide early access to functionality in advance of possible inclusion in a Red Hat product offering. Customers can use these features to test functionality and provide feedback during the development process. Developer Preview features might not have any documentation, are subject to change or removal at any time, and have received limited testing. Red Hat might provide ways to submit feedback on Developer Preview features without an associated SLA.

For more information about the support scope of Red Hat Developer Preview features, see Developer Preview Support Scope.

The KServe InferenceService and LLMInferenceService resources do not expose the OpenAPI specification of a model server, so the connector cannot populate the Definition tab of the generated AiModelServerAPI entity automatically. To provide this information, store the OpenAPI specification as a separate Backstage API entity, import it into the RHDH Catalog, and reference it from the InferenceService or LLMInferenceService. The connector then copies the reference into the spec.apiEntityRef field of the generated entity, and the Definition tab renders the interactive API documentation.

Prerequisites

  • You have installed and configured the OpenShift AI Connector for RHDH.
  • You have a running AI model server with an accessible endpoint.
  • You have a Git repository that RHDH can read as a catalog location.

Procedure

  1. Retrieve the OpenAPI specification from the running endpoint of the model server. Use a tool such as curl to fetch the specification from the /openapi.json path, and include a Bearer token if the model requires authentication:

    $ curl -k -H "Authorization: Bearer $MODEL_API_KEY" https://$MODEL_ROOT_URL_INCLUDING_PORT/openapi.json | jq > open-api.json
  2. Define a Backstage API entity that embeds the OpenAPI specification, and store it in a catalog-info.yaml file in your Git repository. Set the spec.definition field to the contents of the open-api.json file:

    apiVersion: backstage.io/v1alpha1
    kind: API
    metadata:
      name: my-model-api
      description: OpenAPI specification for my model server
    spec:
      type: openapi
      lifecycle: production
      owner: my-team
      definition: |
        <contents of open-api.json>
  3. Import the catalog-info.yaml file into the RHDH Catalog as a location so that the API entity is registered. For more information about registering catalog locations, see the Configuring Red Hat Developer Hub guide.
  4. Annotate the InferenceService or LLMInferenceService for the model server with the rhdh.io/api-entity-ref annotation, and set its value to the entity reference of the API entity that you registered:

    apiVersion: serving.kserve.io/v1beta1
    kind: InferenceService
    metadata:
      name: my-model-server
      namespace: my-models
      annotations:
        rhdh.io/api-entity-ref: api:default/my-model-api
    spec:
      predictor:
        model:
          modelFormat:
            name: pytorch

Verification

  1. Restart your RHDH instance, or wait for the connector to run on its configured schedule.
  2. In the RHDH Catalog, open the generated AiModelServerAPI entity for the model server.
  3. Confirm that the Definition tab displays the interactive API documentation from the referenced API entity.

Chapter 6. Transition from the sidecar connector

Earlier Developer Preview versions of the connector used a sidecar-based architecture that integrated with the Kubeflow Model Registry. The OpenShift AI Connector for Red Hat Developer Hub replaces this with a standalone backend plugin. Remove the old sidecar configuration and add the new plugin configuration.

Important

This section describes Developer Preview features in the OpenShift AI Connector for Red Hat Developer Hub plugin. Developer Preview features are not supported by Red Hat in any way and are not functionally complete or production-ready. Do not use Developer Preview features for production or business-critical workloads. Developer Preview features provide early access to functionality in advance of possible inclusion in a Red Hat product offering. Customers can use these features to test functionality and provide feedback during the development process. Developer Preview features might not have any documentation, are subject to change or removal at any time, and have received limited testing. Red Hat might provide ways to submit feedback on Developer Preview features without an associated SLA.

For more information about the support scope of Red Hat Developer Preview features, see Developer Preview Support Scope.

The previous sidecar-based deployment ran three containers (location, storage-rest, and rhoai-normalizer) alongside the RHDH backend container. The standalone connector runs inside the RHDH backend container instead.

Important
  • Migration of data from the sidecar-based deployment is not provided. After you install the standalone connector, it rediscovers your model servers directly from KServe InferenceService resources.
  • The earlier sidecar containers did not process LLMInferenceService resources, so no data is available to migrate for them.
  • Any data that was cached by the previous deployment, such as the bac-import-model config map, is not reused. The standalone connector does not remove the Component, Resource, and API catalog entities that the earlier sidecar-based deployment created. To clean up these stale entities, use the RHDH console to unregister or delete them from the Catalog.

Prerequisites

  • You have cluster-admin access to the cluster where the sidecar-based connector was deployed.

Procedure

  1. Remove the location, storage-rest, and rhoai-normalizer sidecar containers from your RHDH deployment:

    1. If you installed RHDH by using the Operator, remove the sidecar containers from your RHDH custom resource (CR).
    2. If you installed RHDH by using the Helm chart, remove the sidecar containers from the Deployment specification.
  2. Remove the configuration that was specific to the sidecar deployment:

    1. The provider configuration that pointed to the local sidecar, for example, the modelCatalog provider with baseUrl: http://localhost:9090.
    2. The sidecar-specific ServiceAccount, ClusterRole, ClusterRoleBinding, Role, RoleBinding, and token Secret.
    3. The RoleBinding in the Kubeflow Model Registry namespace that granted the connector read access to the model registry.
    4. The bac-import-model config map that cached the model metadata.
  3. Install the standalone connector and its companion plugins, and create the new Kubernetes RBAC resources. For more information, see Install the OpenShift AI Connector for Red Hat Developer Hub.
  4. Add the new connector configuration, including the cluster access mode and, optionally, the Kubeflow Model Catalog URL. For more information, see Configure the OpenShift AI Connector for Red Hat Developer Hub.

Verification

  • Restart your RHDH instance and confirm that your model servers appear in the RHDH Catalog as AiModelServerAPI entities, and that no sidecar containers remain in the RHDH pod.

Chapter 7. Troubleshoot connector functionality

The OpenShift AI Connector for Red Hat Developer Hub runs as a set of dynamic plugins inside the RHDH backend container. To diagnose connector issues, verify that the plugins are installed and inspect the plugin logs in the backstage-backend container.

The actual contents of the diagnostic data are not part of any product guaranteed specification, and can change at any time.

7.1. Verify dynamic plugin status

Validate that the connector dynamic plugins are successfully installed into your RHDH pod by using the following command:

$ oc logs -c install-dynamic-plugins deployment/<your RHDH deployment>

In the install-dynamic-plugins logs, check that the following plugins installed successfully:

  • red-hat-developer-hub-backstage-plugin-kserve-kubeflow-connector-backend
  • red-hat-developer-hub-backstage-plugin-catalog-backend-module-ai-model-server
  • red-hat-developer-hub-backstage-plugin-catalog-backend-module-model-catalog
  • red-hat-developer-hub-backstage-plugin-catalog-techdoc-url-reader-backend

7.2. Inspect plugin logs

View the connector plugin logs in the backstage-backend container. The connector backend logs under the kserve-kubeflow-connector logger service name, so you can filter the container logs on that name to isolate connector activity. Look for messages that indicate the connector is watching KServe InferenceService and LLMInferenceService resources and that the entity provider is discovering model servers.

To enable debug logging, set the LOG_LEVEL environment variable to debug on the backstage-backend container. For more information, see Monitoring and logging.

7.3. Verify connector REST routes

The connector mounts its REST routes under the /api/kserve-kubeflow-connector/ path prefix in the RHDH backend. To call a route directly with curl or to find it in the backend logs, prepend https://<rhdh-host>/api/kserve-kubeflow-connector/ to the route path.

The connector exposes the following Backstage-authenticated REST routes that the companion plugins consume:

  • GET /api/kserve-kubeflow-connector/list returns all discovered model servers and models.
  • GET /api/kserve-kubeflow-connector/models/<model>/<version> returns metadata for a specific model version.
  • GET /api/kserve-kubeflow-connector/modelcard/<sourceId>/<path> returns the model-card Markdown for TechDocs generation.

For example, the catalog-techdoc-url-reader-backend plugin retrieves model-card content by querying the backstage.io/techdocs-ref URL on each AiModelServerAPI entity, such as http://localhost:7007/api/kserve-kubeflow-connector/modelcard/redhat_ai_validated_models/RedHatAI/Llama-3.1-8B-Instruct.

If model servers do not appear in the catalog, confirm the following:

  • The ServiceAccount that the connector uses has get, list, and watch permissions on serving.kserve.io InferenceService and LLMInferenceService resources.
  • The cluster connection is configured correctly, including the url, serviceAccountToken, and TLS fields.
  • The AiModelServerAPI kind is allowed in your catalog rules.

If model cards do not appear as TechDocs, confirm that the InferenceService or LLMInferenceService resources are annotated with rhdh.io/catalog-source and rhdh.io/catalog-model, and that the Kubeflow Model Catalog URL is reachable from the RHDH backend.

7.4. Query the Kubeflow Model Catalog

To access the same Kubeflow Model Catalog data as the connector, use curl to query the model catalog API directly. Confirm that the ServiceAccount token has the correct access, and export the model catalog URL as RHOAI_MODEL_CATALOG_URL before you run the following commands.

  • Fetch the catalog sources:

    $ curl -k -H "Authorization: Bearer $TOKEN" $RHOAI_MODEL_CATALOG_URL/api/model_catalog/v1alpha1/sources | jq
  • Fetch the available models:

    $ curl -k -H "Authorization: Bearer $TOKEN" $RHOAI_MODEL_CATALOG_URL/api/model_catalog/v1alpha1/models?pageSize=200 | jq
    Note

    The pageSize query parameter is required to retrieve more than the default page of results, which returns approximately 10 models. Set pageSize to a value large enough to return all of your models. The total number of available models is reported in the size field at the end of the jq output. If the size value equals your pageSize value, increase pageSize and run the query again to confirm that you retrieved every model.

Legal Notice

Copyright © 2026 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.