Skip to content

Commit 4ef1797

Browse files
committed
Add comments and logs for checking kserve deployment mode
Signed-off-by: Xieshen Zhang <xiezhang@redhat.com>
1 parent 2d26127 commit 4ef1797

File tree

5 files changed

+56
-21
lines changed

5 files changed

+56
-21
lines changed

internal/controller/platform/kserve/nimservice_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -410,10 +410,10 @@ var _ = Describe("NIMServiceReconciler for a KServe platform", func() {
410410

411411
kserveDeployment := &appsv1.Deployment{
412412
ObjectMeta: metav1.ObjectMeta{
413-
Name: "kserve-controller-manager",
413+
Name: utils.KServeControllerName,
414414
Namespace: "default",
415415
Labels: map[string]string{
416-
"app.kubernetes.io/name": "kserve-controller-manager",
416+
"app.kubernetes.io/name": utils.KServeControllerName,
417417
},
418418
},
419419
Spec: appsv1.DeploymentSpec{
@@ -507,7 +507,7 @@ var _ = Describe("NIMServiceReconciler for a KServe platform", func() {
507507
By("delete the KServe Deployment")
508508
kserveDeployment := &appsv1.Deployment{
509509
ObjectMeta: metav1.ObjectMeta{
510-
Name: "kserve-controller-manager",
510+
Name: utils.KServeControllerName,
511511
Namespace: "default",
512512
},
513513
}

internal/utils/kserve.go

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ import (
3131
k8serrors "k8s.io/apimachinery/pkg/api/errors"
3232
"k8s.io/apimachinery/pkg/types"
3333
"sigs.k8s.io/controller-runtime/pkg/client"
34+
"sigs.k8s.io/controller-runtime/pkg/log"
35+
)
36+
37+
const (
38+
KServeControllerName = "kserve-controller-manager"
3439
)
3540

3641
func IsKServeStandardDeploymentMode(deploymentMode kserveconstants.DeploymentModeType) bool {
@@ -43,6 +48,8 @@ func IsKServeKnativeDeploymentMode(deploymentMode kserveconstants.DeploymentMode
4348

4449
func GetKServeDeploymentMode(ctx context.Context, k8sClient client.Client,
4550
podAnnotations map[string]string, isvcNamespacedName *types.NamespacedName) (kserveconstants.DeploymentModeType, error) {
51+
logger := log.FromContext(ctx).WithName("KServe").WithName("Deployment Mode")
52+
4653
var annotations map[string]string
4754
var deployConfig *kservev1beta1.DeployConfig
4855
var statusDeploymentMode string
@@ -74,6 +81,9 @@ func GetKServeDeploymentMode(ctx context.Context, k8sClient client.Client,
7481
if err != nil {
7582
return "", err
7683
}
84+
} else {
85+
logger.V(1).Info("ConfigMap inferenceservice-config is not found in the cluster, skipping the " +
86+
"default deployment mode check from the ConfigMap")
7787
}
7888

7989
// Try to get the deployment mode from the InferenceService status if it exists.
@@ -87,15 +97,21 @@ func GetKServeDeploymentMode(ctx context.Context, k8sClient client.Client,
8797
if !k8serrors.IsNotFound(err) {
8898
return "", err
8999
}
100+
logger.V(1).Info("InferenceService not found, deployment mode from status is not available",
101+
"InferenceService", isvcNamespacedName.String())
90102
} else {
91103
statusDeploymentMode = isvc.Status.DeploymentMode
92104
}
105+
} else {
106+
logger.V(1).Info("InferenceService name is not set, skipping deployment mode check from InferenceService status")
93107
}
94108
} else {
109+
logger.V(1).Info("k8sClient is nil, skipping default deployment mode retrieval from the inferenceservice-config ConfigMap, " +
110+
"skipping deployment mode check from InferenceService status, using the annotations only")
95111
annotations = podAnnotations
96112
}
97113

98-
deploymentMode := getDeploymentMode(statusDeploymentMode, annotations, deployConfig)
114+
deploymentMode := getDeploymentMode(ctx, statusDeploymentMode, annotations, deployConfig)
99115
return deploymentMode, nil
100116
}
101117

@@ -113,10 +129,14 @@ case 2: serving.kserve.org/deploymentMode is set
113129
ODH 3.0 supports "RawDeployment", "Serverless", and doesn't accept "Standard", "Knative"
114130
Ref: https://github.com/opendatahub-io/kserve/blob/cf2920b4276d97fc2d2d700efe4879749a56b418/pkg/controller/v1beta1/inferenceservice/utils/utils.go#L220
115131
*/
116-
func getDeploymentMode(statusDeploymentMode string, annotations map[string]string,
132+
func getDeploymentMode(ctx context.Context, statusDeploymentMode string, annotations map[string]string,
117133
deployConfig *kservev1beta1.DeployConfig) kserveconstants.DeploymentModeType {
134+
logger := log.FromContext(ctx).WithName("KServe").WithName("Deployment Mode")
135+
118136
// First priority is the deploymentMode recorded in the status
119137
if len(statusDeploymentMode) != 0 {
138+
logger.Info("using deployment mode from InferenceService status",
139+
"Deployment Mode", statusDeploymentMode)
120140
return kserveconstants.DeploymentModeType(statusDeploymentMode)
121141
}
122142

@@ -132,16 +152,30 @@ func getDeploymentMode(statusDeploymentMode string, annotations map[string]strin
132152
deploymentMode == string(kserveconstants.ModelMeshDeployment) ||
133153
deploymentMode == string(kserveconstants.LegacyRawDeployment) ||
134154
deploymentMode == string(kserveconstants.LegacyServerless)) {
155+
logger.Info("using deployment mode from annotations",
156+
"Deployment Mode", deploymentMode)
135157
return kserveconstants.DeploymentModeType(deploymentMode)
136158
}
159+
160+
if ok {
161+
logger.V(1).Info("warning: deployment mode annotation found but value is invalid",
162+
"Deployment Mode", deploymentMode)
163+
} else {
164+
logger.V(1).Info("warning: deployment mode annotation not found in annotations")
165+
}
137166
}
138167

139168
if deployConfig != nil {
140169
// Finally, if an InferenceService is being created and does not explicitly specify a DeploymentMode
170+
logger.Info("using the default deployment mode from the inferenceservice-config ConfigMap",
171+
"Deployment Mode", deployConfig.DefaultDeploymentMode)
141172
return kserveconstants.DeploymentModeType(deployConfig.DefaultDeploymentMode)
142173
}
143174

144175
// If InferenceServicesConfig doesn't exist, use the default deployment mode
176+
// For ODH, InferenceServicesConfig is always bundled, and this line should not be reached
177+
logger.Info("deployment mode is not found in any configurations, using default deployment mode",
178+
"Deployment Mode", kserveconstants.DefaultDeployment)
145179
return kserveconstants.DefaultDeployment
146180
}
147181

@@ -183,12 +217,13 @@ func newDeployConfig(isvcConfigMap *corev1.ConfigMap) (*kservev1beta1.DeployConf
183217

184218
func getISVCConfigMap(ctx context.Context, k8sClient client.Client) (*corev1.ConfigMap, error) {
185219
var namespace string
220+
// Find the namespace of the KServe controller
186221
deploymentList := &appsv1.DeploymentList{}
187-
if err := k8sClient.List(ctx, deploymentList, client.HasLabels{"app.kubernetes.io/name: kserve-controller-manager"}); err != nil {
222+
if err := k8sClient.List(ctx, deploymentList, client.MatchingLabels{"app.kubernetes.io/name": KServeControllerName}); err != nil {
188223
return nil, err
189224
}
190225
for _, deployment := range deploymentList.Items {
191-
if deployment.GetName() == "kserve-controller-manager" {
226+
if deployment.GetName() == KServeControllerName {
192227
namespace = deployment.Namespace
193228
break
194229
}
@@ -198,6 +233,7 @@ func getISVCConfigMap(ctx context.Context, k8sClient client.Client) (*corev1.Con
198233
return nil, fmt.Errorf("failed to find the namespace of KServe Deployment")
199234
}
200235

236+
// Get the inferenceservice-config ConfigMap in the namespace
201237
isvcConfigMap := &corev1.ConfigMap{}
202238
err := k8sClient.Get(ctx,
203239
types.NamespacedName{

internal/utils/kserve_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,10 @@ var _ = Describe("KServe Utilities", func() {
5454
createKServeDeployment := func() *appsv1.Deployment {
5555
return &appsv1.Deployment{
5656
ObjectMeta: metav1.ObjectMeta{
57-
Name: "kserve-controller-manager",
57+
Name: KServeControllerName,
5858
Namespace: namespace,
5959
Labels: map[string]string{
60-
"app.kubernetes.io/name": "kserve-controller-manager",
60+
"app.kubernetes.io/name": KServeControllerName,
6161
},
6262
},
6363
Spec: appsv1.DeploymentSpec{
@@ -101,10 +101,10 @@ var _ = Describe("KServe Utilities", func() {
101101

102102
kserveDeployment = &appsv1.Deployment{
103103
ObjectMeta: metav1.ObjectMeta{
104-
Name: "kserve-controller-manager",
104+
Name: KServeControllerName,
105105
Namespace: namespace,
106106
Labels: map[string]string{
107-
"app.kubernetes.io/name": "kserve-controller-manager",
107+
"app.kubernetes.io/name": KServeControllerName,
108108
},
109109
},
110110
Spec: appsv1.DeploymentSpec{

internal/webhook/apps/v1alpha1/nimservice_webhook.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,7 @@ func (v *NIMServiceCustomValidator) ValidateCreate(_ context.Context, obj runtim
100100
fldPath := field.NewPath("nimservice").Child("spec")
101101

102102
// Perform comprehensive spec validation via helper.
103-
namespacedName := client.ObjectKeyFromObject(nimservice)
104-
warningList, errList := validateNIMServiceSpec(&nimservice.Spec, fldPath, v.k8sVersion, v.k8sClient, &namespacedName)
103+
warningList, errList := validateNIMServiceSpec(nimservice, fldPath, v.k8sVersion, v.k8sClient)
105104

106105
if len(errList) > 0 {
107106
return warningList, errList.ToAggregate()
@@ -123,9 +122,8 @@ func (v *NIMServiceCustomValidator) ValidateUpdate(_ context.Context, oldObj, ne
123122
nimservicelog.V(4).Info("Validation for NIMService upon update", "name", newNIMService.GetName())
124123

125124
fldPath := field.NewPath("nimservice").Child("spec")
126-
namespacedName := client.ObjectKeyFromObject(newNIMService)
127125
// Start with structural validation to ensure the updated object is well formed.
128-
warningList, errList := validateNIMServiceSpec(&newNIMService.Spec, fldPath, v.k8sVersion, v.k8sClient, &namespacedName)
126+
warningList, errList := validateNIMServiceSpec(newNIMService, fldPath, v.k8sVersion, v.k8sClient)
129127

130128
wList, eList := validateMultiNodeImmutability(oldNIMService, newNIMService, field.NewPath("spec").Child("multiNode"))
131129
warningList = append(warningList, wList...)

internal/webhook/apps/v1alpha1/nimservice_webhook_validation_helper.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,10 @@ var validDRAResourceQuantitySelectorOps = []appsv1alpha1.DRAResourceQuantitySele
6767
// object. It is intended to be invoked by both ValidateCreate and ValidateUpdate to
6868
// ensure the resource is well-formed before any other validation (e.g. immutability)
6969
// is performed.
70-
func validateNIMServiceSpec(spec *appsv1alpha1.NIMServiceSpec, fldPath *field.Path, kubeVersion string,
71-
k8sClient client.Client, namespacedName *types.NamespacedName) (admission.Warnings, field.ErrorList) {
70+
func validateNIMServiceSpec(nimservice *appsv1alpha1.NIMService, fldPath *field.Path, kubeVersion string,
71+
k8sClient client.Client) (admission.Warnings, field.ErrorList) {
72+
spec := &nimservice.Spec
73+
7274
warningList, errList := validateImageConfiguration(&spec.Image, fldPath.Child("image"))
7375

7476
// TODO abstract all validation functions with a single signature validateFunc(*appsv1alpha1.NIMServiceSpec, *field.Path) (admission.Warnings, field.ErrorList)
@@ -104,7 +106,8 @@ func validateNIMServiceSpec(spec *appsv1alpha1.NIMServiceSpec, fldPath *field.Pa
104106
warningList = append(warningList, w...)
105107
errList = append(errList, err...)
106108

107-
w, err = validateKServeConfiguration(spec, fldPath, namespacedName, k8sClient)
109+
namespacedName := client.ObjectKeyFromObject(nimservice)
110+
w, err = validateKServeConfiguration(spec, fldPath, &namespacedName, k8sClient)
108111
warningList = append(warningList, w...)
109112
errList = append(errList, err...)
110113

@@ -513,9 +516,7 @@ func validateKServeConfiguration(spec *appsv1alpha1.NIMServiceSpec, fldPath *fie
513516
errList := field.ErrorList{}
514517
warningList := admission.Warnings{}
515518

516-
platformIsKServe := spec.InferencePlatform == appsv1alpha1.PlatformTypeKServe
517-
518-
if platformIsKServe {
519+
if spec.InferencePlatform == appsv1alpha1.PlatformTypeKServe {
519520
// Get the deployment mode
520521
mode, err := utils.GetKServeDeploymentMode(context.TODO(), k8sClient, spec.Annotations, namespacedName)
521522
if err != nil {

0 commit comments

Comments
 (0)