242 lines
5.7 KiB
Terraform
242 lines
5.7 KiB
Terraform
resource "kubernetes_namespace" "argocd" {
|
|
metadata {
|
|
name = "argocd"
|
|
labels = {
|
|
"pod-security.kubernetes.io/enforce" = "baseline"
|
|
"pod-security.kubernetes.io/enforce-version" = "latest"
|
|
}
|
|
}
|
|
}
|
|
|
|
# Copy homelab-ca-secret from cert-manager to argocd namespace
|
|
# (Required for repo-server pod to verify self-signed forgejo TLS)
|
|
resource "null_resource" "copy_ca_secret_to_argocd" {
|
|
provisioner "local-exec" {
|
|
command = <<-EOT
|
|
kubectl get secret homelab-ca-secret -n cert-manager -o yaml | \
|
|
sed 's/namespace: cert-manager/namespace: argocd/' | \
|
|
kubectl apply -f -
|
|
EOT
|
|
}
|
|
|
|
depends_on = [
|
|
kubernetes_namespace.argocd
|
|
]
|
|
}
|
|
|
|
resource "helm_release" "argocd" {
|
|
name = "argocd"
|
|
repository = local.helm_repos["argo"]
|
|
chart = "argo-cd"
|
|
version = "7.3.3"
|
|
namespace = kubernetes_namespace.argocd.metadata[0].name
|
|
|
|
values = [
|
|
yamlencode({
|
|
global = {
|
|
domain = "argocd.${var.cluster_domain}"
|
|
}
|
|
configs = {
|
|
params = {
|
|
"application.instanceLabelKey" = "argocd.argoproj.io/instance"
|
|
}
|
|
rbac = {
|
|
"policy.default" = "role:readonly"
|
|
}
|
|
cmp = {
|
|
create = true
|
|
plugins = {
|
|
sops = {
|
|
allowConcurrency = false
|
|
discover = {
|
|
fileName = "*.enc.yaml"
|
|
}
|
|
generate = {
|
|
command = ["sh", "-c"]
|
|
args = ["sops -d \"$ARGOCD_ENV_FILE_PATH\""]
|
|
}
|
|
lockRepo = false
|
|
}
|
|
}
|
|
}
|
|
}
|
|
server = {
|
|
extraArgs = [
|
|
"--tls-cert-file=/etc/argocd/server.crt",
|
|
"--tls-key-file=/etc/argocd/server.key"
|
|
]
|
|
ingress = {
|
|
enabled = true
|
|
hosts = [
|
|
"argocd.${var.cluster_domain}"
|
|
]
|
|
annotations = {
|
|
"nginx.ingress.kubernetes.io/backend-protocol" = "HTTPS"
|
|
}
|
|
ingressClassName = "nginx"
|
|
}
|
|
service = {
|
|
type = "ClusterIP"
|
|
port = 443
|
|
}
|
|
volumeMounts = [
|
|
{
|
|
name = "server-tls"
|
|
mountPath = "/etc/argocd"
|
|
readOnly = true
|
|
}
|
|
]
|
|
}
|
|
repoServer = {
|
|
autoscaling = {
|
|
enabled = true
|
|
minReplicas = 2
|
|
}
|
|
env = [
|
|
{
|
|
name = "GIT_SSL_CAINFO"
|
|
value = "/etc/ssl/certs/homelab-ca.crt"
|
|
},
|
|
{
|
|
name = "SOPS_AGE_KEY_FILE"
|
|
value = "/home/argocd/.sops/keys.txt"
|
|
}
|
|
]
|
|
volumes = [
|
|
{
|
|
name = "homelab-ca"
|
|
secret = {
|
|
secretName = "homelab-ca-secret"
|
|
}
|
|
},
|
|
{
|
|
name = "sops-age"
|
|
secret = {
|
|
secretName = "sops-age"
|
|
defaultMode = 384
|
|
}
|
|
}
|
|
]
|
|
volumeMounts = [
|
|
{
|
|
name = "homelab-ca"
|
|
mountPath = "/etc/ssl/certs/homelab-ca.crt"
|
|
subPath = "tls.crt"
|
|
},
|
|
{
|
|
name = "sops-age"
|
|
mountPath = "/home/argocd/.sops"
|
|
readOnly = true
|
|
}
|
|
]
|
|
}
|
|
volumes = [
|
|
{
|
|
name = "server-tls"
|
|
secret = {
|
|
secretName = "homelab-tls"
|
|
defaultMode = 420
|
|
}
|
|
}
|
|
]
|
|
controller = {
|
|
replicas = 2
|
|
}
|
|
})
|
|
]
|
|
|
|
depends_on = [
|
|
kubernetes_namespace.argocd,
|
|
null_resource.copy_ca_secret_to_argocd
|
|
]
|
|
|
|
# Note: lifecycle.ignore_changes removed to allow CA cert update
|
|
# This allows TF to inject the homelab-ca-secret for TLS verification
|
|
}
|
|
|
|
resource "kubernetes_manifest" "argocd_project" {
|
|
manifest = {
|
|
apiVersion = "argoproj.io/v1alpha1"
|
|
kind = "AppProject"
|
|
metadata = {
|
|
name = "homelab"
|
|
namespace = kubernetes_namespace.argocd.metadata[0].name
|
|
}
|
|
spec = {
|
|
sourceRepos = [
|
|
"https://forgejo.riotpiao.homelab.com/riotpiao.com/*",
|
|
"https://charts.goauthentik.io",
|
|
"https://prometheus-community.github.io/helm-charts",
|
|
"https://grafana.github.io/helm-charts",
|
|
"https://grafana.github.io/loki/charts",
|
|
"https://charts.min.io/",
|
|
"https://strimzi.io/charts/",
|
|
"https://open-telemetry.github.io/opentelemetry-helm-charts"
|
|
]
|
|
destinations = [
|
|
{
|
|
server = "https://kubernetes.default.svc"
|
|
namespace = "*"
|
|
}
|
|
]
|
|
clusterResourceWhitelist = [
|
|
{
|
|
group = "*"
|
|
kind = "*"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
|
|
field_manager {
|
|
name = "terraform"
|
|
}
|
|
|
|
depends_on = [
|
|
helm_release.argocd
|
|
]
|
|
}
|
|
|
|
resource "kubernetes_manifest" "argocd_root_app" {
|
|
manifest = {
|
|
apiVersion = "argoproj.io/v1alpha1"
|
|
kind = "Application"
|
|
metadata = {
|
|
name = "homelab-root"
|
|
namespace = kubernetes_namespace.argocd.metadata[0].name
|
|
}
|
|
spec = {
|
|
project = kubernetes_manifest.argocd_project.manifest.metadata.name
|
|
source = {
|
|
repoURL = "https://forgejo.riotpiao.homelab.com/riotpiao.com/homelab.git"
|
|
targetRevision = "main"
|
|
path = "k8s/argocd/apps"
|
|
directory = {
|
|
recurse = true
|
|
}
|
|
}
|
|
destination = {
|
|
server = "https://kubernetes.default.svc"
|
|
namespace = kubernetes_namespace.argocd.metadata[0].name
|
|
}
|
|
syncPolicy = {
|
|
automated = {
|
|
prune = true
|
|
selfHeal = true
|
|
}
|
|
syncOptions = [
|
|
"CreateNamespace=true"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
|
|
field_manager {
|
|
name = "terraform"
|
|
}
|
|
|
|
depends_on = [
|
|
kubernetes_manifest.argocd_project
|
|
]
|
|
}
|