Skip to content

Lab 01 — Build Your First Kubernetes Cluster

Item Details
Lab ID K8S-FND-LAB-01
Difficulty Beginner
Estimated Time 60–90 minutes
Environment Local workstation
Platform Docker Desktop and kind
Cost Free
Primary Role Kubernetes Security Engineer
Module Module 01 — Kubernetes Fundamentals for Security Engineers

CloudNova Technologies is preparing to adopt Kubernetes for its internal development and security testing environments.

Before the platform team begins deploying enterprise applications, the Cloud Security team must build a small Kubernetes cluster and verify that its core components are operating correctly.

You have joined the CloudNova Technologies security engineering team as a Junior Kubernetes Security Engineer.

Your mission is to:

  • Install the required Kubernetes tools
  • Create a local Kubernetes cluster
  • Inspect the Control Plane and Worker Node
  • Review system workloads
  • Deploy a test application
  • Expose the application securely for local testing
  • Perform an initial cluster security review
  • Collect evidence of successful implementation
  • Remove the lab resources after completion

This lab establishes the technical foundation for the remaining Kubernetes Security modules.

By completing this lab, you will be able to:

  • Create a local Kubernetes cluster using kind
  • Connect to the cluster using kubectl
  • Inspect Kubernetes nodes and system components
  • Identify the Control Plane and Worker Node
  • Create and inspect a Namespace
  • Deploy a containerised application
  • Create a Kubernetes Service
  • Review Kubernetes workload configuration
  • Perform basic cluster security validation
  • Troubleshoot common cluster deployment issues

You will build the following environment:

Windows Workstation
Docker Desktop
kind Kubernetes Cluster
├── Control Plane Node
└── Worker Node
cloudnova-lab Namespace
NGINX Test Deployment
ClusterIP Service

At the end of this lab, you should have:

  • One running Kubernetes cluster
  • One Control Plane node
  • One Worker Node
  • One dedicated Namespace
  • One test Deployment
  • Two running application Pods
  • One internal ClusterIP Service
  • Evidence showing the cluster is operational
  • A short initial security assessment

Before starting, ensure that you have:

  • A Windows 10 or Windows 11 computer
  • Administrative access to the workstation
  • At least 8 GB of RAM
  • Virtualisation enabled
  • Internet access
  • Docker Desktop installed
  • Visual Studio Code installed
  • PowerShell or Git Bash available

Recommended free disk space:

10 GB or more
Tool Purpose
Docker Desktop Runs containers used as Kubernetes nodes
kind Creates Kubernetes clusters using Docker containers
kubectl Communicates with the Kubernetes API Server
PowerShell Executes Windows commands
Git Bash Optional alternative terminal
Visual Studio Code Creates and edits Kubernetes manifest files

This lab runs locally on your workstation.

It does not require:

  • An AWS account
  • An Azure account
  • A Google Cloud account
  • Paid Kubernetes infrastructure
  • Public internet exposure of the application

Do not use production credentials or sensitive information in this environment.

Task 01 — Verify Hardware Virtualisation

Section titled “Task 01 — Verify Hardware Virtualisation”

Docker Desktop requires hardware virtualisation.

Press:

Ctrl + Shift + Esc

Select:

Performance → CPU

Confirm that the following shows:

Virtualisation: Enabled

If virtualisation is disabled, enable Intel VT-x or AMD-V in the system BIOS or UEFI settings before continuing.

Task 02 — Install and Verify Docker Desktop

Section titled “Task 02 — Install and Verify Docker Desktop”

Open Docker Desktop from the Windows Start menu.

Wait until Docker Desktop reports that the Docker engine is running.

Terminal window
docker version
Terminal window
docker version

Expected result:

Client:
Version: ...
Server:
Engine:
Version: ...

Both the Docker client and server must be available.

Terminal window
docker run --rm hello-world
Terminal window
docker run --rm hello-world

Expected result:

Hello from Docker!

This confirms that Docker can download and execute containers.

kubectl is the command-line tool used to communicate with Kubernetes.

Option A — Install with Windows Package Manager

Section titled “Option A — Install with Windows Package Manager”

Open PowerShell as Administrator.

Terminal window
winget install Kubernetes.kubectl

Close and reopen the terminal after installation.

Option B — Use the kubectl Included with Docker Desktop

Section titled “Option B — Use the kubectl Included with Docker Desktop”

Docker Desktop may already provide kubectl.

Verify it before installing another copy.

Terminal window
kubectl version --client
Terminal window
kubectl version --client

Expected result:

Client Version: ...
Terminal window
Get-Command kubectl
Terminal window
which kubectl

Record the installed location as evidence.

kind stands for Kubernetes IN Docker.

It creates Kubernetes nodes as Docker containers and is suitable for:

  • Local laboratories
  • Development environments
  • CI/CD testing
  • Kubernetes security exercises
Terminal window
winget install Kubernetes.kind

Use this only when Chocolatey is already installed.

Terminal window
choco install kind
Terminal window
kind version
Terminal window
kind version

Expected result:

kind v...

Create a dedicated folder for the lab files.

Terminal window
New-Item -ItemType Directory -Path C:\GoHackersCloud-Labs\kubernetes\lab-01 -Force
Set-Location C:\GoHackersCloud-Labs\kubernetes\lab-01
Terminal window
mkdir -p /c/GoHackersCloud-Labs/kubernetes/lab-01
cd /c/GoHackersCloud-Labs/kubernetes/lab-01

Verify the current directory.

Terminal window
Get-Location
Terminal window
pwd

Task 06 — Create the Kubernetes Cluster Configuration

Section titled “Task 06 — Create the Kubernetes Cluster Configuration”

You will create a two-node Kubernetes cluster containing:

  • One Control Plane node
  • One Worker Node

Create a file named:

kind-cluster.yaml

Add the following content:

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: cloudnova-security-lab
nodes:
- role: control-plane
- role: worker

Save the file inside:

C:\GoHackersCloud-Labs\kubernetes\lab-01
Terminal window
Get-Content .\kind-cluster.yaml
Terminal window
cat kind-cluster.yaml

Expected content:

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: cloudnova-security-lab
nodes:
- role: control-plane
- role: worker
Terminal window
kind create cluster --config .\kind-cluster.yaml
Terminal window
kind create cluster --config kind-cluster.yaml

The process may take several minutes.

Expected output should show stages similar to:

Creating cluster "cloudnova-security-lab"
Ensuring node image
Preparing nodes
Writing configuration
Starting control-plane
Installing CNI
Installing StorageClass
Joining worker nodes
Set kubectl context
Terminal window
kind get clusters
Terminal window
kind get clusters

Expected result:

cloudnova-security-lab
Terminal window
kubectl config current-context

Expected result:

kind-cloudnova-security-lab

The context tells kubectl which Kubernetes cluster it should manage.

Terminal window
kubectl get nodes

Expected result:

NAME STATUS ROLES AGE VERSION
cloudnova-security-lab-control-plane Ready control-plane ... ...
cloudnova-security-lab-worker Ready <none> ... ...

Both nodes should show:

STATUS: Ready

Step 2 — Display Additional Node Information

Section titled “Step 2 — Display Additional Node Information”
Terminal window
kubectl get nodes -o wide

Review:

  • Node name
  • Node role
  • Internal IP address
  • Kubernetes version
  • Operating system
  • Container runtime
Terminal window
kubectl describe node cloudnova-security-lab-control-plane

Locate and review:

  • Roles
  • Labels
  • Taints
  • Capacity
  • Allocatable resources
  • System information
  • Running Pods
  • Node conditions
Terminal window
kubectl describe node cloudnova-security-lab-worker

Compare the Worker Node with the Control Plane node.

The Control Plane node normally includes a taint that discourages ordinary workloads from being scheduled on it.

Locate a value similar to:

node-role.kubernetes.io/control-plane:NoSchedule

This helps separate cluster management components from application workloads.

Task 09 — Inspect the Control Plane Containers

Section titled “Task 09 — Inspect the Control Plane Containers”

Because kind runs Kubernetes nodes as Docker containers, you can inspect them directly.

Terminal window
docker ps

Expected containers:

cloudnova-security-lab-control-plane
cloudnova-security-lab-worker

Step 2 — Inspect the Control Plane Container

Section titled “Step 2 — Inspect the Control Plane Container”
Terminal window
docker inspect cloudnova-security-lab-control-plane
Terminal window
docker inspect cloudnova-security-lab-control-plane

Review:

  • Container name
  • Network configuration
  • Mounted volumes
  • Runtime settings
  • Container state

Do not modify the control-plane container manually.

Task 10 — Inspect Kubernetes System Components

Section titled “Task 10 — Inspect Kubernetes System Components”

Kubernetes system components run inside the kube-system Namespace.

Terminal window
kubectl get namespaces

Expected Namespaces include:

default
kube-node-lease
kube-public
kube-system
local-path-storage
Terminal window
kubectl get pods -n kube-system

You should see components such as:

  • CoreDNS
  • etcd
  • kube-apiserver
  • kube-controller-manager
  • kube-proxy
  • kube-scheduler

Step 3 — Display Detailed System Information

Section titled “Step 3 — Display Detailed System Information”
Terminal window
kubectl get pods -n kube-system -o wide

Identify:

  • Which Pods run on the Control Plane
  • Which components run on each node
  • The IP address assigned to each Pod
Terminal window
kubectl get pods -n kube-system | findstr kube-apiserver

Git Bash alternative:

Terminal window
kubectl get pods -n kube-system | grep kube-apiserver
Terminal window
kubectl get pods -n kube-system | findstr etcd
Terminal window
kubectl get pods -n kube-system | grep etcd
Terminal window
kubectl get pods -n kube-system | findstr scheduler
Terminal window
kubectl get pods -n kube-system | grep scheduler

The following components are critical security assets:

kube-apiserver
etcd
kube-controller-manager
kube-scheduler

Compromise of these components can lead to complete cluster compromise.

Run:

Terminal window
kubectl cluster-info

Expected output includes:

Kubernetes control plane is running at ...
CoreDNS is running at ...

Run:

Terminal window
kubectl cluster-info dump

This command produces extensive cluster information.

For this lab, you do not need to analyse the complete output. Confirm that cluster information can be retrieved successfully.

Do not deploy the application into the default Namespace.

Create a dedicated Namespace named:

cloudnova-lab
Terminal window
kubectl create namespace cloudnova-lab

Expected result:

namespace/cloudnova-lab created
Terminal window
kubectl get namespace cloudnova-lab
Terminal window
kubectl describe namespace cloudnova-lab
Terminal window
kubectl label namespace cloudnova-lab environment=development
kubectl label namespace cloudnova-lab owner=cloud-security-team
kubectl label namespace cloudnova-lab business-unit=cloudnova-technologies
Terminal window
kubectl get namespace cloudnova-lab --show-labels

Expected labels should include:

environment=development
owner=cloud-security-team
business-unit=cloudnova-technologies

Create a file named:

nginx-deployment.yaml

Add the following configuration:

apiVersion: apps/v1
kind: Deployment
metadata:
name: cloudnova-web
namespace: cloudnova-lab
labels:
app: cloudnova-web
environment: development
spec:
replicas: 2
selector:
matchLabels:
app: cloudnova-web
template:
metadata:
labels:
app: cloudnova-web
environment: development
spec:
containers:
- name: nginx
image: nginx:stable
ports:
- name: http
containerPort: 80
protocol: TCP
resources:
requests:
cpu: 100m
memory: 64Mi
limits:
cpu: 250m
memory: 128Mi

This Deployment includes:

  • A dedicated Namespace
  • Workload labels
  • Two replicas for availability
  • CPU requests and limits
  • Memory requests and limits
  • A named container port
  • No public Service exposure

Additional workload hardening will be introduced in later modules.

Terminal window
kubectl apply -f .\nginx-deployment.yaml
Terminal window
kubectl apply -f nginx-deployment.yaml

Expected result:

deployment.apps/cloudnova-web created
Terminal window
kubectl get deployments -n cloudnova-lab

Expected result:

NAME READY UP-TO-DATE AVAILABLE
cloudnova-web 2/2 2 2
Terminal window
kubectl get pods -n cloudnova-lab

Both Pods should show:

STATUS: Running
Terminal window
kubectl get pods -n cloudnova-lab -o wide

Review:

  • Pod names
  • Pod IP addresses
  • Worker Node assignment
  • Pod status

The application Pods should normally run on the Worker Node rather than the Control Plane.

Task 14 — Inspect the Deployment Hierarchy

Section titled “Task 14 — Inspect the Deployment Hierarchy”

The Deployment creates a ReplicaSet, and the ReplicaSet creates Pods.

Terminal window
kubectl get deployment cloudnova-web -n cloudnova-lab
Terminal window
kubectl get replicasets -n cloudnova-lab
Terminal window
kubectl get pods -n cloudnova-lab

The relationship should be:

Deployment
ReplicaSet
├── Pod 1
└── Pod 2
Terminal window
kubectl describe deployment cloudnova-web -n cloudnova-lab

Review:

  • Replicas
  • Pod template
  • Container image
  • Resource settings
  • Labels
  • Events

First, copy one Pod name from:

Terminal window
kubectl get pods -n cloudnova-lab

Then run:

Terminal window
kubectl describe pod <POD-NAME> -n cloudnova-lab

Replace <POD-NAME> with the real Pod name.

Review:

  • Container image
  • Container state
  • Node placement
  • Pod IP
  • Resource limits
  • Service Account
  • Events

Task 15 — Create an Internal Kubernetes Service

Section titled “Task 15 — Create an Internal Kubernetes Service”

Create a file named:

nginx-service.yaml

Add:

apiVersion: v1
kind: Service
metadata:
name: cloudnova-web-service
namespace: cloudnova-lab
labels:
app: cloudnova-web
spec:
type: ClusterIP
selector:
app: cloudnova-web
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80

ClusterIP exposes the application only inside the Kubernetes cluster.

This reduces unnecessary public exposure.

Terminal window
kubectl apply -f .\nginx-service.yaml
Terminal window
kubectl apply -f nginx-service.yaml
Terminal window
kubectl get services -n cloudnova-lab

Expected result:

NAME TYPE CLUSTER-IP PORT(S)
cloudnova-web-service ClusterIP ... 80/TCP
Terminal window
kubectl describe service cloudnova-web-service -n cloudnova-lab

Review:

  • Service type
  • Selector
  • Cluster IP
  • Port
  • Target port
  • Endpoints
Terminal window
kubectl get endpoints -n cloudnova-lab

The Service endpoints should correspond to the two Pod IP addresses.

Because the Service is internal, use port forwarding for local testing.

Terminal window
kubectl port-forward service/cloudnova-web-service 8080:80 -n cloudnova-lab

Expected output:

Forwarding from 127.0.0.1:8080 -> 80

Keep this terminal open.

Open a browser and visit:

http://localhost:8080

You should see the default NGINX welcome page.

Return to the terminal and press:

Ctrl + C

Port forwarding creates a temporary local connection.

It does not create a permanent public Kubernetes Service.

Task 17 — Validate Kubernetes Self-Healing

Section titled “Task 17 — Validate Kubernetes Self-Healing”

You will delete one Pod and observe the ReplicaSet create a replacement.

Terminal window
kubectl get pods -n cloudnova-lab

Copy one Pod name.

Terminal window
kubectl delete pod <POD-NAME> -n cloudnova-lab

Replace <POD-NAME> with the selected Pod name.

Terminal window
kubectl get pods -n cloudnova-lab --watch

Observe:

  • The selected Pod terminates
  • A replacement Pod is created
  • The replacement enters the Running state

Press:

Ctrl + C

when the replacement Pod is ready.

Kubernetes restored the desired number of replicas automatically.

This demonstrates:

  • Self-healing
  • Desired-state management
  • ReplicaSet functionality
  • Application resilience
Terminal window
kubectl scale deployment cloudnova-web --replicas=3 -n cloudnova-lab
Terminal window
kubectl get deployment cloudnova-web -n cloudnova-lab
Terminal window
kubectl get pods -n cloudnova-lab

You should now have three Pods.

Terminal window
kubectl scale deployment cloudnova-web --replicas=2 -n cloudnova-lab

Verify:

Terminal window
kubectl get pods -n cloudnova-lab

Task 19 — Perform an Initial Security Review

Section titled “Task 19 — Perform an Initial Security Review”

This is a foundational cluster rather than a fully hardened production environment.

Perform the following checks.

Check 1 — Confirm the Application Uses a Dedicated Namespace

Section titled “Check 1 — Confirm the Application Uses a Dedicated Namespace”
Terminal window
kubectl get all -n cloudnova-lab

Expected result:

The application resources exist inside cloudnova-lab.

Check 2 — Confirm the Service is Not Public

Section titled “Check 2 — Confirm the Service is Not Public”
Terminal window
kubectl get service cloudnova-web-service -n cloudnova-lab

Expected Service type:

ClusterIP

The Service should not be:

NodePort
LoadBalancer
Terminal window
kubectl get deployment cloudnova-web -n cloudnova-lab -o yaml

Locate:

resources:
requests:
limits:

Resource controls help reduce resource exhaustion risks.

Check 4 — Review the Default Service Account

Section titled “Check 4 — Review the Default Service Account”
Terminal window
kubectl get serviceaccounts -n cloudnova-lab

Expected result:

default

The workload currently uses the default Service Account.

In production, dedicated Service Accounts should be created with minimum permissions.

Terminal window
kubectl get deployment cloudnova-web -n cloudnova-lab -o yaml

Search for:

securityContext

The current Deployment does not yet contain a complete security context.

Record this as a security improvement opportunity.

Later modules will implement controls such as:

  • runAsNonRoot
  • allowPrivilegeEscalation: false
  • Read-only root filesystem
  • Dropped Linux capabilities
  • Seccomp profiles
Terminal window
kubectl auth can-i --list -n cloudnova-lab

This displays the actions your current identity can perform.

Because this is a local administrative lab cluster, your current context will likely have extensive permissions.

Production users should not receive unrestricted cluster administration permissions.

Terminal window
kubectl api-resources

Observe the number of Kubernetes resource types controlled through the API Server.

This demonstrates why API access must be protected.

Cluster events help with troubleshooting and security investigations.

Terminal window
kubectl get events -n cloudnova-lab --sort-by=.metadata.creationTimestamp
Terminal window
kubectl get events --all-namespaces --sort-by=.metadata.creationTimestamp

Review events related to:

  • Pod scheduling
  • Image pulling
  • Container creation
  • Pod termination
  • Replica creation
  • Scaling
Terminal window
kubectl get pods -n cloudnova-lab
Terminal window
kubectl logs <POD-NAME> -n cloudnova-lab

Replace <POD-NAME> with a running Pod.

After accessing the application through port forwarding, the log may contain an HTTP request similar to:

GET / HTTP/1.1
Terminal window
kubectl logs deployment/cloudnova-web -n cloudnova-lab

Logs provide valuable information during troubleshooting and incident investigations.

Capture evidence for the following items.

Terminal window
docker version
kubectl version --client
kind version
Terminal window
kind get clusters
kubectl config current-context
kubectl cluster-info
Terminal window
kubectl get nodes -o wide
Terminal window
kubectl get pods -n kube-system -o wide
Terminal window
kubectl get namespace cloudnova-lab --show-labels
Terminal window
kubectl get all -n cloudnova-lab
Terminal window
kubectl describe deployment cloudnova-web -n cloudnova-lab
Terminal window
kubectl get service cloudnova-web-service -n cloudnova-lab

Capture the NGINX page displayed at:

http://localhost:8080

Capture the replacement Pod created after deleting the original Pod.

Task 23 — Complete the Security Assessment

Section titled “Task 23 — Complete the Security Assessment”

Create a file named:

initial-security-assessment.md

Use the following template:

# CloudNova Kubernetes Initial Security Assessment
## Environment
- Cluster name:
- Cluster type:
- Number of Control Plane nodes:
- Number of Worker Nodes:
- Kubernetes context:
## Implemented Controls
- Dedicated application Namespace:
- Namespace labels:
- Internal ClusterIP Service:
- Resource requests:
- Resource limits:
- Multiple application replicas:
- Control Plane workload separation:
## Identified Security Gaps
- Dedicated Service Account:
- Pod security context:
- Network Policy:
- RBAC restrictions:
- Image vulnerability scanning:
- Runtime security monitoring:
- Secrets management:
- Audit logging review:
## Risk Summary
Describe the primary risks that would need to be addressed before this environment could be used for production workloads.
## Recommended Next Actions
1.
2.
3.
4.
5.
## Assessment Status
- Suitable for local learning:
- Suitable for development:
- Suitable for production:

Your conclusion should recognise that the cluster is:

Suitable for local learning and controlled development testing.

It is not yet suitable for production because additional controls are required.

Task 24 — Clean Up the Application Resources

Section titled “Task 24 — Clean Up the Application Resources”

Before deleting the complete cluster, remove the application resources individually.

Terminal window
kubectl delete -f .\nginx-service.yaml
Terminal window
kubectl delete -f nginx-service.yaml
Terminal window
kubectl delete -f .\nginx-deployment.yaml
Terminal window
kubectl delete -f nginx-deployment.yaml
Terminal window
kubectl delete namespace cloudnova-lab
Terminal window
kubectl get namespace cloudnova-lab

Expected result:

NotFound
Terminal window
kind delete cluster --name cloudnova-security-lab

Expected result:

Deleted nodes:
cloudnova-security-lab-control-plane
cloudnova-security-lab-worker
Terminal window
kind get clusters

The cluster should no longer appear.

Step 3 — Confirm Docker Containers Were Removed

Section titled “Step 3 — Confirm Docker Containers Were Removed”
Terminal window
docker ps

The kind Control Plane and Worker Node containers should no longer be running.

Error:

docker is not recognized

Resolution:

  • Confirm Docker Desktop is installed.
  • Restart the terminal.
  • Restart Docker Desktop.
  • Confirm Docker is included in the system PATH.

Error:

Cannot connect to the Docker daemon

Resolution:

  • Start Docker Desktop.
  • Wait for the engine to report that it is running.
  • Run docker version again.

Error:

kind is not recognized

Resolution:

  • Close and reopen PowerShell.
  • Confirm installation using winget list.
  • Check whether the kind executable is in the system PATH.

Possible causes:

  • Docker Desktop is not running
  • Insufficient memory
  • Virtualisation is disabled
  • Previous cluster resources exist
  • Security software is blocking Docker networking

Check:

Terminal window
docker ps
kind get clusters

Delete a failed cluster:

Terminal window
kind delete cluster --name cloudnova-security-lab

Then retry:

Terminal window
kind create cluster --config kind-cluster.yaml

Check:

Terminal window
kubectl get nodes
kubectl get pods -n kube-system
kubectl describe node cloudnova-security-lab-worker

Wait for system Pods to finish starting.

Docker Desktop may require additional CPU or memory.

Check:

Terminal window
kubectl describe pod <POD-NAME> -n cloudnova-lab

Review the Events section for:

  • Scheduling failures
  • Resource shortages
  • Image pull errors
  • Node readiness issues

Check:

Terminal window
kubectl describe pod <POD-NAME> -n cloudnova-lab

Confirm:

  • Internet access is available
  • Docker can reach the image registry
  • The image name is correct

Use another local port:

Terminal window
kubectl port-forward service/cloudnova-web-service 8081:80 -n cloudnova-lab

Open:

http://localhost:8081

Confirm that you successfully completed the following:

  • Verified hardware virtualisation
  • Started Docker Desktop
  • Verified Docker
  • Installed or verified kubectl
  • Installed kind
  • Created the lab workspace
  • Created the kind cluster configuration
  • Built the Kubernetes cluster
  • Verified the Control Plane and Worker Node
  • Inspected Kubernetes system components
  • Created the cloudnova-lab Namespace
  • Applied enterprise Namespace labels
  • Deployed the NGINX application
  • Verified two running Pods
  • Created a ClusterIP Service
  • Accessed the application using port forwarding
  • Tested Kubernetes self-healing
  • Scaled the Deployment
  • Performed the initial security review
  • Collected the required evidence
  • Completed the security assessment
  • Removed the application resources
  • Deleted the Kubernetes cluster

What does kind use to create Kubernetes nodes?

  • A. Physical servers
  • B. Docker containers
  • C. AWS Lambda functions
  • D. Virtual private networks

Answer: B

Which tool communicates with the Kubernetes API Server?

  • A. Git
  • B. Docker Compose
  • C. kubectl
  • D. Visual Studio Code

Answer: C

Why was the application deployed into a dedicated Namespace?

  • A. To make the image smaller
  • B. To provide logical organisation and separation
  • C. To replace the Worker Node
  • D. To encrypt all network traffic

Answer: B

Which Kubernetes object maintained the required number of application Pods?

  • A. Service
  • B. ConfigMap
  • C. ReplicaSet
  • D. Namespace

Answer: C

Why was a ClusterIP Service selected?

  • A. To expose the application publicly
  • B. To provide an internal stable endpoint
  • C. To create a Worker Node
  • D. To store application data

Answer: B

What happened when one Pod was deleted?

  • A. The complete cluster stopped.
  • B. Kubernetes created a replacement Pod.
  • C. The Namespace was deleted.
  • D. The Service became a LoadBalancer.

Answer: B

Which identified security gap should be addressed in a later workload-hardening lab?

  • A. Kubernetes does not support containers.
  • B. The Deployment lacks a complete Pod security context.
  • C. The cluster contains a Worker Node.
  • D. The application uses a Service.

Answer: B

By completing this lab, you practised:

  • Kubernetes cluster provisioning
  • Kubernetes command-line administration
  • Control Plane inspection
  • Worker Node inspection
  • Namespace management
  • Deployment management
  • ReplicaSet inspection
  • Pod troubleshooting
  • Service configuration
  • Port forwarding
  • Self-healing validation
  • Resource configuration review
  • Basic Kubernetes security assessment
  • Evidence collection
  • Secure resource cleanup

In this lab, you built your first Kubernetes cluster for CloudNova Technologies.

You created a two-node cluster containing a Control Plane and Worker Node, inspected the Kubernetes system components, deployed a containerised application, created an internal Service, validated self-healing, and completed an initial security review.

You also identified several controls that must be implemented before the cluster could support production workloads, including:

  • Dedicated Service Accounts
  • RBAC restrictions
  • Pod security contexts
  • Network Policies
  • Image vulnerability scanning
  • Runtime monitoring
  • Secrets management
  • Audit log analysis

This cluster-building experience provides the foundation for every Kubernetes security assessment, hardening activity, and incident investigation you will perform later in the learning path.

In the next lab, you will deploy an application using stronger workload controls and begin applying security principles directly to Kubernetes resources.

➡️ Next Lab: Lab 02 — Deploy Your First Secure Application