Gourav's CLCY level 2
11 / 8 / 2026
CL domain
1. Working with Git and GitHub Basics
Task Overview
Successfully completed the foundational Git and GitHub task. This task provided practical, hands-on experience in version control, managing distributed repositories, and executing standard collaborative workflows.
Key Implementations
- Version Control: Cloned repositories, created isolated feature branches, and managed staging environments.
- Advanced Git Operations: Successfully resolved upstream commit history mismatches utilizing
git fetch,git reset --mixed, and force pushing to align local branches with the main repository. - Open Source Contribution: Actively claimed and resolved an open issue (Issue #3) on the
consiliumrepository.
.png?raw=true)
Contribution Details
- Infrastructure as Code: Built a
Dockerfilefor a Python FastAPI server and configured adocker-compose.ymlto orchestrate the API alongside an Ollama LLM container. - Documentation: Updated the project's
README.mdwith clear, containerized deployment instructions. - Outcome: Successfully submitted a Pull Request (PR) to the upstream repository.
.png?raw=true)
.png?raw=true)
2. Exploring Docker Fundamentals
Objective
Successfully completed the task on Docker fundamentals, establishing a solid understanding of containerized environments crucial for cloud architecture and secure deployments.
Containers vs. Virtual Machines
The primary theoretical outcome involved differentiating between legacy and modern infrastructure paradigms:
- Virtual Machines (VMs): VMs operate on top of a hypervisor and require a complete, isolated Guest Operating System for every single application. This architecture makes them heavily resource-intensive, consuming substantial memory and resulting in slower boot times.
- Containers: Containers bypass the need for a Guest OS by directly sharing the host machine's operating system kernel. This modern approach renders them exceptionally lightweight, highly portable, and capable of booting in milliseconds, ensuring consistent performance from development to production.
Docker CLI & Lifecycle Management
Practical execution involved utilizing the Docker CLI to manage an nginx web server through its complete lifecycle:
- Image Retrieval: Executed
docker pull nginxto securely fetch the standalone, executable software blueprint from the Docker Hub registry. - Deployment & Execution: Utilized
docker run -d -p 8080:80 --name my_web_server nginxto initialize the container in detached mode, actively mapping local machine ports to expose the web service. - Inspection & Monitoring: Employed
docker psto inspect active container states, verifying uptime and port configurations. Useddocker logs my_web_serverto monitor internal HTTP traffic and verify process health. - Lifecycle Teardown: Maintained local system hygiene by executing
docker stopto gracefully halt the running process, followed immediately bydocker rmto permanently delete the container instance.
.png?raw=true)
.png?raw=true)
.png?raw=true)
3. Dockerize a Simple Application
1. Task Objective
The goal of this task was to learn Dockerfile basics, containerize a simple Node.js API application, build the Docker image, run it as a container locally, and verify successful deployment via the browser.
2. Writing the Dockerfile
To containerize the application, a Dockerfile was created at the root of the project. A lightweight base image, node:18-alpine, was selected. The file sets the working directory to /app, copies the package.json file, and runs npm install to install dependencies. Afterwards, the remaining application files (index.js) were copied into the container. The Dockerfile exposes port 3000 and defines the startup command using CMD ["npm", "start"].
3. Building the Docker Image and Understanding Layers
The Docker image was built using the command docker build -t my-simple-app .. During the build process, the concept of image layers became evident. Each instruction in the Dockerfile (like FROM, WORKDIR, COPY, and RUN) created a discrete, read-only layer. By copying package.json and running npm install before copying the rest of the application code, Docker caches the dependency layer. This optimization ensures that subsequent builds are significantly faster if only the application code changes.
4. Running the Container and Port Mapping
The container was executed in detached mode using docker run -d -p 8080:3000 --name running-app my-simple-app. A crucial part of this step was mapping the ports. The -p 8080:3000 flag mapped port 8080 on the host machine to port 3000 inside the isolated container, establishing a bridge for external traffic to reach the application.
5. Verification
The deployment was verified by navigating to http://localhost:8080 in a web browser, successfully displaying the starter code's API response: "Task 3 Complete! Hello from Docker inside my container!". The application is fully containerized and operational.
.png?raw=true)
.png?raw=true)
.png?raw=true)
Task 4: Launch and manage an AWS EC2 Instance
Objective Overview
- Provision and manage a live AWS EC2 virtual machine to transition from local development to cloud infrastructure.
- Configure secure remote access and deploy a lightweight web server (Nginx) accessible via a public IP.
Implementation Summary
- AWS Setup: Resolved initial billing e-mandate loops to successfully activate the AWS Free Tier console.
- Provisioning: Launched a
t3.microinstance running the Amazon Linux operating system. - Security & Access: Configured the AWS Security Group to explicitly allow inbound traffic on Ports 22 (SSH) and 80 (HTTP).
- Troubleshooting Permissions: Overcame Windows NTFS and OneDrive permission conflicts by disabling file inheritance and strictly limiting
.pemread access to a single user profile. - Deployment: Connected securely via SSH using the
ec2-userprofile, installed the Nginx web server via thednfpackage manager, and successfully verified public web access. - Cleanup: Terminated the instance and its attached storage volumes to ensure zero ongoing costs.

Concepts Mastered
- IaaS Fundamentals: Gained practical, hands-on experience provisioning and configuring raw cloud compute resources.
- Compute Mechanics: Understood the
t3.microburstable CPU credit system and its fixed memory constraints. - Network Security: Mastered using AWS Security Groups as stateful, virtual firewalls to enforce the principle of least privilege.
- Cryptographic Authentication: Transitioned from traditional password-based logins to highly secure asymmetric key-pair (
.pem) remote access.


Task 5: Kubernetes Basics and Writing Pod Specs
1. Objective Overview
The goal of this task was to understand core Kubernetes concepts, configure a local Minikube environment, write a YAML manifest to deploy an Nginx container, and interact with the cluster using kubectl commands.
2. Core Concepts Mastered
- Cluster: The overarching system of machines running Kubernetes.
- Control Plane: The management layer that orchestrates the cluster, dictates container placement, and monitors overall health.
- Nodes: The virtual or physical worker machines that execute the workloads.
- Pods: The smallest deployable unit in Kubernetes, acting as an environment wrapper around one or more containers (e.g., an Nginx web server).
3. Writing the Pod Specification
Created a declarative manifest file (nginx-pod.yaml) to define the desired state of the Pod:
apiVersion&kind: Specified that the resource to be created is aPod.metadata: Assigned the identifiable namemy-first-nginxand applied organizational labels.spec: Defined the container configuration, instructing the cluster to pull the officialnginx:latestimage and exposecontainerPort: 80.
4. Key Commands Executed
minikube start: Initialized the local single-node cluster.kubectl apply -f nginx-pod.yaml: Deployed the Pod directly into the cluster.kubectl get pods: Monitored the real-time status of active Pods.kubectl describe pod my-first-nginx: Inspected the Pod's lifecycle events, image pulling status, and internal configuration details.kubectl logs my-first-nginx: Accessed the container's output logs for diagnostic purposes.kubectl delete pod my-first-nginx&minikube stop: Cleaned up the deployed resources and safely powered down the local cluster to free system memory.
.png?raw=true)
.png?raw=true)
.png?raw=true)
Task 6: Manage AWS S3 and IAM with CLI
Task Objective
To configure the AWS Command Line Interface (CLI), implement secure Identity and Access Management (IAM) practices, and manage Amazon S3 object storage directly from the terminal.
IAM Security & Authentication
- User Creation: Created a dedicated IAM User specifically for programmatic access, ensuring the root AWS account remains secure.
- Policy Management: Assigned necessary S3 access policies to the IAM user to authorize specific cloud operations.
- CLI Configuration: Generated an Access Key ID and Secret Access Key, and used
aws configureto authenticate the Kali Linux terminal with AWS.
S3 Bucket Provisioning
- Global Naming Constraints: Navigated S3's global namespace requirements by resolving a
BucketAlreadyExistserror to secure a unique bucket identifier. - Bucket Creation: Successfully utilized the
aws s3 mbcommand to provision a new storage bucket hosted in theap-south-1region.
Object Operations & Data Lifecycle
- Uploading: Created a local test file and pushed it to the cloud container using
aws s3 cp. - Verification: Queried the cloud environment using
aws s3 lsto confirm the object was successfully stored. - Retrieval & Cleanup: Downloaded the object back to the local filesystem, followed by securely deleting the cloud copy using
aws s3 rm.
Key Takeaways
Successfully bridged local command-line operations with AWS infrastructure, gaining practical experience in automated cloud storage management and programmatic identity verification.
.png?raw=true)
.png?raw=true)
Task 7: Deploy a Containerized Application on Kubernetes
Overview
This report details the deployment of a containerized Nginx application to a Kubernetes cluster using YAML manifests. The application was exposed both internally and externally, and dynamic scaling was verified.
1. Deployment Creation
I created a Kubernetes Deployment manifest (deployment.yaml) to manage application.
- Image used:
nginx:latest - Replicas: Initially set to 3 to ensure high availability.
- Result: The deployment successfully pulled the Docker image and spun up 3 identical Pods running the application.
2. Exposing the Application
To make the application accessible, I created a Service manifest (service.yaml).
- Service Type:
NodePort. This type of service inherently satisfies two networking requirements:- ClusterIP: It creates an internal IP address so other resources inside the Kubernetes cluster can communicate with the app.
- NodePort: It maps an external port (
30080) on the node directly to the internal pods, allowing to access the application via a web browser from our local machine.
- Validation: The Nginx welcome page was successfully accessed via the exposed NodePort URL.
3. Scaling Operations
Interacted with the Kubernetes control plane using kubectl to dynamically scale the application without downtime.
- Scaling Up: Scaled the deployment to 5 replicas (
kubectl scale deployment/my-nginx-app --replicas=5). Kubernetes instantly scheduled and started 2 additional pods. - Scaling Down: Scaled the deployment back down to 2 replicas (
kubectl scale deployment/my-nginx-app --replicas=2). Kubernetes gracefully terminated 3 of the pods.
Conclusion
The application was successfully containerized, deployed, networked, and scaled using declarative YAML manifests and kubectl commands, fulfilling all expected task outcomes.
.png?raw=true)
.png?raw=true)
To see full report CLICK HERE
