This project showcases proficiency in Kubernetes and containerization, demonstrating the ability to deploy, scale, and manage web applications efficiently in a Kubernetes environment.
- Overview
- Project Structure
- Kubernetes Manifests (for non Helm deployment)
- Helm Chart
- GitHub Actions Workflow
- Deployment Instructions
- Testing and Verification
- Acknowledgments
The Kubernetes Challenge is a spin-off of the Cloud Resume Challenge (CRC), focusing on Kubernetes proficiency and containerization skills. It aims to highlight the ability to deploy, scale, and manage web applications in a Kubernetes environment with a streamlined approach using Helm and GitHub Actions.
- Helm/: Contains Helm chart for deploying the application and database.
- Chart.yaml: Metadata about the Helm chart.
- templates/: Contains Kubernetes resource templates.
- db-connection-string.yaml: ConfigMap for storing the database connection string.
- db-init-script.yaml: ConfigMap for initializing the database schema and data.
- feature-toggle-config.yaml: ConfigMap for enabling feature toggles, such as dark mode.
- hpa.yaml: Horizontal Pod Autoscaler configuration for autoscaling the application based on CPU utilization.
- k8s-challenge-app-service.yaml: Service configuration for exposing the application.
- k8s-challenge-app.yaml: Deployment configuration for the web application.
- mariadb-deployment.yaml: Deployment configuration for MariaDB.
- mariadb-pvc.yaml: PersistentVolumeClaim for data persistence.
- mariadb-root-password.yaml: Secret for storing the root password of the MariaDB database.
- mariadb-service.yaml: Service configuration for exposing the MariaDB service.
- values.yaml: Default configuration values for the Helm chart.
- Kubernetes/: Contains Kubernetes manifests for deploying the application and database.
- db-connection-string.yaml: ConfigMap for storing the database connection string.
- db-init-script.yaml: ConfigMap for initializing the database schema and data.
- feature-toggle-config.yaml: ConfigMap for enabling feature toggles, such as dark mode.
- hpa.yaml: Horizontal Pod Autoscaler configuration for autoscaling the application based on CPU utilization.
- k8s-challenge-app-service.yaml: Service configuration for exposing the application.
- k8s-challenge-app.yaml: Deployment configuration for the web application.
- mariadb-deployment.yaml: Deployment configuration for MariaDB.
- mariadb-pvc.yaml: PersistentVolumeClaim for data persistence.
- mariadb-root-password.yaml: Secret for storing the root password of the MariaDB database.
- mariadb-service.yaml: Service configuration for exposing the MariaDB service.
- src/: Source code files for the application.
- Dockerfile: Dockerfile for containerizing the application.
- .github/workflows/deploy.yml: GitHub Actions workflow for CI/CD automation.
- README.md: Project documentation.
The Kubernetes manifests provide an alternative way to deploy the application and its dependencies without using Helm. These manifests are located in the Kubernetes/
directory and define the necessary Kubernetes resources such as Deployments, Services, ConfigMaps, and Secrets.
Each file in the Kubernetes/
directory corresponds to a specific Kubernetes resource. For example, deployment.yaml
defines a Deployment for the application, service.yaml
defines a Service to expose the application, and so on.
These manifests are written in YAML and follow the Kubernetes API schema. They can be applied to a Kubernetes cluster using the kubectl apply
command.
While using Kubernetes manifests directly provides more control and visibility into each resource, it lacks some of the conveniences of Helm such as parameterization and release management. Therefore, it's recommended for users who are more comfortable with Kubernetes and prefer to manage resources manually.
The Helm chart simplifies the deployment and management of Kubernetes resources. It includes templates for all Kubernetes manifests and allows for parameterization through values.yaml.
The GitHub Actions workflow automates the build, publish, and deployment process to GKE, ensuring an efficient CI/CD pipeline. For detailed workflow, see the deploy.yml file.
- Checkout Code: Checks out the code from the repository.
- Authenticate with Google Cloud: Authenticates to Google Cloud using workload identity federation.
- Set up Docker Buildx: Sets up Docker Buildx for multi-platform builds.
- Cache Docker Layers: Caches Docker layers to speed up subsequent builds.
- Log in to Docker Hub: Authenticates to Docker Hub to push images.
- Set up GKE Credentials: Retrieves GKE credentials for kubectl.
- Build and Push Docker Image: Builds and pushes the Docker image to Docker Hub.
- Deploy to GKE: Updates the Kubernetes deployment with the new Docker image.
- Ensure Helm is installed on your local machine.
- Navigate to the Helm chart directory:
cd Helm/
- Package the Helm chart:
helm package .
- Install or upgrade the Helm release:
helm upgrade --install <release-name> . --namespace <namespace> --create-namespace
- Application and Database Deployment:
- The Helm chart deploys both the application and the MariaDB database with appropriate configuration, ensuring seamless integration and scalability.
If you prefer not to use Helm for deployment, you can use the Kubernetes manifests directly. These are located in the Kubernetes/
directory. Here are the steps to deploy using kubectl:
-
Set up the Kubernetes environment:
- Ensure
kubectl
is installed and configured to interact with your Kubernetes cluster.
- Ensure
-
Navigate to the Kubernetes directory:
cd Kubernetes/
-
Apply the Kubernetes manifests:
- Apply the ConfigMaps:
kubectl apply -f db-connection-string.yaml kubectl apply -f db-init-script.yaml kubectl apply -f feature-toggle-config.yaml
- Apply the Deployments and Services:
kubectl apply -f k8s-challenge-app.yaml kubectl apply -f k8s-challenge-app-service.yaml kubectl apply -f mariadb-deployment.yaml kubectl apply -f mariadb-service.yaml
- Apply the Secret:
kubectl apply -f mariadb-root-password.yaml
- Apply the PersistentVolumeClaim:
kubectl apply -f mariadb-pvc.yaml
- Apply the Horizontal Pod Autoscaler:
kubectl apply -f hpa.yaml
- Apply the ConfigMaps:
-
Verify the deployment:
- Use
kubectl
commands to verify the status of the pods, services, and other resources:kubectl get pods kubectl get services
- Use
Remember to replace any placeholders in the Kubernetes manifests with your actual values before applying them.
Ensure your GitHub repository is configured with the necessary secrets:
GKE_PROJECT
GKE_PROJECT_NUMBER
DOCKER_USERNAME
DOCKER_PASSWORD
The provided workflow file will handle the build, push, and deploy processes automatically upon pushing to the main
branch.
- After deployment, verify the application functionality and health probes using
kubectl
commands:kubectl get pods -n <namespace> kubectl get services -n <namespace> kubectl logs <pod-name> -n <namespace>
- Ensure the Horizontal Pod Autoscaler (HPA) is correctly scaling the application based on CPU utilization.
- Forrest Brazeal for initiating the Cloud Resume Challenge.
- KodeKloud for collaboration on Kubernetes spin-off.