Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 9 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -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
Expand Down
90 changes: 89 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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 <URL>
```

Expected response:

```text
Hello, World!
```

Health check

```bash
curl <URL>/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
22 changes: 22 additions & 0 deletions terraform/.terraform.lock.hcl

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

19 changes: 19 additions & 0 deletions terraform/main.tf
Original file line number Diff line number Diff line change
@@ -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
]
}
14 changes: 14 additions & 0 deletions terraform/outputs.tf
Original file line number Diff line number Diff line change
@@ -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
}
4 changes: 4 additions & 0 deletions terraform/providers.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
provider "kubernetes" {
config_path = pathexpand("~/.kube/config")
config_context = "http-server-devops"
}
10 changes: 10 additions & 0 deletions terraform/versions.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
terraform {
required_version = ">=1.6.0"

required_providers {
kubernetes = {
source = "hashicorp/kubernetes"
version = "~> 2.36"
}
}
}
Loading