O cert-manager é uma extensão para Kubernetes que automatiza a emissão e renovação de certificados. Ele permite obter certificados do Let's Encrypt e de outras autoridades certificadoras (CAs), ou usar certificados internos da sua própria raiz.
O cert-manager simplifica o gerenciamento de certificados, renovando-os automaticamente antes da expiração e garantindo criptografia segura para serviços dentro do cluster. Ele se integra com controladores Ingress e suporta diversos métodos de verificação de domínio, tornando-se uma ferramenta prática para automatizar a gestão de certificados no Kubernetes.
Para instalar o cert-manager:
Para verificar a instalação, execute o comando:
kubectl get pods -n cert-manager
Todos os pods no namespace cert-manager devem estar com o status Running.
Para que o cert-manager possa emitir certificados, é necessário criar um objeto ClusterIssuer, que gerencia certificados em nível de cluster.
Exemplo de manifest:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
email: email@example.com
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: nginx
Aqui:
email: Seu endereço de e-mail, necessário para a emissão do certificado. O Let's Encrypt enviará notificações para esse endereço.server: A URL do Let's Encrypt ou de outra autoridade certificadora.privateKeySecretRef: O secret que armazena a chave privada.solvers.http01.ingress.class: Método para verificação de domínio via HTTP, usando o controlador Nginx Ingress neste caso.Se estiver usando outro controlador Ingress, substitua nginx pelo valor apropriado. Por exemplo, para Traefik:
solvers:
- http01:
ingress:
class: traefik
Vamos considerar um exemplo usando cert-manager com os recursos do nosso setup de Nginx Ingress.
Se você seguiu nosso guia, você já configurou:
Seus serviços são acessíveis via:
http://ingress1.example.com/service1http://ingress1.example.com/service2http://ingress2.example.com/Agora, precisamos definir um ClusterIssuer em um arquivo chamado cluster-issuer.yaml:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
email: email@example.com
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: nginx
Aplique o manifest:
kubectl apply -f cluster-issuer.yaml
Em seguida, você precisa atualizar o recurso Ingress. Modifique o manifest existente adicionando uma annotation para cert-manager e a seção tls.
Manifest atualizado ingress.yaml:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
namespace: ingress-example
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
rules:
- host: ingress1.example.com
http:
paths:
- path: /service1
pathType: Prefix
backend:
service:
name: service1
port:
number: 80
- path: /service2
pathType: Prefix
backend:
service:
name: service2
port:
number: 80
tls:
- hosts:
- ingress1.example.com
secretName: ingress-tls
Alterações neste manifest:
ert-manager.io/cluster-issuer: letsencrypt-prod para instruir o cert-manager a usar o ClusterIssuer criado.tls, especificando os domínios para os quais o cert-manager deve emitir certificados e o secret (ingress-tls) onde eles serão armazenados.Aplique o manifest atualizado:
kubectl apply -f ingress.yaml
Após um curto período, o cert-manager emitirá os certificados e os armazenará no secret ingress-tls. Para verificar os certificados, use:
kubectl get secret ingress-tls -n ingress-example -o yaml
Se estiver correto, o secret deverá conter tls.crt e tls.key.
Execute o seguinte comando para testar a conectividade HTTPS:
curl -v https://ingress1.example.com/service1
Se a requisição for concluída sem erros, os certificados foram instalados com sucesso e os serviços estão rodando sobre HTTPS.