Google Kubernetes Engine Installation
Prerequisites
- gcloud CLI installed and configured
- kubectl with the correct context selected, pointing to the GKE cluster where Luna will be deployed. The cluster name passed to the deploy script must match the GKE cluster name in the active kubectl context; otherwise, the deploy script will exit with an error.
- Helm: the Kubernetes package manager
- cmctl: the cert-manager command-line utility
- An existing zonal or regional GKE Standard cluster (Autopilot is not supported) with at least 2 nodes (required for Luna webhook replica availability).
Step 1 (Optional): Install NVIDIA GPU driver
If you plan to run GPU workloads, install the NVIDIA device plugin:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/cos/daemonset-preloaded.yaml
Step 2: Deploy Luna
Luna requires cert-manager to be installed/running in the cluster.
The deploy script will detect an existing cert-manager installation and install it into the cert-manager namespace if it is not already present.
For the deploy.sh script, the cluster location must be set to the appropriate zone for a zonal GKE cluster (for example, us-central1-a) or to the region for a regional GKE cluster (for example, us-central1).
By default, the script will use the namespace "elotl" and the release name "elotl-luna" for deployment. However, you can override these defaults using the --namespace and --helm-release-name options, respectively.
Luna requires Workload Identity to be enabled on the cluster and the specified node pool.
If Workload Identity is not enabled, the deployment script will prompt for confirmation to enable it during deployment. Alternatively, you can use the --enable-workload-identity option to enable it automatically.
Luna provisions and manages only the nodes it creates. Existing nodes in the cluster are not modified or removed.
You can then run the following command to deploy Luna into your GKE cluster:
./deploy.sh --name <cluster-name> \
--project <project-id> \
(--zone <compute-zone> or --region <compute-region>) \
--node-pool <node-pool> \
[--helm-release-name <release-name>] \
[--namespace <namespace>] \
[--enable-workload-identity] \
[--additional-helm-values "<additional-helm-values>"]
This command generates:
<gke-cluster-name>_values.yaml<gke-cluster-name>_<helm-release-name>_values_full.yaml
These files are useful to retain as a reference or backup for future upgrades.
Step 3: Verify Luna installation
Run:
kubectl get all -n elotl
Sample Output
NAME READY STATUS RESTARTS AGE
pod/luna-manager-5d8578565d-86jwc 1/1 Running 0 56s
pod/luna-webhook-58b7b5dcfb-dwpcb 1/1 Running 0 56s
pod/luna-webhook-58b7b5dcfb-xmlds 1/1 Running 0 56s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/luna-webhook ClusterIP x.x.x.x <none> 8443/TCP 57s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/luna-manager 1/1 1 1 57s
deployment.apps/luna-webhook 2/2 2 2 57s
NAME DESIRED CURRENT READY AGE
replicaset.apps/luna-manager-5d8578565d 1 1 1 57s
replicaset.apps/luna-webhook-58b7b5dcfb 2 2 2 57s
Step 4: Test Luna functionality
Follow the tutorial to validate the value provided by Luna.
Step 5: Observe pod placement and node scaling
While testing, observe pod scheduling, dynamic node creation, and removal:
kubectl get pods --selector=elotl-luna=true -o wide -w
kubectl get nodes -w
Upgrade
When running the upgrade command described below, set <retained-values-file> to:
<retained-path>/<cluster-name>_<helm_release_name>_values_full.yaml
To upgrade an existing Luna deployment, run:
helm upgrade elotl-luna <chart-path> --wait --namespace=<cluster-namespace> --values=<retained-values-file> <additional-helm-values(optional)>
For example, to upgrade my-cluster from luna-v1.5.1 to luna-v1.5.2 and set an additional helm value binPackingNodeCpu=2, run:
helm upgrade elotl-luna ./elotl-luna-v1.5.2.tgz --wait --namespace=elotl --values=../../luna-v1.5.2/gke/my-cluster_values.yaml --set binPackingNodeCpu=2
And validate the upgrade as follows:
helm ls -A
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
elotl-luna elotl 4 2026-01-14 14:15:30.686251 -0700 PDT deployed elotl-luna-v1.5.2 v1.5.2
Cleanup
Warning
Uninstalling Luna without first removing the pods Luna placed on Luna-managed nodes may result in orphaned nodes.
We recommend deleting all pods running on Luna-managed nodes before uninstalling Luna to avoid leaving orphaned nodes behind.
To remove Luna manager’s Helm chart run the following:
helm uninstall elotl-luna --namespace=elotl
kubectl delete namespace elotl
If Luna is uninstalled before all Luna-allocated nodes have been scaled down and removed, finalizers may remain on those nodes and prevent deletion. If this occurs, follow the finalizer cleanup instructions
If Luna created a node pool that was not removed before Luna was uninstalled, you may want to delete it manually.
For example:
gcloud container node-pools delete <luna-node-pool-name> \
(--zone <zone> or --region <region>) \
--cluster <cluster-name>