Skip to content

Commit

Permalink
Merge pull request #203 from VaishnaviHire/raw_dep_kserve_2.8
Browse files Browse the repository at this point in the history
[rhoai-2.8] RawDeployment of Kserve
  • Loading branch information
VaishnaviHire authored Feb 27, 2024
2 parents 856bdb6 + 32cadf2 commit c46c8a9
Show file tree
Hide file tree
Showing 13 changed files with 316 additions and 70 deletions.
16 changes: 12 additions & 4 deletions OWNERS
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
approvers:
- etirelli
- VaishnaviHire
- platform
reviewers:
- etirelli
- VaishnaviHire
- platform
- serving
- ide
- dashboard
- datasciencepipelines
- modelregistry
- servicemesh
- distributedworkloads
- aiexplainability


41 changes: 41 additions & 0 deletions OWNERS_ALIASES
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
aliases:
platform:
- AjayJagan
- ajaypratap003
- asanzgom
- etirelli
- LaVLaS
- mattmahoneyrh
- VaishnaviHire
- ykaliuta
- zdtsw
aiexplainability:
- RobGeada
- ruivieira
dashboard:
- andrewballantyne
- lucferbux
datasciencepipelines:
- gmfrasca
- HumairAK
distributedworkloads:
- astefanutti
- dimakis
ide:
- atheo89
- harshad16
modelregistry:
- dhirajsb
- rareddy
- tarilabs
servicemesh:
- aslakknutsen
- bartoszmajsak
- cam-garrison
serving:
- israel-hdez
- VedantMahabaleshwarkar




Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,18 @@ spec:
before enable component Does not support enabled ModelMeshServing
at the same time
properties:
defaultDeploymentMode:
description: Configures the default deployment mode for Kserve.
This can be set to 'Serverless' or 'RawDeployment'. The
value specified in this field will be used to set the default
deployment mode in the 'inferenceservice-config' configmap
for Kserve If no default deployment mode is specified, Kserve
will use Serverless mode
enum:
- Serverless
- RawDeployment
pattern: ^(Serverless|RawDeployment)$
type: string
devFlags:
description: Add developer fields
properties:
Expand Down
1 change: 1 addition & 0 deletions bundle/manifests/rhods-operator.clusterserviceversion.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -594,6 +594,7 @@ spec:
- get
- list
- patch
- update
- watch
- apiGroups:
- ""
Expand Down
90 changes: 26 additions & 64 deletions components/kserve/kserve.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import (
"path/filepath"
"strings"

"github.com/hashicorp/go-multierror"
operatorv1 "github.com/openshift/api/operator/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/rest"
Expand All @@ -18,7 +17,6 @@ import (
infrav1 "github.com/opendatahub-io/opendatahub-operator/v2/infrastructure/v1"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/cluster"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/deploy"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/feature"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/monitoring"
)

Expand All @@ -34,13 +32,28 @@ var (
// Verifies that Kserve implements ComponentInterface.
var _ components.ComponentInterface = (*Kserve)(nil)

// +kubebuilder:validation:Pattern=`^(Serverless|RawDeployment)$`
type DefaultDeploymentMode string

var (
// Serverless will be used as the default deployment mode for Kserve. This requires Serverless and ServiceMesh operators configured as dependencies.
Serverless DefaultDeploymentMode = "Serverless"
// RawDeployment will be used as the default deployment mode for Kserve.
RawDeployment DefaultDeploymentMode = "RawDeployment"
)

// Kserve struct holds the configuration for the Kserve component.
// +kubebuilder:object:generate=true
type Kserve struct {
components.Component `json:""`
// Serving configures the KNative-Serving stack used for model serving. A Service
// Mesh (Istio) is prerequisite, since it is used as networking layer.
Serving infrav1.ServingSpec `json:"serving,omitempty"`
// Configures the default deployment mode for Kserve. This can be set to 'Serverless' or 'RawDeployment'.
// The value specified in this field will be used to set the default deployment mode in the 'inferenceservice-config' configmap for Kserve
// If no default deployment mode is specified, Kserve will use Serverless mode
// +kubebuilder:validation:Enum=Serverless;RawDeployment
DefaultDeploymentMode DefaultDeploymentMode `json:"defaultDeploymentMode,omitempty"`
}

func (k *Kserve) OverrideManifests(_ string) error {
Expand Down Expand Up @@ -101,17 +114,17 @@ func (k *Kserve) ReconcileComponent(ctx context.Context, cli client.Client, resC
return err
}
} else {
// Configure dependencies
if err := k.configureServerless(cli, dscispec); err != nil {
return err
}
if k.DevFlags != nil {
// Download manifests and update paths
if err = k.OverrideManifests(string(platform)); err != nil {
return err
}
}

if err := k.configureServerless(cli, dscispec); err != nil {
return err
}

// Update image parameters only when we do not have customized manifests set
if (dscispec.DevFlags == nil || dscispec.DevFlags.ManifestsUri == "") && (k.DevFlags == nil || len(k.DevFlags.Manifests) == 0) {
if err := deploy.ApplyParams(Path, k.SetImageParamsMap(imageParamMap), false); err != nil {
Expand All @@ -124,6 +137,12 @@ func (k *Kserve) ReconcileComponent(ctx context.Context, cli client.Client, resC
return err
}

if enabled {
if err := k.setupKserveConfig(ctx, cli, dscispec); err != nil {
return err
}
}

// For odh-model-controller
if enabled {
if err := cluster.UpdatePodSecurityRolebinding(cli, dscispec.ApplicationsNamespace, "odh-model-controller"); err != nil {
Expand All @@ -143,6 +162,7 @@ func (k *Kserve) ReconcileComponent(ctx context.Context, cli client.Client, resC
return err
}
}

// CloudService Monitoring handling
if platform == deploy.ManagedRhods {
if enabled {
Expand All @@ -163,61 +183,3 @@ func (k *Kserve) ReconcileComponent(ctx context.Context, cli client.Client, resC
func (k *Kserve) Cleanup(_ client.Client, instance *dsciv1.DSCInitializationSpec) error {
return k.removeServerlessFeatures(instance)
}

func (k *Kserve) configureServerless(cli client.Client, instance *dsciv1.DSCInitializationSpec) error {
switch k.Serving.ManagementState {
case operatorv1.Unmanaged: // Bring your own CR
fmt.Println("Serverless CR is not configured by the operator, we won't do anything")

case operatorv1.Removed: // we remove serving CR
fmt.Println("existing Serverless CR (owned by operator) will be removed")
if err := k.removeServerlessFeatures(instance); err != nil {
return err
}

case operatorv1.Managed: // standard workflow to create CR
switch instance.ServiceMesh.ManagementState {
case operatorv1.Unmanaged, operatorv1.Removed:
return fmt.Errorf("ServiceMesh is need to set to 'Managed' in DSCI CR, it is required by KServe serving field")
}

// check on dependent operators if all installed in cluster
dependOpsErrors := checkDependentOperators(cli).ErrorOrNil()
if dependOpsErrors != nil {
return dependOpsErrors
}

serverlessFeatures := feature.ComponentFeaturesHandler(k, instance, k.configureServerlessFeatures())

if err := serverlessFeatures.Apply(); err != nil {
return err
}
}
return nil
}

func (k *Kserve) removeServerlessFeatures(instance *dsciv1.DSCInitializationSpec) error {
serverlessFeatures := feature.ComponentFeaturesHandler(k, instance, k.configureServerlessFeatures())

return serverlessFeatures.Delete()
}

func checkDependentOperators(cli client.Client) *multierror.Error {
var multiErr *multierror.Error

if found, err := deploy.OperatorExists(cli, ServiceMeshOperator); err != nil {
multiErr = multierror.Append(multiErr, err)
} else if !found {
err = fmt.Errorf("operator %s not found. Please install the operator before enabling %s component",
ServiceMeshOperator, ComponentName)
multiErr = multierror.Append(multiErr, err)
}
if found, err := deploy.OperatorExists(cli, ServerlessOperator); err != nil {
multiErr = multierror.Append(multiErr, err)
} else if !found {
err = fmt.Errorf("operator %s not found. Please install the operator before enabling %s component",
ServerlessOperator, ComponentName)
multiErr = multierror.Append(multiErr, err)
}
return multiErr
}
Loading

0 comments on commit c46c8a9

Please sign in to comment.