From 06fbfebabbda923b590eb7284c8d6e4a0c457c48 Mon Sep 17 00:00:00 2001 From: Mark Winter Date: Sun, 2 Apr 2023 04:08:29 +0900 Subject: [PATCH] support multiple containers in ServingRuntime (#2321) Signed-off-by: Mark Winter --- .../inferenceservice/components/predictor.go | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/pkg/controller/v1beta1/inferenceservice/components/predictor.go b/pkg/controller/v1beta1/inferenceservice/components/predictor.go index d3c22997436..30b0ae1658d 100644 --- a/pkg/controller/v1beta1/inferenceservice/components/predictor.go +++ b/pkg/controller/v1beta1/inferenceservice/components/predictor.go @@ -165,8 +165,19 @@ func (p *Predictor) Reconcile(isvc *v1beta1.InferenceService) (ctrl.Result, erro }) return ctrl.Result{}, errors.New("no container configuration found in selected serving runtime") } - // Assume only one container is specified in runtime spec. - container, err = isvcutils.MergeRuntimeContainers(&sRuntime.Containers[0], &isvc.Spec.Predictor.Model.Container) + + kserveContainerIdx := -1 + for i := range sRuntime.Containers { + if sRuntime.Containers[i].Name == constants.InferenceServiceContainerName { + kserveContainerIdx = i + break + } + } + if kserveContainerIdx == -1 { + return ctrl.Result{}, errors.New("failed to find kserve-container in ServingRuntime containers") + } + + container, err = isvcutils.MergeRuntimeContainers(&sRuntime.Containers[kserveContainerIdx], &isvc.Spec.Predictor.Model.Container) if err != nil { isvc.Status.UpdateModelTransitionStatus(v1beta1.InvalidSpec, &v1beta1.FailureInfo{ Reason: v1beta1.InvalidPredictorSpec, @@ -184,9 +195,6 @@ func (p *Predictor) Reconcile(isvc *v1beta1.InferenceService) (ctrl.Result, erro return ctrl.Result{}, errors.Wrapf(err, "failed to consolidate serving runtime PodSpecs") } - // Other dependencies rely on the container to be a specific name. - container.Name = constants.InferenceServiceContainerName - // Replace placeholders in runtime container by values from inferenceservice metadata if err = isvcutils.ReplacePlaceholders(container, isvc.ObjectMeta); err != nil { isvc.Status.UpdateModelTransitionStatus(v1beta1.InvalidSpec, &v1beta1.FailureInfo{ @@ -203,6 +211,8 @@ func (p *Predictor) Reconcile(isvc *v1beta1.InferenceService) (ctrl.Result, erro podSpec.Containers = []v1.Container{ *container, } + podSpec.Containers = append(podSpec.Containers, sRuntime.Containers[:kserveContainerIdx]...) + podSpec.Containers = append(podSpec.Containers, sRuntime.Containers[kserveContainerIdx+1:]...) // Label filter will be handled in ksvc_reconciler sRuntimeLabels = sRuntime.ServingRuntimePodSpec.Labels