@@ -105,18 +105,25 @@ kubectl label node --all node-role.kubernetes.io/worker=
105105kubectl label node --all nvidia.com/holodeck.managed=true
106106`
107107
108- const KindTemplate = `
108+ const KindBaseTemplate = `
109109
110+ : ${KIND_VERSION:={{.KindVersion}}}
110111: ${INSTANCE_ENDPOINT_HOST:={{.K8sEndpointHost}}}
111112KIND_CONFIG=""
112113if [ -n "{{.KindConfig}}"]; then
113114 KIND_CONFIG="--config {{.KindConfig}}"
114115fi
115116
117+ ARCH=$(uname -m)
118+ if [ "$ARCH" == "x86_64" ]; then
119+ ARCH="amd64"
120+ fi
121+ if [ "$ARCH" == "aarch64" ]; then
122+ ARCH="arm64"
123+ fi
116124
117125# Download kind
118- [ $(uname -m) = x86_64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-amd64
119- [ $(uname -m) = aarch64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-arm64
126+ curl -Lo ./kind https://kind.sigs.k8s.io/dl/${KIND_VERSION}/kind-linux-${ARCH}
120127chmod +x ./kind
121128sudo install ./kind /usr/local/bin/kind
122129
@@ -135,6 +142,9 @@ cd $HOME
135142sudo nvidia-ctk runtime configure --set-as-default
136143sudo systemctl restart docker
137144sudo nvidia-ctk config --set accept-nvidia-visible-devices-as-volume-mounts --in-place
145+ `
146+
147+ const KindTemplate = `
138148
139149# Create a cluster with the config file
140150export KUBECONFIG="${HOME}/.kube/config:/var/run/kubernetes/admin.kubeconfig"
@@ -147,12 +157,54 @@ echo "you can now access the cluster with:"
147157echo "ssh -i <your-private-key> ubuntu@${INSTANCE_ENDPOINT_HOST}"
148158`
149159
160+ const NVKindTemplate = `
161+
162+ # Go
163+ # Set GO version
164+ GO_VERSION="1.23.6"
165+ wget https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz -O /tmp/go${GO_VERSION}.linux-amd64.tar.gz
166+ sudo rm -rf /usr/local/go
167+ sudo tar -C /usr/local -xzf /tmp/go${GO_VERSION}.linux-amd64.tar.gz
168+
169+ # Add Go to PATH
170+ if ! grep -q 'export PATH="/usr/local/go/bin:$PATH"' ~/.bashrc; then
171+ echo 'export PATH="/usr/local/go/bin:/$HOME/go/bin:$PATH"' >> ~/.bashrc
172+ fi
173+ export PATH="/usr/local/go/bin:$HOME/go/bin:$PATH"
174+
175+ # Make
176+ install_packages_with_retry make
177+
178+ # install nvkind
179+ go install github.com/NVIDIA/nvkind/cmd/nvkind@latest
180+
181+ # Load basic Kind config file
182+ cat <<EOF > kind-cluster-config.yml
183+ kind: Cluster
184+ apiVersion: kind.x-k8s.io/v1alpha4
185+ featureGates:
186+ DynamicResourceAllocation: true
187+ containerdConfigPatches:
188+ # Enable CDI as described in
189+ # https://tags.cncf.io/container-device-interface#containerd-configuration
190+ - |-
191+ [plugins."io.containerd.grpc.v1.cri"]
192+ enable_cdi = true
193+ EOF
194+
195+ nvkind cluster create --config-values kind-cluster-config.yml
196+
197+ echo "NVKIND installed successfully"
198+ echo "you can now access the cluster with:"
199+ echo "ssh -i <your-private-key> ubuntu@${INSTANCE_ENDPOINT_HOST}"
200+ `
201+
150202const microk8sTemplate = `
151203
152204: ${INSTANCE_ENDPOINT_HOST:={{.K8sEndpointHost}}}
153205
154206# Install microk8s
155- sudo apt-get update
207+ with_retry 3 10s sudo apt-get update
156208
157209sudo snap install microk8s --classic --channel={{.Version}}
158210sudo microk8s enable gpu dashboard dns registry
@@ -180,6 +232,7 @@ const (
180232
181233type Kubernetes struct {
182234 Version string
235+ KindVersion string
183236 Installer string
184237 KubeletReleaseVersion string
185238 Arch string
@@ -194,16 +247,23 @@ type Kubernetes struct {
194247
195248func NewKubernetes (env v1alpha1.Environment ) (* Kubernetes , error ) {
196249 kubernetes := & Kubernetes {
197- Version : env .Spec .Kubernetes .KubernetesVersion ,
250+ Version : env .Spec .Kubernetes .Version ,
198251 }
199252 // check if env.Spec.Kubernetes.KubernetesVersion is in the format of vX.Y.Z
200253 // if not, set the default version
201- if ! strings .HasPrefix (env .Spec .Kubernetes .KubernetesVersion , "v" ) && env .Spec .Kubernetes .KubernetesInstaller != "microk8s" {
202- fmt .Printf ("Kubernetes version %s is not in the format of vX.Y.Z, setting default version v1.32.1\n " , env .Spec .Kubernetes .KubernetesVersion )
254+ if ! strings .HasPrefix (env .Spec .Kubernetes .Version , "v" ) && env .Spec .Kubernetes .Installer != "microk8s" {
255+ fmt .Printf ("Kubernetes version %s is not in the format of vX.Y.Z, setting default version v1.32.1\n " , env .Spec .Kubernetes .Version )
203256 kubernetes .Version = defaultKubernetesVersion
204257 }
205- if env .Spec .Kubernetes .KubeletReleaseVersion != "" {
206- kubernetes .KubeletReleaseVersion = env .Spec .Kubernetes .KubeletReleaseVersion
258+ if env .Spec .Kubernetes .Installer == "kind" || env .Spec .Kubernetes .Installer == "nvkind" {
259+ if env .Spec .Kubernetes .KindVersion != "" {
260+ kubernetes .KindVersion = env .Spec .Kubernetes .KindVersion
261+ } else {
262+ kubernetes .KindVersion = defaultKubernetesVersion
263+ }
264+ }
265+ if env .Spec .Kubernetes .Version != "" {
266+ kubernetes .KubeletReleaseVersion = env .Spec .Kubernetes .Version
207267 } else {
208268 kubernetes .KubeletReleaseVersion = defaultKubeletReleaseVersion
209269 }
@@ -243,15 +303,25 @@ func NewKubernetes(env v1alpha1.Environment) (*Kubernetes, error) {
243303func (k * Kubernetes ) Execute (tpl * bytes.Buffer , env v1alpha1.Environment ) error {
244304 kubernetesTemplate := new (template.Template )
245305
246- switch env .Spec .Kubernetes .KubernetesInstaller {
306+ switch env .Spec .Kubernetes .Installer {
247307 case "kubeadm" :
248308 kubernetesTemplate = template .Must (template .New ("kubeadm" ).Parse (KubeadmTemplate ))
249309 case "kind" :
310+ kindBase := template .Must (template .New ("common-functions" ).Parse (KindBaseTemplate ))
311+ if err := kindBase .Execute (tpl , k ); err != nil {
312+ return fmt .Errorf ("failed to execute kind base template: %v" , err )
313+ }
250314 kubernetesTemplate = template .Must (template .New ("kind" ).Parse (KindTemplate ))
315+ case "nvkind" :
316+ kindBase := template .Must (template .New ("common-functions" ).Parse (KindBaseTemplate ))
317+ if err := kindBase .Execute (tpl , k ); err != nil {
318+ return fmt .Errorf ("failed to execute kind base template: %v" , err )
319+ }
320+ kubernetesTemplate = template .Must (template .New ("nvkind" ).Parse (NVKindTemplate ))
251321 case "microk8s" :
252322 kubernetesTemplate = template .Must (template .New ("microk8s" ).Parse (microk8sTemplate ))
253323 default :
254- return fmt .Errorf ("unknown kubernetes installer %s" , env .Spec .Kubernetes .KubernetesInstaller )
324+ return fmt .Errorf ("unknown kubernetes installer %s" , env .Spec .Kubernetes .Installer )
255325 }
256326
257327 err := kubernetesTemplate .Execute (tpl , k )
0 commit comments