infra/terraform: add k8s module file for my portfolio
- added k8s module file for my portfolio manifest
This commit is contained in:
9
infra/terraform/.gitignore
vendored
9
infra/terraform/.gitignore
vendored
@ -1,5 +1,6 @@
|
|||||||
.env
|
.env
|
||||||
.terraform/
|
**/.env
|
||||||
.terraform.lock.hcl
|
**/.terraform/
|
||||||
terraform.tfstate
|
**/.terraform.lock.hcl
|
||||||
terraform.tfstate.backup
|
**/terraform.tfstate
|
||||||
|
**/terraform.tfstate.backup
|
||||||
|
|||||||
@ -35,3 +35,5 @@ tofu init
|
|||||||
tofu plan
|
tofu plan
|
||||||
tofu apply
|
tofu apply
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Kubernetes and Helm
|
||||||
|
|||||||
14
infra/terraform/kubernetes/backend.tf
Normal file
14
infra/terraform/kubernetes/backend.tf
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
terraform {
|
||||||
|
backend "s3" {
|
||||||
|
bucket = "terraform-state" # Name of the MinIO bucket
|
||||||
|
key = "proxmox/terraform.tfstate" # Path to the state file in the bucket
|
||||||
|
endpoint = var.minio_endpoint # MinIO API endpoint
|
||||||
|
access_key = var.minio_access_key # MinIO access key
|
||||||
|
secret_key = var.minio_secret_key # MinIO secret key
|
||||||
|
region = "us-east-1" # Arbitrary region (MinIO ignores this)
|
||||||
|
skip_credentials_validation = true # Skip AWS-specific credential checks
|
||||||
|
skip_metadata_api_check = true # Skip AWS metadata API checks
|
||||||
|
skip_region_validation = true # Skip AWS region validation
|
||||||
|
use_path_style = true # Use path-style URLs[](http://<host>/<bucket>)
|
||||||
|
}
|
||||||
|
}
|
||||||
22
infra/terraform/kubernetes/main.tf
Normal file
22
infra/terraform/kubernetes/main.tf
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
terraform {
|
||||||
|
required_providers {
|
||||||
|
kubernetes = {
|
||||||
|
source = "hashicorp/kubernetes"
|
||||||
|
version = "2.37.1"
|
||||||
|
}
|
||||||
|
helm = {
|
||||||
|
source = "hashicorp/helm"
|
||||||
|
version = "3.0.2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
provider "kubernetes" {
|
||||||
|
config_path = "~/.kube/config"
|
||||||
|
}
|
||||||
|
|
||||||
|
provider "helm" {
|
||||||
|
kubernetes {
|
||||||
|
config_path = "~/.kube/config"
|
||||||
|
}
|
||||||
|
}
|
||||||
50
infra/terraform/kubernetes/portfolio.tf
Normal file
50
infra/terraform/kubernetes/portfolio.tf
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
resource "kubernetes_namespace" "portfolio" {
|
||||||
|
metadata {
|
||||||
|
name = "my-portfolio"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "kubernetes_secret" "docker_secret" {
|
||||||
|
metadata {
|
||||||
|
name = "docker-registry-credentials"
|
||||||
|
namespace = "my-portfolio"
|
||||||
|
}
|
||||||
|
|
||||||
|
type = "kubernetes.io/dockerconfigjson"
|
||||||
|
|
||||||
|
data = {
|
||||||
|
".dockerconfigjson" = jsonencode({
|
||||||
|
auths = {
|
||||||
|
"${var.docker_registry_host}" = {
|
||||||
|
username = var.docker_username
|
||||||
|
password = var.docker_password
|
||||||
|
auth = base64encode("${var.docker_username}:${var.docker_password}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
depends_on = [kubernetes_namespace.portfolio]
|
||||||
|
}
|
||||||
|
|
||||||
|
locals {
|
||||||
|
# Read and process the YAML file with placeholders
|
||||||
|
manifest_content = templatefile("../../../kubernetes/my-portfolio/portfolioManifest.yaml", {
|
||||||
|
PORTFOLIO_HOST = var.portfolio_host
|
||||||
|
DOCKER_REGISTRY_HOST = var.docker_registry_host
|
||||||
|
})
|
||||||
|
# Split into individual documents
|
||||||
|
manifest_documents = split("---", replace(local.manifest_content, "/\\n\\s*\\n/", "---"))
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "kubernetes_manifest" "portfolio_manifest" {
|
||||||
|
for_each = { for i, doc in local.manifest_documents : i => doc if trimspace(doc) != "" }
|
||||||
|
|
||||||
|
manifest = yamldecode(each.value)
|
||||||
|
|
||||||
|
field_manager {
|
||||||
|
force_conflicts = true
|
||||||
|
}
|
||||||
|
|
||||||
|
depends_on = [kubernetes_namespace.portfolio]
|
||||||
|
}
|
||||||
35
infra/terraform/kubernetes/variables.tf
Normal file
35
infra/terraform/kubernetes/variables.tf
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
# variables for minio backend configuration
|
||||||
|
variable "minio_access_key" {
|
||||||
|
description = "MinIO access key"
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "minio_secret_key" {
|
||||||
|
description = "MinIO secret key"
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "minio_endpoint" {
|
||||||
|
description = "MinIO API endpoint"
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "portfolio_host" {
|
||||||
|
description = "Host for the portfolio application"
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "docker_registry_host" {
|
||||||
|
description = "Host for the Docker registry"
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "docker_username" {
|
||||||
|
description = "Docker registry username"
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "docker_password" {
|
||||||
|
description = "Docker registry password"
|
||||||
|
type = string
|
||||||
|
}
|
||||||
@ -213,7 +213,7 @@ registry.
|
|||||||
kubectl create namespace my-portfolio
|
kubectl create namespace my-portfolio
|
||||||
|
|
||||||
source .env
|
source .env
|
||||||
kubectl create secret docker-registry my-registry-secret \
|
kubectl create secret docker-registry docker-registry-credentials \
|
||||||
--docker-server="$DOCKER_REGISTRY_HOST" \
|
--docker-server="$DOCKER_REGISTRY_HOST" \
|
||||||
--docker-username="$DOCKER_USER" \
|
--docker-username="$DOCKER_USER" \
|
||||||
--docker-password="$DOCKER_PASSWORD" \
|
--docker-password="$DOCKER_PASSWORD" \
|
||||||
@ -611,9 +611,10 @@ envsubst < gitea/configMap.yaml | kubectl apply -n gitea -f -
|
|||||||
|
|
||||||
helm upgrade --install gitea gitea-charts/gitea -f gitea/values.yaml \
|
helm upgrade --install gitea gitea-charts/gitea -f gitea/values.yaml \
|
||||||
--namespace gitea \
|
--namespace gitea \
|
||||||
|
--version 10.0.0 \
|
||||||
--atomic \
|
--atomic \
|
||||||
--set ingress.hosts[0].host=$GITEA_HOST \
|
--set ingress.hosts[0].host=$GITEA_HOST \
|
||||||
--set ingress.tls[0].hosts[0]=$DNSNAME \
|
--set ingress.tls[0].hosts[0]=$GITEA_HOST \
|
||||||
--set gitea.admin.username=$GITEA_USER \
|
--set gitea.admin.username=$GITEA_USER \
|
||||||
--set gitea.admin.password=$GITEA_PASSWORD \
|
--set gitea.admin.password=$GITEA_PASSWORD \
|
||||||
--set gitea.admin.email=$GITEA_EMAIL \
|
--set gitea.admin.email=$GITEA_EMAIL \
|
||||||
|
|||||||
@ -15,6 +15,7 @@ gitea:
|
|||||||
email: email
|
email: email
|
||||||
|
|
||||||
image:
|
image:
|
||||||
|
registry: ghcr.io
|
||||||
repository: gitea
|
repository: gitea
|
||||||
tag: 1.23.7
|
tag: 1.23.7
|
||||||
|
|
||||||
@ -45,13 +46,17 @@ resources:
|
|||||||
|
|
||||||
ingress:
|
ingress:
|
||||||
enabled: true
|
enabled: true
|
||||||
|
annotations:
|
||||||
|
kubernetes.io/ingress.class: traefik
|
||||||
|
traefik.ingress.kubernetes.io/router.entrypoints: websecure
|
||||||
|
cert-manager.io/cluster-issuer: "acme-issuer"
|
||||||
hosts:
|
hosts:
|
||||||
- host: git.example.com
|
- host: git.example.com
|
||||||
paths:
|
paths:
|
||||||
- path: /
|
- path: /
|
||||||
pathType: Prefix
|
pathType: Prefix
|
||||||
tls:
|
tls:
|
||||||
- secretName: wildcard-cert-secret
|
- secretName: gitea-tls-cert
|
||||||
hosts:
|
hosts:
|
||||||
- "*.example.com"
|
- "*.example.com"
|
||||||
|
|
||||||
|
|||||||
@ -2,6 +2,7 @@ apiVersion: apps/v1
|
|||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
name: portfolio-app
|
name: portfolio-app
|
||||||
|
namespace: my-portfolio
|
||||||
labels:
|
labels:
|
||||||
app: portfolio-app
|
app: portfolio-app
|
||||||
spec:
|
spec:
|
||||||
@ -15,7 +16,7 @@ spec:
|
|||||||
app: portfolio-app
|
app: portfolio-app
|
||||||
spec:
|
spec:
|
||||||
imagePullSecrets:
|
imagePullSecrets:
|
||||||
- name: my-registry-secret
|
- name: docker-registry-credentials
|
||||||
containers:
|
containers:
|
||||||
- name: portfolio-app
|
- name: portfolio-app
|
||||||
image: "${DOCKER_REGISTRY_HOST}/taqi/portfolio/my-portfolio-app:latest"
|
image: "${DOCKER_REGISTRY_HOST}/taqi/portfolio/my-portfolio-app:latest"
|
||||||
@ -29,6 +30,7 @@ apiVersion: v1
|
|||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
name: portfolio-app-svc
|
name: portfolio-app-svc
|
||||||
|
namespace: my-portfolio
|
||||||
spec:
|
spec:
|
||||||
type: ClusterIP
|
type: ClusterIP
|
||||||
ports:
|
ports:
|
||||||
@ -42,6 +44,7 @@ apiVersion: networking.k8s.io/v1
|
|||||||
kind: Ingress
|
kind: Ingress
|
||||||
metadata:
|
metadata:
|
||||||
name: portfolio
|
name: portfolio
|
||||||
|
namespace: my-portfolio
|
||||||
annotations:
|
annotations:
|
||||||
traefik.ingress.kubernetes.io/router.entrypoints: websecure
|
traefik.ingress.kubernetes.io/router.entrypoints: websecure
|
||||||
cert-manager.io/cluster-issuer: "acme-issuer"
|
cert-manager.io/cluster-issuer: "acme-issuer"
|
||||||
|
|||||||
Reference in New Issue
Block a user