Skip to content
This repository was archived by the owner on Jun 20, 2026. It is now read-only.

Add feature to install llm-d infra using kustomize for teams preferring native Kubernetes tooling#248

Open
avinashsingh77 wants to merge 2 commits into
llm-d-incubation:mainfrom
avinashsingh77:helm_to_kustomize
Open

Add feature to install llm-d infra using kustomize for teams preferring native Kubernetes tooling#248
avinashsingh77 wants to merge 2 commits into
llm-d-incubation:mainfrom
avinashsingh77:helm_to_kustomize

Conversation

@avinashsingh77

Copy link
Copy Markdown

This PR adds Kustomize-based deployment support for llm-d-infra, providing an alternative to Helm charts for gateway infrastructure deployment.

The implementation supports all gateway providers (Istio, Kgateway, AgentGateway, GKE) with optional features as reusable components.

Kustomize structure

Gateway Providers (4 overlays):

  • Istio (with ConfigMap + Telemetry)
  • Kgateway (with GatewayParameters)
  • AgentGateway
  • GKE

Optional Features (2 components):

  • Ingress (external access)
  • TLS (HTTPS listener)

Production-Ready Examples(aligning with well-lit paths)

  • istio-minimal/: Basic Istio gateway deployment
  • istio-with-ingress/: Production Istio with external Ingress and custom resource limits
  • istio-with-tls/: Istio gateway with TLS/HTTPS support
  • kgateway-production/: Production-ready Kgateway deployment
  • gke-minimal/: Basic GKE gateway
  • gke-tpu/: GKE gateway optimized for TPU workloads with nodeSelector annotations

Migration Path

Existing Helm users are not affected - Helm charts remain fully supported. Kustomize provides an alternative deployment method for teams that prefer native Kubernetes tooling or require GitOps-friendly configuration management.

The kustomize/MIGRATION.md guide helps teams choose between Helm and Kustomize based on their specific needs.

Testing

All overlays and examples have been tested to ensure:

  • Successful builds with kubectl kustomize
  • Functional equivalence with corresponding Helm deployments
  • Correct resource generation for each provider
  • Components compose correctly with all overlays

Signed-off-by: Avinash Singh <avinashsingh.rcoem@gmail.com>

@Gregory-Pereira Gregory-Pereira left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Excellent job, especially with little guidance from me as I have been busy. Review the suggestions and architecture changes I discuss below - but based on them I think examples and overlays is a bit redundant, so I think we could consider removing examples but I am willing to hear arguments to the contrary. I think the Gateway API itself and various implementations on top of it are well enough known and popular that people could look at a central readme as a doc on how to extend it to their use-case rather than giving them explicit examples

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we could drop this manifest entirely, this was added early in the process and kind of defeats the purpose of the inference gateway as a component. It was kept on in the edge case where people want an inference gateway but could only use clusterIP as the service type, so it gave them a simple way to expose in hit the gateway - but definitely not production ready.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same as above, we can remove the whole directory

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This directory I think we can remove. It was an "environment" but from the infra perspective which will eventually map into just a gateway directory in the regular examples, the TPU pieces are irrelevant. That implementation would correspond to your PR in modelservice and be

So to clarify our pattern were aiming for, for deploying a specialized hardware type with a specific gateway (EX: GKE + TPU):

tree
.
├── gateway
│   ├── base
│   └── gke
└── modelserver
    ├── base
    └── tpu

This is what the final setup in the llm-d guides will look like

- op: add
path: /metadata/annotations
value:
cloud.google.com/neg: '{"exposed_ports": {"80":{}}}'

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@liu-cong is this best practice for GKE? Is this something we should be doing

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Useful docs, while the directory should be deleted based on the above comment, this should find a home somewhere in the main repo

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One comment - this falls outside of the scope of this PR but I think its important to mention. Our Kgatway support is 2nd class, we need to find a declaritive (manifest) way to increase the number of concurrent connections that Kgateway supports from the default 1024. I know its possible with an API call or going through the Kgateway control plan UI. We should have some documentation on it at the very last, but its unrelated to the content of the PR so I can follow on with later.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is missing an https (443) listener in the gateway, which AFAIK is required, I dont think it works even if one were to configure a port 80 listener with HTTPs.

Comment thread kustomize/overlays/istio/kustomization.yaml Outdated

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just a high level comment - this spec works for kgateway 2.1.X, on previous versions (like v2.0.4 which we used to use) need floatingUserId to allow the envoy container to spawn with a environment derived variable user, which is a requirement to meet OCP restricted-v2 SCCs.

This implementation will eventually land in the main repo, this pr is for gathering feedback, so this concern will go away but I think its important to call this out.

Comment thread kustomize/overlays/kgateway/gatewayparameters.yaml Outdated
@github-actions

Copy link
Copy Markdown

This PR is marked as stale after 21d of inactivity. After an additional 14d of inactivity (7d to become rotten, then 7d more), it will be closed. To prevent this PR from being closed, add a comment or remove the lifecycle/stale label.

Co-authored-by: Greg Pereira <grpereir@redhat.com>
@github-actions

Copy link
Copy Markdown

Unsigned commits detected! Please sign your commits.

For instructions on how to set up GPG/SSH signing and verify your commits, please see GitHub Documentation.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants