📘 See concepts/HelmVsKustomize.md for how Helm compares to Kustomize and when to reach for each.
Cluster Configuration: kind-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
extraPortMappings:
- containerPort: 80 # for nginx ingress
hostPort: 80
protocol: TCP
- containerPort: 30080 # for gateway api
hostPort: 30080
protocol: TCP-
Run the following command to create a Kubernetes cluster using the provided
kind-config.yaml:kind create cluster --config kind-config.yaml
-
Create mern-devops namespace:
kubectl create namespace mern-devops
helm install eg oci://docker.io/envoyproxy/gateway-helm --version v0.0.0-latest -n envoy-gateway-system --create-namespaceWait for Envoy Gateway to become available:
kubectl wait --timeout=5m -n envoy-gateway-system deployment/envoy-gateway --for=condition=Availablehelm install mern-devops ./helm-charthelm lsCheck the status of all resources:
kubectl get all -n mern-devopskubectl get gatewayclass
kubectl get gateway -n mern-devops
kubectl get httproute -n mern-devops
⚠️ Important: If running locally, the gateway status will showProgrammed: Falsesince kind has no LoadBalancer support. The NodePort patch in the next step resolves this for local access.
kubectl get pods -n envoy-gateway-system
kubectl get svc -n envoy-gateway-system🔧 Local Testing Only: Patch the envoy gateway service to NodePort for local access. Not needed in production (use LoadBalancer or proper DNS).
Get the envoy gateway service name:
kubectl get svc -n envoy-gateway-system
# Look for the service named: mern-devops-envoy-gateway-<hash>Patch it to NodePort:
kubectl patch svc <service-name> -n envoy-gateway-system \
-p '{"spec":{"type":"NodePort","ports":[{"port":80,"nodePort":30080,"protocol":"TCP"}]}}'Access the application at:
http://localhost:30080
helm uninstall mern-devopsConfirm removal:
helm ls
kubectl get nsThis project supports publishing and consuming the Helm chart using GitHub Container Registry (GHCR) as an OCI registry.
export GHCR_USERNAME="atkaridarshan04"
export GHCR_TOKEN="<your_github_token>"
echo $GHCR_TOKEN | helm registry login ghcr.io -u $GHCR_USERNAME --password-stdinRun this inside the chart directory (where Chart.yaml exists):
helm package .This generates a versioned chart archive like:
mern-chart-2.0.0.tgz
helm push mern-chart-2.0.0.tgz oci://ghcr.io/atkaridarshan04/helm-chartsThis will publish the chart as:
ghcr.io/atkaridarshan04/helm-charts/mern-charts:2.0.0
helm pull oci://ghcr.io/atkaridarshan04/helm-charts/mern-chart --version 2.0.0(Optional) Extract it:
helm pull oci://ghcr.io/atkaridarshan04/helm-charts/mern-chart --version 2.0.0 --untarhelm install mern-devops oci://ghcr.io/atkaridarshan04/helm-charts/mern-chart --version 2.0.0helm upgrade mern-devops oci://ghcr.io/atkaridarshan04/helm-charts/mern-chart --version 2.0.0helm show chart oci://ghcr.io/atkaridarshan04/helm-charts/mern-chart --version 2.0.0



