CISEL DevOps Technical Bootcamp #1

Search for a command to run...

No comments yet. Be the first to comment.
Summary Based on the Cloud Adoption Framework (CAF) and Well-Architected Framework (WAF), this project automates the audit of an entire Azure tenant in minutes, using AI and a sovereign environment to

Summary The N1 agent transforms how DevOps teams interact with Kubernetes infrastructures by combining conversational prompts and advanced automation, all powered by artificial intelligence. Concretel

We had the opportunity to attend Kubernetes Community Days (KCD) Suisse Romande, held at CERN in Geneva, on December 4th and 5th. These two days were full of discussions, workshops (we had the opportunity to participate to the Exoscale capture the fl...

With the recent annoncements regarding the Gateway APIs and the end of the Ingress Nginx maintenance, some aspects (historically managed by the Ingress Nginx) need to be re-adapted, we’ll shre one of those today: the TLS certificates management throu...

The CNCF has recently announced a major transition: Ingress Nginx, the “de facto” considered ingress controller, will officially reach end-of-life in March 2026. Official source here : https://kubernetes.io/blog/2025/11/11/ingress-nginx-retirement/#:...

Below we can see the technology stack that we will use for this bootcamp. NKE (Nutanix Kubernetes Engine) is deployed on top of Nutanix AHV using Prism Central. NKE is composed of ETCDs as well as Master and Worker nodes. The worker nodes are those who host cloud native applications. Nutanix object will be used as an S3 storage provider.

To interact with the kubernetes cluster through kubectl (CLI), you will have to first connect via ssh to the jumphost who contains all the needed binaries and configurations. Kasten K10 will be used as a cloud native backup solution and will export backup data to an S3 bucket provided by Nutanix object. Note that Kasten K10 web interface and our application example will be reachable directly via a web browser.

Type: Policy Secure (UAC) or Connection Server(VPN) Name: X-Labs - PHX Server URL: phx-vpn.xlabs.nutanix.com
OR
Type: Policy Secure (UAC) or Connection Server(VPN) Name: X-Labs - RTP Server URL: dm3-vpn.xlabs.nutanix.com
Once setup, login with the supplied credentials
Connect to your cluster using the "Nutanix Cluster" IP.
From then you can jump to the Prism Central that manage our cluster.

When you are on the Prism Central, click on the Burger Menu, click Services, click Karbon (Kubernetes). You can click on the start to add it to your favourites.
Setup Karbon
Create a Kubernetes Cluster

Hint : Wait for the deployment completion. It will take around 15 minutes to complete, go to the next section in the meanwhile

Connect to the linux jumphost (with putty and username: yourusername (example userxx) pw: nutanix/4u)
Use this link to install putty on your machine if not already present : https://the.earth.li/~sgtatham/putty/latest/wa64/putty-arm64-0.77-installer.msi
When your cluster is fully deployed, you can then connect to it using kubectl

Paste the command into the console (on the jumphost) and press ENTER, then try to connect using kubectl. kubectl is a binary used to interact with kubernetes cluster, it is pre-installed on the jumphost.
kubectl get nodes -o wide
output:

We will need to install the MetalLB service in the cluster to act as a LoadBalancer for the services. It will give IP address to the services so we can reach them.
First, deploy mettallm using helm with the commands below:
kubectl create ns metallb-system
helm repo add metallb https://metallb.github.io/metallb
helm install metallb metallb/metallb -n metallb-system
kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"
kubectl -n metallb-system get all
Then, find the IP range allowed for your instance as provided in Resources lab document.
Create the metallb configuration, be careful to adapt the line x.x.x.x-y.y.y.y with the information as provided in resources lab document, in the field Karbon MetalLB Pool.
cat <<EOF | kubectl apply --filename -
---
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: my-kube-ippool
namespace: metallb-system
spec:
addresses:
- x.x.x.x-y.y.y.y
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: l2
namespace: metallb-system
EOF
Restart the metallb controller
kubectl -n metallb-system scale deployment.apps/metallb-controller --replicas=0
kubectl -n metallb-system scale deployment.apps/metallb-controller --replicas=1
Check the MetalLB deployment
kubectl -n metallb-system get pods
you should see 4 pods running:

We will use the deployment below as a demo application that we will modify/delete and then restore with Kasten in next steps.
cat <<EOF >./kustomization.yaml
secretGenerator:
- name: mysql-pass
literals:
- password=YOUR_PASSWORD
resources:
- https://raw.githubusercontent.com/cisel-dev/bootcamp-demo/main/wordpress-mysql-deployment.yaml
EOF
kubectl create ns wordpress
kubectl apply -n wordpress -k ./
Check that all the pods are running and verify that the service get an External-IP Address in the range specified in MetalLB
kubectl -n wordpress get pods
kubectl -n wordpress get svc
You can access the Wordpress interface using http http://External-IP and finalise the installation using the Wordpress process.

!!!! --- This "Create Object Store" section is a showcase, do not click on create, and click cancel afterwards, as an object store has already been created for you. --- !!!!
With Google Chrome, connect to the Prism Central , click on the Burger Menu,click Services, click Objects
On Prism Central, click on the burger menu, services, Objects. Choose the "Access Keys" tab.

Go back to the "Object Stores" tab and click on ntnx-objects object store. You will be redirected to the Nutanix Objects dedicated web page.

Add Kasten helm repo
helm repo add kasten https://charts.kasten.io/
helm repo update
We need to setup this VolumeSnapshotClass before Kasten installation as a prerequisite. This is not needed in newer version of Karbon.
SECRET=$(kubectl get sc -o=jsonpath='{.items[?(@.metadata.annotations.storageclass\.kubernetes\.io\/is-default-class=="true")].parameters.csi\.storage\.k8s\.io\/provisioner-secret-name}')
DRIVER=$(kubectl get sc -o=jsonpath='{.items[?(@.metadata.annotations.storageclass\.kubernetes\.io\/is-default-class=="true")].provisioner}')
cat << EOF | kubectl apply -f -
apiVersion: snapshot.storage.k8s.io/v1beta1
kind: VolumeSnapshotClass
metadata:
name: default-snapshotclass
annotations:
k10.kasten.io/is-snapshot-class: "true"
driver: $DRIVER
parameters:
storageType: NutanixVolumes
csi.storage.k8s.io/snapshotter-secret-name: $SECRET
csi.storage.k8s.io/snapshotter-secret-namespace: kube-system
deletionPolicy: Delete
EOF
Now we will launch a precheck script provided by Kasten to be sure all the prerequisite are present
curl -s https://docs.kasten.io/tools/k10_primer.sh | bash
The ouput should be OK for every step:

Add the repo and install Kasten using Helm with authentication and LoadBalancer type
helm repo add kasten https://charts.kasten.io/
helm repo update
kubectl create ns kasten-io
helm install k10 kasten/k10 --namespace=kasten-io --set externalGateway.create=true --set auth.tokenAuth.enabled=true
Wait for all the pods in Running status
kubectl -n kasten-io get pods
Get the Kasten gateway-ext service External-IP
kubectl -n kasten-io get svc gateway-ext
Get the Authentication Token and try to connect
sa_secret=$(kubectl get serviceaccount k10-k10 -o jsonpath="{.secrets[0].name}" --namespace kasten-io)
kubectl get secret $sa_secret --namespace kasten-io -ojsonpath="{.data.token}{'\n'}" | base64 --decode
Connect to Kasten using http://External-IP/k10/#/ and the previous Token.
Enter an email and a Company name to access the dashboard.

You can also access the Kasten Dashboard using the kubernetes port-forward command below and access the local URL : http://127.0.0.1:8080/k10/#/
kubectl -n kasten-io port-forward service/gateway 8080:8000
We need a "location profile" to export local snapshot to an external storage location


Now we will create the snapshot and export Policy for our workloads and data.


On the main dashboard, click on policies Find your policy and click on the run once button, the Run Policy.
Now go to the Dashboard to follow the activities.
On the main Dashboard

You can now go back again to the "Usage & Reports" dashboard and open "More Charts and Alerts" to view some stats about Kasten.
Play with your Worpdress deployment, adding/removing Page or plugin. We need some modification before we use Kasten to restore the content from a previous snapshot or export.
As we ran once the backup policy, we now have backups of our wordpress application. To restore it:


We will now enable the K10 DR Feature.
kubectl create secret generic k10-dr-secret \
--namespace kasten-io \
--from-literal key=<passphrase>
helm install k10-restore kasten/k10restore --namespace=kasten-io \
--set sourceClusterID=<source-clusterID> \
--set profile.name=<location-profile-name>
https://microservices-demo.github.io/deployment/kubernetes-start.html Follow procedure
# git clone https://github.com/microservices-demo/microservices-demo.git
# cd microservices-demo/deploy/kubernetes
kubectl apply -f https://raw.githubusercontent.com/cisel-dev/bootcamp-demo/main/socksshop-demo.yaml