cert-manager
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.
Instalar cert-manager Copiar link
Para instalar o cert-manager:
- Acesse a seção Kubernetes e clique no cluster.
- Navegue até a aba Complementos e selecione cert-manager.
- Clique em Instalar e aguarde a conclusão do processo.
Para verificar a instalação, execute o comando:
kubectl get pods -n cert-managerTodos os pods no namespace cert-manager devem estar com o status Running.
Habilitar emissão de certificados Copiar link
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: nginxAqui:
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: traefikExemplo de uso do cert-manager Copiar link
Vamos considerar um exemplo usando cert-manager com os recursos do nosso setup de Nginx Ingress.
Se você seguiu nosso guia, você já configurou:
- Três deployments
- Nginx Ingress
- Um LoadBalancer
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: nginxAplique o manifest:
kubectl apply -f cluster-issuer.yamlEm 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-tlsAlterações neste manifest:
- Adicionada a annotation c
ert-manager.io/cluster-issuer: letsencrypt-prodpara instruir o cert-manager a usar oClusterIssuercriado. - Adicionada a seção
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.yamlApó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 yamlSe 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/service1Se a requisição for concluída sem erros, os certificados foram instalados com sucesso e os serviços estão rodando sobre HTTPS.