Seguí esta guía de DigitalOcean https://www.digitalocean.com/community/tutorials/how-to-set-up-an-nginx-ingress-with-cert-manager-on-digitalocean-kubernetes y encontré algo bastante extraño. Cuando en los nombres de host configuro un comodín, luego letsencrypt falla al emitir un nuevo certificado. Mientras que cuando solo configuro subdominios definidos, funciona perfectamente.
Esta es mi configuración "funcional" para el dominio y su API (y esta funciona perfectamente):
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: my-ingress annotations: cert-manager.io/cluster-issuer: "letsencrypt-staging" spec: tls: - hosts: - example.com - api.example.com secretName: my-tls rules: - host: example.com http: paths: - backend: serviceName: example-frontend servicePort: 80 - host: api.example.com http: paths: - backend: serviceName: example-api servicePort: 80Y este es, en cambio, el certificado comodín que estoy tratando de emitir, pero que no deja el mensaje "Emitiendo".
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: my-ingress annotations: cert-manager.io/cluster-issuer: "letsencrypt-staging" spec: tls: - hosts: - example.com - *.example.com secretName: my-tls rules: - host: example.com http: paths: - backend: serviceName: example-frontend servicePort: 80 - host: api.example.com http: paths: - backend: serviceName: example-api servicePort: 80La única diferencia es la segunda línea de los anfitriones. ¿Hay una solución trivial bien conocida que no conozco? Soy nuevo en Kubernetes, pero no en DevOps.
La generación de un certificado comodín con cert-manager ( letsencrypt ) requiere el uso del desafío DNS-01 en lugar del HTTP-01 se usa en el enlace de la pregunta :
¿Let's Encrypt emite certificados comodín?
Sí. La emisión de comodines debe realizarse a través de ACMEv2 utilizando el desafío DNS-01. Consulte esta publicación para obtener más información técnica.
Hay una documentación sobre cómo generar el certificado wildcard con cert-manager :
Desde la perspectiva de DigialOcean, existe una guía específicamente dirigida a ello:
Este proveedor utiliza un recurso
Secretde Kubernetes para funcionar. En el siguiente ejemplo, elSecretdeberá llamarsedigitalocean-dnsy tener unaccess-tokencon el token en él. Por ejemplo:apiVersion: v1 kind: Secret metadata: name: digitalocean-dns namespace: cert-manager data: # insert your DO access token here access-token: "base64 encoded access-token here"El token de acceso debe tener acceso de escritura.
Para crear un token de acceso personal, consulte la documentación de DigitalOcean .
Práctico enlace directo: https://cloud.digitalocean.com/account/api/tokens/new
Para codificar su token de acceso en base64, puede usar lo siguiente
echo -n 'your-access-token' | base64 -w 0apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: example-issuer spec: acme: ... solvers: - dns01: digitalocean: tokenSecretRef: name: digitalocean-dns key: access-token-- Cert-manager.io: Documentos: Configuración: ACME: DNS-01: Digitalocean
Creo que estos recursos adicionales también podrían ayudar:
El certificado comodín requiere el método DNS-01
Nota : es posible que deba agregar primero el registro CAA en su DNS.
El registro CAA se puede agregar a la zona DNS
ejemplo :
Type Value devops.in CAA 0 issuewild "letsencrypt.org"obtener detalles de: https://sslmate.com/caa/
Primero, debe crear el secreto para almacenar la access key usando el comando
kubectl create secret generic route53-secret --from-literal=secret-access-key="skjdflk4598sf/dkfj490jdfg/dlfjk59lkj" Aquí compartiendo el ejemplo issuer.yaml
apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: letsencrypt-prod spec: acme: email: test123@gmail.com server: https://acme-v02.api.letsencrypt.org/directory privateKeySecretRef: name: letsencrypt-prod solvers: - selector: dnsZones: - "devops.in" dns01: route53: region: us-east-1 hostedZoneID: Z2152140EXAMPLE accessKeyID: AKIA5A5D7EXAMPLE secretAccessKeySecretRef: name: route53-secret key: secret-access-key --- apiVersion: cert-manager.io/v1alpha2 kind: Certificate metadata: name: le-crt spec: secretName: tls-secret issuerRef: kind: Issuer name: letsencrypt-prod commonName: "*.devops.in" dnsNames: - "*.devops.in" Además, asegúrese de que su usuario tenga los permisos necesarios para administrar Route53
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "route53:GetChange", "Resource": "arn:aws:route53:::change/*" }, { "Effect": "Allow", "Action": "route53:ChangeResourceRecordSets", "Resource": "arn:aws:route53:::hostedzone/*" }, { "Effect": "Allow", "Action": "route53:ListHostedZonesByName", "Resource": "*" } ] }