Skip to content

Commit

Permalink
Sync kserve raw deployments (#202)
Browse files Browse the repository at this point in the history
* Update Owners and Owwners-aliases (#869)

(cherry picked from commit 7f477a3)

* fix(DSC): do not reconcile resource if it has a special annotation (#879)

* fix(DSC+Kserve): do not reconcile inferenceservice-config for
rawdeployment

Signed-off-by: Wen Zhou <wenzhou@redhat.com>

* fix: wrong logic

Signed-off-by: Wen Zhou <wenzhou@redhat.com>

* feat(deploy): do not set ownerreference if resource has sepcial
annotation to false

Signed-off-by: Wen Zhou <wenzhou@redhat.com>

* update: change logic to --if kind is CRD do not care annotation

* update: change logic

- we still set ownerreference on resources
- we only skip reconcile if resource has defined annotation

Signed-off-by: Wen Zhou <wenzhou@redhat.com>

* fix(typo)

Signed-off-by: Wen Zhou <wenzhou@redhat.com>

* Update: limite scope of annoation to only kserve resource for now

Signed-off-by: Wen Zhou <wenzhou@redhat.com>

---------

Signed-off-by: Wen Zhou <wenzhou@redhat.com>
(cherry picked from commit 20f4ad0)

* fix(feature): use correct error variable name (#882)

(cherry picked from commit 0d8bd14)

* allow setting default deployment mode for Kserve in DSC (#864)

* allow setting default deployment mode for Kserve in DSC

Signed-off-by: Vedant Mahabaleshwarkar <vmahabal@redhat.com>

* move kserve config logic to separate file + enhancements

Signed-off-by: Vedant Mahabaleshwarkar <vmahabal@redhat.com>

* revert dev image set in operator CSV

Signed-off-by: Vedant Mahabaleshwarkar <vmahabal@redhat.com>

* only setup kserve config if component is enabled

Signed-off-by: Vedant Mahabaleshwarkar <vmahabal@redhat.com>

* bug fix

Signed-off-by: Vedant Mahabaleshwarkar <vmahabal@redhat.com>

* address PR feedback

Signed-off-by: Vedant Mahabaleshwarkar <vmahabal@redhat.com>

* cleanup

Signed-off-by: Vedant Mahabaleshwarkar <vmahabal@redhat.com>

* fix lint error

Signed-off-by: Vedant Mahabaleshwarkar <vmahabal@redhat.com>

* set default value for Kserve defaultDeploymentMode to be empty

Signed-off-by: Vedant Mahabaleshwarkar <vmahabal@redhat.com>

* more pr feedback

Signed-off-by: Vedant Mahabaleshwarkar <vmahabal@redhat.com>

* update bundle

Signed-off-by: Vedant Mahabaleshwarkar <vmahabal@redhat.com>

* enhance documentation

Signed-off-by: Vedant Mahabaleshwarkar <vmahabal@redhat.com>

* add readme for dev preview

Signed-off-by: Vedant Mahabaleshwarkar <vmahabal@redhat.com>

---------

Signed-off-by: Vedant Mahabaleshwarkar <vmahabal@redhat.com>
(cherry picked from commit cebd287)

* Update bundle

---------

Co-authored-by: Wen Zhou <wenzhou@redhat.com>
Co-authored-by: Ivan Necas <necasik@gmail.com>
Co-authored-by: Vedant Mahabaleshwarkar <vmahabal@redhat.com>
  • Loading branch information
4 people authored Mar 1, 2024
1 parent 40bb1ef commit ddba9a8
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 ddba9a8

Please sign in to comment.