diff --git a/.gitignore b/.gitignore index cf19764..f6b12d7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,15 @@ # Terraform .terraform/ *.tfstate -*.tfstate.backup -.terraform.lock.hcl +*.tfstate.* +crash.log +crash.*.log +*.tfvars +*.tfvars.json +override.tf +override.tf.json +*_override.tf +*_override.tf.json # OS .DS_Store diff --git a/README.md b/README.md index 2a8ee89..a061f7c 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ http-server-devops/ - [x] Task 2: Dockerize - [x] Task 3: CI/CD Pipeline - [x] Task 4: Kubernetes Deployment -- [ ] Task 5: Terraform Configuration +- [x] Task 5: Terraform Configuration ## Installation & Usage @@ -220,3 +220,91 @@ The deployment uses the released image: ```text ghcr.io/aldriondev/http-server-devops:latest ``` + +## Terraform Deployment + +The Kubernetes manifests can also be deployed using Terraform with the Kubernetes provider. + +Terraform uses the local kubeconfig context: + +```text +http-server-devops +``` + +### start minikube + +```bash +minikube start -p http-server-devops +``` + +### Check cluster status + +```bash +minikube status -p http-server-devops +kubectl config current-context +kubectl get nodes +``` + +### Deploy application with Terraform + +```bash +cd terraform +terraform init +terraform validate +terraform plan +terraform apply +``` + +### Check resources + +```bash +kubectl get all -n http-server-devops +``` + +### Access application + +```bash +minikube service http-server -n http-server-devops --url -p http-server-devops +``` + +Use the returned URL: + +```bash +curl +``` + +Expected response: + +```text +Hello, World! +``` + +Health check + +```bash +curl /health +``` + +Expected response: + +```text +ok +``` + +### Destroy resources + +```bash +terraform destroy +``` + +### Delete local cluster + +```bash +minikube delete -p http-server-devops +``` + +The Terraform configuration reuses the kubernetes yaml manifests from k8s/ directory. + +k8s/namespace.yaml +k8s/deployment.yaml +k8s/service.yaml diff --git a/terraform/.terraform.lock.hcl b/terraform/.terraform.lock.hcl new file mode 100644 index 0000000..2744a2e --- /dev/null +++ b/terraform/.terraform.lock.hcl @@ -0,0 +1,22 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/hashicorp/kubernetes" { + version = "2.38.0" + constraints = "~> 2.36" + hashes = [ + "h1:5CkveFo5ynsLdzKk+Kv+r7+U9rMrNjfZPT3a0N/fhgE=", + "zh:0af928d776eb269b192dc0ea0f8a3f0f5ec117224cd644bdacdc682300f84ba0", + "zh:1be998e67206f7cfc4ffe77c01a09ac91ce725de0abaec9030b22c0a832af44f", + "zh:326803fe5946023687d603f6f1bab24de7af3d426b01d20e51d4e6fbe4e7ec1b", + "zh:4a99ec8d91193af961de1abb1f824be73df07489301d62e6141a656b3ebfff12", + "zh:5136e51765d6a0b9e4dbcc3b38821e9736bd2136cf15e9aac11668f22db117d2", + "zh:63fab47349852d7802fb032e4f2b6a101ee1ce34b62557a9ad0f0f0f5b6ecfdc", + "zh:924fb0257e2d03e03e2bfe9c7b99aa73c195b1f19412ca09960001bee3c50d15", + "zh:b63a0be5e233f8f6727c56bed3b61eb9456ca7a8bb29539fba0837f1badf1396", + "zh:d39861aa21077f1bc899bc53e7233262e530ba8a3a2d737449b100daeb303e4d", + "zh:de0805e10ebe4c83ce3b728a67f6b0f9d18be32b25146aa89116634df5145ad4", + "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c", + "zh:faf23e45f0090eef8ba28a8aac7ec5d4fdf11a36c40a8d286304567d71c1e7db", + ] +} diff --git a/terraform/main.tf b/terraform/main.tf new file mode 100644 index 0000000..b89ebe1 --- /dev/null +++ b/terraform/main.tf @@ -0,0 +1,19 @@ +resource "kubernetes_manifest" "namespace" { + manifest = yamldecode(file("${path.module}/../k8s/namespace.yaml")) +} + +resource "kubernetes_manifest" "deployment" { + manifest = yamldecode(file("${path.module}/../k8s/deployment.yaml")) + + depends_on = [ + kubernetes_manifest.namespace + ] +} + +resource "kubernetes_manifest" "service" { + manifest = yamldecode(file("${path.module}/../k8s/service.yaml")) + + depends_on = [ + kubernetes_manifest.deployment + ] +} \ No newline at end of file diff --git a/terraform/outputs.tf b/terraform/outputs.tf new file mode 100644 index 0000000..278e8d8 --- /dev/null +++ b/terraform/outputs.tf @@ -0,0 +1,14 @@ +output "namespace" { + description = "Kubernetes namespace used by the application" + value = kubernetes_manifest.namespace.manifest.metadata.name +} + +output "deployment_name" { + description = "Kubernetes deployment name" + value = kubernetes_manifest.deployment.manifest.metadata.name +} + +output "service_name" { + description = "Kubernetes service name" + value = kubernetes_manifest.service.manifest.metadata.name +} \ No newline at end of file diff --git a/terraform/providers.tf b/terraform/providers.tf new file mode 100644 index 0000000..f216e45 --- /dev/null +++ b/terraform/providers.tf @@ -0,0 +1,4 @@ +provider "kubernetes" { + config_path = pathexpand("~/.kube/config") + config_context = "http-server-devops" +} diff --git a/terraform/versions.tf b/terraform/versions.tf new file mode 100644 index 0000000..b371f3d --- /dev/null +++ b/terraform/versions.tf @@ -0,0 +1,10 @@ +terraform { + required_version = ">=1.6.0" + + required_providers { + kubernetes = { + source = "hashicorp/kubernetes" + version = "~> 2.36" + } + } +} \ No newline at end of file