Skip to content

Commit 92d6d16

Browse files
committed
chore: intergrated cert-manager and ingress module to argocd automated deployment
1 parent 82839aa commit 92d6d16

File tree

9 files changed

+233
-20
lines changed

9 files changed

+233
-20
lines changed

argocd/terraform/.gitignore

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# Local .terraform directories
2+
**/.terraform/*
3+
4+
# .tfstate files
5+
*.tfstate
6+
*.tfstate.*
7+
8+
# Crash logs
9+
crash.log
10+
crash.*.log
11+
12+
# Sensitive variable files (where you store your Keycloak credentials)
13+
*.tfvars
14+
*.tfvars.json
15+
override.tf
16+
override.tf.json
17+
_override.tf
18+
_override.tf.json
19+
20+
# Local environment files
21+
.envrc
22+
.env
23+
24+
# MacOS files
25+
.DS_Store
26+
27+
# Helm local cache/logs
28+
.helm/

argocd/terraform/README.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# Modular ArgoCD Deployment with Keycloak OIDC & RBAC
2+
3+
This Terraform module deploys **ArgoCD** into a Kubernetes cluster using the official Helm chart. It is designed to be modular, supporting deployment to different clusters (Control Plane vs. Workload) with toggleable features for **Keycloak (OIDC) integration** and **RBAC (Role-Based Access Control)**.
4+
5+
---
6+
7+
## Directory Structure
8+
9+
```text
10+
.
11+
├── main.tf
12+
├── provider.tf
13+
├── README.md
14+
├── terraform.tfvars # Create this file to include you variables as in the terraform.tfvars.template file
15+
└── variables.tf

argocd/terraform/main.tf

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,15 +79,51 @@ resource "helm_release" "argocd-test" {
7979
"policy.csv" = "g, /ArgoCDAdmins, role:admin"
8080
}
8181
}
82-
server = {
83-
service = {
84-
type = "LoadBalancer"
85-
}
86-
}
8782
})
8883
]
8984
}
9085

86+
87+
# Managing certificate signing and creation
88+
# Cert-Manager Module
89+
module "cert_manager" {
90+
providers = {
91+
kubernetes = kubernetes
92+
helm = helm
93+
}
94+
95+
source = "../../cert-manager/terraform"
96+
97+
install_cert_manager = var.install_cert_manager
98+
cert_manager_version = var.cert_manager_version
99+
release_name = var.cert_manager_release_name
100+
namespace = var.cert_manager_namespace
101+
102+
letsencrypt_email = var.letsencrypt_email
103+
cert_issuer_name = var.cert_issuer_name
104+
cert_issuer_kind = var.cert_issuer_kind
105+
# If Kind is Issuer, it must be in the observability namespace to be used by the ingress in that namespace.
106+
# If Kind is ClusterIssuer, this variable is ignored by the module logic.
107+
issuer_namespace = var.namespace
108+
ingress_class_name = var.ingress_class_name
109+
110+
# Ensure namespace exists before issuer creation (handled inside module)
111+
}
112+
113+
# Setting Up An Ingress Controller
114+
# Ingress Controller Module
115+
module "ingress_nginx" {
116+
source = "../../ingress-controller/terraform"
117+
118+
install_nginx_ingress = var.install_nginx_ingress
119+
nginx_ingress_version = var.nginx_ingress_version
120+
release_name = var.nginx_ingress_release_name
121+
namespace = var.nginx_ingress_namespace
122+
ingress_class_name = var.ingress_class_name
123+
}
124+
125+
126+
91127
# =============================================================================
92128
# OUTPUTS
93129
# =============================================================================

argocd/terraform/provider.tf

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
terraform {
2+
required_providers {
3+
keycloak = {
4+
source = "mrparkers/keycloak"
5+
version = ">= 4.0.0"
6+
}
7+
helm = {
8+
source = "hashicorp/helm"
9+
version = ">= 2.0.0"
10+
}
11+
}
12+
}
13+
14+
# 1. Connect to your EXISTING Keycloak
15+
provider "keycloak" {
16+
client_id = "admin-cli"
17+
url = var.keycloak_url # e.g. https://auth.example.com
18+
username = var.keycloak_user
19+
password = var.keycloak_password
20+
}
21+
22+
23+
24+
# 2. Connect to GKE using your local terminal credentials
25+
provider "helm" {
26+
kubernetes {
27+
config_path = "~/.kube/config"
28+
config_context = var.kube_context # Optional: specify if you have multiple contexts
29+
}
30+
}
31+
32+
provider "kubernetes" {
33+
config_path = "~/.kube/config"
34+
config_context = var.kube_context # Optional: specify if you have multiple contexts
35+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
keycloak_url = "https://keycloak_domain_name"
2+
keycloak_user = "admin"
3+
keycloak_password = "your-strong-secret-password" # this is to authenticate to keycloak
4+
argocd_url = "https://example.com"
5+
target_realm = "master" # or your specific realm
6+
kube_context = "gke_project-id_region_cluster-name"
7+
8+
# For For Setting Up Nginx Loadbalancer
9+
10+
install_nginx_ingress = false
11+
nginx_ingress_release_name = "nginx-monitoring"
12+
nginx_ingress_namespace = "ingress-nginx"
13+
ingress_class_name = "nginx"

argocd/terraform/variables.tf

Lines changed: 82 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,85 @@ variable "kube_context" {
3030
description = "The context name in your kubeconfig (run 'kubectl config current-context')"
3131
type = string
3232
default = "" # If empty, uses current context
33-
}
33+
}
34+
35+
variable "install_nginx_ingress" {
36+
description = "Whether to install NGINX Ingress Controller"
37+
type = bool
38+
default = false
39+
}
40+
41+
variable "nginx_ingress_version" {
42+
description = "Version of ingress-nginx chart"
43+
type = string
44+
default = "4.10.1"
45+
}
46+
47+
variable "nginx_ingress_release_name" {
48+
description = "Helm release name for NGINX Ingress"
49+
type = string
50+
default = "nginx-monitoring"
51+
}
52+
53+
variable "nginx_ingress_namespace" {
54+
description = "Namespace where NGINX Ingress is installed"
55+
type = string
56+
default = "ingress-nginx"
57+
}
58+
59+
variable "ingress_class_name" {
60+
description = "Ingress class to use for all ingress resources (e.g., nginx, traefik, kong). Must match an existing IngressClass in the cluster."
61+
type = string
62+
default = "nginx"
63+
}
64+
65+
variable "install_cert_manager" {
66+
description = "Whether to install cert-manager"
67+
type = bool
68+
default = false
69+
}
70+
71+
variable "cert_manager_version" {
72+
description = "Version of cert-manager chart"
73+
type = string
74+
default = "v1.15.0"
75+
}
76+
77+
variable "namespace" {
78+
description = "Namespace to install cert-manager into"
79+
type = string
80+
default = "cert-manager"
81+
}
82+
83+
variable "letsencrypt_email" {
84+
description = "Email address for Let's Encrypt certificate notifications"
85+
type = string
86+
}
87+
88+
variable "cert_issuer_name" {
89+
description = "Name of the ClusterIssuer or Issuer to create"
90+
type = string
91+
default = "letsencrypt-prod"
92+
}
93+
94+
variable "cert_issuer_kind" {
95+
description = "Kind of Issuer to create (ClusterIssuer or Issuer)"
96+
type = string
97+
default = "ClusterIssuer"
98+
validation {
99+
condition = contains(["ClusterIssuer", "Issuer"], var.cert_issuer_kind)
100+
error_message = "cert_issuer_kind must be either 'ClusterIssuer' or 'Issuer'."
101+
}
102+
}
103+
104+
variable "cert_manager_release_name" {
105+
description = "Helm release name for Cert-Manager"
106+
type = string
107+
default = "cert-manager"
108+
}
109+
110+
variable "cert_manager_namespace" {
111+
description = "Namespace where Cert-Manager is installed"
112+
type = string
113+
default = "cert-manager"
114+
}

cert-manager/terraform/main.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ resource "helm_release" "cert_manager" {
2222
create_namespace = true
2323
version = var.cert_manager_version
2424

25-
set = {
25+
set {
2626
name = "installCRDs"
2727
value = "true"
2828
}

ingress-controller/terraform/main.tf

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,35 +22,35 @@ resource "helm_release" "nginx_ingress" {
2222
create_namespace = true
2323
version = var.nginx_ingress_version
2424

25-
set = [ {
25+
set {
2626
name = "controller.replicaCount"
2727
value = var.replica_count
28-
},
28+
}
2929

30-
{
30+
set {
3131
name = "controller.ingressClassResource.name"
3232
value = var.ingress_class_name
33-
},
33+
}
3434

35-
{
35+
set {
3636
name = "controller.ingressClass"
3737
value = var.ingress_class_name
38-
},
38+
}
3939

40-
{
40+
set {
4141
name = "controller.ingressClassResource.controllerValue"
4242
value = "k8s.io/${var.ingress_class_name}"
43-
},
44-
{
43+
}
44+
set {
4545
name = "controller.ingressClassResource.enabled"
4646
value = "true"
47-
},
47+
}
4848

49-
{
49+
set {
5050
name = "controller.ingressClassByName"
5151
value = "true"
5252
}
53-
]
53+
5454

5555
# Wait for the LoadBalancer to be ready
5656
wait = true

lgtm-stack/terraform/main.tf

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ provider "kubernetes" {
3434
}
3535

3636
provider "helm" {
37-
kubernetes = {
37+
kubernetes {
3838
host = "https://${data.google_container_cluster.primary.endpoint}"
3939
token = data.google_client_config.default.access_token
4040
cluster_ca_certificate = base64decode(data.google_container_cluster.primary.master_auth[0].cluster_ca_certificate)
@@ -155,6 +155,11 @@ resource "google_service_account_iam_member" "workload_identity_binding" {
155155

156156
# Cert-Manager Module
157157
module "cert_manager" {
158+
providers = {
159+
kubernetes = kubernetes
160+
helm = helm
161+
}
162+
158163
source = "../../cert-manager/terraform"
159164

160165
install_cert_manager = var.install_cert_manager

0 commit comments

Comments
 (0)