0

I am working on a new K8s cluster with Terraform, and having problems installing certificate issuer.

Here is my current setup.

sealed-secrets.tf:


# helm repo add sealed-secrets https://bitnami-labs.github.io/sealed-secrets && helm repo update

resource "helm_release" "sealed_secrests" { count = 1 name = "sealed-secrets" namespace = "argocd" repository = "https://bitnami-labs.github.io/sealed-secrets" chart = "sealed-secrets" version = "2.17.1" timeout = 600 create_namespace = true cleanup_on_fail = true

dependency_update = true

verify = true

}

cert-manager.tf:

# helm repo add jetstack https://charts.jetstack.io && helm repo update
data "http" "cert_manager_crds_yaml" {
  url = "https://github.com/cert-manager/cert-manager/releases/download/v1.16.3/cert-manager.crds.yaml"
}

resource "kubectl_manifest" "cert_manager_crds" { yaml_body = data.http.cert_manager_crds_yaml.response_body }

resource "helm_release" "cert_manager" { count = 1 name = "cert-manager" namespace = "cert-manager" repository = "https://charts.jetstack.io" chart = "cert-manager" version = "v1.16.3" timeout = 600 create_namespace = true cleanup_on_fail = true

dependency_update = true

verify = true

values = [ file("values/cert-manager.yaml") ]

depends_on = [kubectl_manifest.cert_manager_crds] }

Cloudflare connection

data "local_file" "cloudflare_api_token_secret_file" { filename = "secrets/cloudflare-api-token-secret.yaml" }

resource "kubectl_manifest" "cloudflare_api_token_secret" { yaml_body = data.local_file.cloudflare_api_token_secret_file.content

depends_on = [ helm_release.cert_manager ] }

data "local_file" "certificate_issuer_manifest_file" { filename = "manifests/cert-issuer.yaml" }

resource "kubectl_manifest" "certificate_issuer" { yaml_body = data.local_file.certificate_issuer_manifest_file.content

depends_on = [ kubectl_manifest.cloudflare_api_token_secret, helm_release.cert_manager ] }

cloudflare-api-token-secret.yaml:

apiVersion: v1
kind: Secret
metadata:
  name: cloudflare-api-token-secret
  namespace: ambassador
type: Opaque
stringData:
  api-token: ********

cert-issuer.yaml:

apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: cloudflare-ambassador-wcard
  namespace: ambassador
spec:
  # ACME issuer configuration:
  # `email` - the email address to be associated with the ACME account (make sure it's a valid one).
  # `server` - the URL used to access the ACME server’s directory endpoint.
  # `privateKeySecretRef` - Kubernetes Secret to store the automatically generated ACME account private key.
  acme:
    email: ****@*****.****
    server: https://acme-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      name: cloudflare-ambassador-wcard-private
    # List of challenge solvers that will be used to solve ACME challenges for the matching domains.
    solvers:
      - dns01:
          cloudflare:
            email: ****@*****.****
            apiTokenSecretRef:
              name: cloudflare-api-token-secret
              key: api-token
        selector:
          dnsNames:
            - '*.priz.guru'
            - 'priz.guru'

Everything is installed as expected until it gets to the Issuer.

Here is the error that I am getting:

2025-01-20T23:34:51.580-0800 [DEBUG] provider.terraform-provider-kubectl_v1.19.0: 2025/01/20 23:34:51 [ERROR] creating manifest failed: ambassador/cloudflare-ambassador-wcard failed to create kubernetes rest client for update of resource: resource [cert-manager.io/v1/Issuer] isn't valid for cluster, check the APIVersion and Kind fields are valid
2025-01-20T23:34:55.286-0800 [DEBUG] provider.terraform-provider-kubectl_v1.19.0: 2025/01/20 23:34:55 [DEBUG] ambassador/cloudflare-ambassador-wcard Unstructed YAML: map[apiVersion:cert-manager.io/v1 kind:Issuer metadata:map[name:cloudflare-ambassador-wcard namespace:ambassador] spec:map[acme:map[email:alex@priz.guru privateKeySecretRef:map[name:cloudflare-ambassador-wcard-private] server:https://acme-v02.api.letsencrypt.org/directory solvers:[map[dns01:map[cloudflare:map[apiTokenSecretRef:map[key:api-token name:cloudflare-api-token-secret] email:alex@priz.guru]] selector:map[dnsNames:[*.priz.guru priz.guru]]]]]]]
2025-01-20T23:34:55.286-0800 [DEBUG] provider.terraform-provider-kubectl_v1.19.0: 2025/01/20 23:34:55 [DEBUG] ambassador/cloudflare-ambassador-wcard apply kubernetes resource:
2025-01-20T23:34:55.286-0800 [DEBUG] provider.terraform-provider-kubectl_v1.19.0: apiVersion: cert-manager.io/v1
2025-01-20T23:34:55.286-0800 [DEBUG] provider.terraform-provider-kubectl_v1.19.0: kind: Issuer
2025-01-20T23:34:55.286-0800 [DEBUG] provider.terraform-provider-kubectl_v1.19.0: metadata:
2025-01-20T23:34:55.286-0800 [DEBUG] provider.terraform-provider-kubectl_v1.19.0:   name: cloudflare-ambassador-wcard
2025-01-20T23:34:55.286-0800 [DEBUG] provider.terraform-provider-kubectl_v1.19.0:   namespace: ambassador
2025-01-20T23:34:55.286-0800 [DEBUG] provider.terraform-provider-kubectl_v1.19.0: spec:
2025-01-20T23:34:55.286-0800 [DEBUG] provider.terraform-provider-kubectl_v1.19.0:   # ACME issuer configuration:
2025-01-20T23:34:55.287-0800 [DEBUG] provider.terraform-provider-kubectl_v1.19.0:   # `email` - the email address to be associated with the ACME account (make sure it's a valid one).
2025-01-20T23:34:55.287-0800 [DEBUG] provider.terraform-provider-kubectl_v1.19.0:   # `server` - the URL used to access the ACME server’s directory endpoint.
2025-01-20T23:34:55.287-0800 [DEBUG] provider.terraform-provider-kubectl_v1.19.0:   # `privateKeySecretRef` - Kubernetes Secret to store the automatically generated ACME account private key.
2025-01-20T23:34:55.287-0800 [DEBUG] provider.terraform-provider-kubectl_v1.19.0:   acme:
2025-01-20T23:34:55.287-0800 [DEBUG] provider.terraform-provider-kubectl_v1.19.0:     email: alex@priz.guru
2025-01-20T23:34:55.287-0800 [DEBUG] provider.terraform-provider-kubectl_v1.19.0:     server: https://acme-v02.api.letsencrypt.org/directory
2025-01-20T23:34:55.287-0800 [DEBUG] provider.terraform-provider-kubectl_v1.19.0:     privateKeySecretRef:
2025-01-20T23:34:55.287-0800 [DEBUG] provider.terraform-provider-kubectl_v1.19.0:       name: cloudflare-ambassador-wcard-private
2025-01-20T23:34:55.287-0800 [DEBUG] provider.terraform-provider-kubectl_v1.19.0:     # List of challenge solvers that will be used to solve ACME challenges for the matching domains.
2025-01-20T23:34:55.287-0800 [DEBUG] provider.terraform-provider-kubectl_v1.19.0:     solvers:
2025-01-20T23:34:55.287-0800 [DEBUG] provider.terraform-provider-kubectl_v1.19.0:       - dns01:
2025-01-20T23:34:55.287-0800 [DEBUG] provider.terraform-provider-kubectl_v1.19.0:           cloudflare:
2025-01-20T23:34:55.287-0800 [DEBUG] provider.terraform-provider-kubectl_v1.19.0:             email: alex@priz.guru
2025-01-20T23:34:55.287-0800 [DEBUG] provider.terraform-provider-kubectl_v1.19.0:             apiTokenSecretRef:
2025-01-20T23:34:55.287-0800 [DEBUG] provider.terraform-provider-kubectl_v1.19.0:               name: cloudflare-api-token-secret
2025-01-20T23:34:55.287-0800 [DEBUG] provider.terraform-provider-kubectl_v1.19.0:               key: api-token
2025-01-20T23:34:55.287-0800 [DEBUG] provider.terraform-provider-kubectl_v1.19.0:         selector:
2025-01-20T23:34:55.287-0800 [DEBUG] provider.terraform-provider-kubectl_v1.19.0:           dnsNames:
2025-01-20T23:34:55.287-0800 [DEBUG] provider.terraform-provider-kubectl_v1.19.0:             - '*.priz.guru'
2025-01-20T23:34:55.287-0800 [DEBUG] provider.terraform-provider-kubectl_v1.19.0:             - 'priz.guru'
2025-01-20T23:34:55.359-0800 [DEBUG] provider.terraform-provider-kubectl_v1.19.0: 2025/01/20 23:34:55 [ERROR] creating manifest failed: ambassador/cloudflare-ambassador-wcard failed to create kubernetes rest client for update of resource: resource [cert-manager.io/v1/Issuer] isn't valid for cluster, check the APIVersion and Kind fields are valid
2025-01-20T23:34:55.359-0800 [ERROR] provider.terraform-provider-kubectl_v1.19.0: Response contains error diagnostic: @module=sdk.proto tf_proto_version=5.7 tf_req_id=2faebf9b-8624-79dd-3b0d-cd4b01ce8f47 @caller=github.com/hashicorp/terraform-plugin-go@v0.25.0/tfprotov5/internal/diag/diagnostics.go:58 diagnostic_detail="" diagnostic_severity=ERROR diagnostic_summary="ambassador/cloudflare-ambassador-wcard failed to create kubernetes rest client for update of resource: resource [cert-manager.io/v1/Issuer] isn't valid for cluster, check the APIVersion and Kind fields are valid" tf_provider_addr="" tf_resource_type=kubectl_manifest tf_rpc=ApplyResourceChange timestamp=2025-01-20T23:34:55.359-0800
2025-01-20T23:34:55.583-0800 [DEBUG] State storage *statemgr.Filesystem declined to persist a state snapshot
2025-01-20T23:34:55.583-0800 [ERROR] vertex "kubectl_manifest.certificate_issuer" error: ambassador/cloudflare-ambassador-wcard failed to create kubernetes rest client for update of resource: resource [cert-manager.io/v1/Issuer] isn't valid for cluster, check the APIVersion and Kind fields are valid
╷
│ Error: ambassador/cloudflare-ambassador-wcard failed to create kubernetes rest client for update of resource: resource [cert-manager.io/v1/Issuer] isn't valid for cluster, check the APIVersion and Kind fields are valid
│
│   with kubectl_manifest.certificate_issuer,
│   on cert-manager.tf line 45, in resource "kubectl_manifest" "certificate_issuer":
│   45: resource "kubectl_manifest" "certificate_issuer" {
│
╵
2025-01-20T23:34:55.823-0800 [DEBUG] provider.stdio: received EOF, stopping recv loop: err="rpc error: code = Unavailable desc = error reading from server: EOF"
2025-01-20T23:34:55.825-0800 [INFO]  provider: plugin process exited: plugin=.terraform/providers/registry.terraform.io/gavinbunney/kubectl/1.19.0/darwin_amd64/terraform-provider-kubectl_v1.19.0 id=15363

I have rechecked everything:

  1. I have the right cert-manager API version supported.
  2. If I disable the Issuer step, everything else is getting applied properly.

I am not sure where else to dig...

Alex A.
  • 101

0 Answers0