Ao expor serviços por meio de gateways de entrada do Service Mesh (ASM), o tráfego não é criptografado por padrão. O cert-manager automatiza a emissão e a renovação de certificados TLS no Kubernetes. Assim, você pode carregar certificados nos gateways de entrada do ASM e servir tráfego via HTTPS sem precisar rotacionar certificados manualmente.
Como funciona
O cert-manager integra-se aos gateways do ASM em três etapas:
Crie um Issuer -- defina como obter os certificados (autoassinados ou assinados por CA).
Solicite um Certificate -- o cert-manager gera um certificado TLS e o armazena como um Secret do Kubernetes.
Referencie o Secret em um Gateway -- o gateway de entrada do ASM carrega o certificado do campo
credentialNamee encerra a conexão TLS.
Tipos de certificado
|
Tipo |
Criptografia |
Autenticação |
Confiável pelo navegador |
Mais indicado para |
|
Autoassinado |
Sim |
Não |
Não -- navegadores exibem um aviso de segurança |
Desenvolvimento, testes e acesso via CLI |
|
Validado por dns |
Sim |
Sim -- emitido por uma Autoridade Certificadora (CA) confiável |
Sim |
Acesso via CLI e via navegador |
Pré-requisitos
Helm instalado na máquina local
Instale o cert-manager
A versão do cert-manager deve ser compatível com a versão do Kubernetes. Para verifique o mapeamento de versões, consulte Supported releases.
-
Crie o namespace
cert-manager:kubectl create namespace cert-manager -
Adicione o repositório Helm da Jetstack e atualize-o:
helm repo add jetstack https://charts.jetstack.io helm repo update -
Instale o cert-manager com as Custom Resource Definitions (CRDs):
helm install \ cert-manager jetstack/cert-manager \ --namespace cert-manager \ --version v1.14 \ --set installCRDs=true
Emita um certificado autoassinado
Certificados autoassinados criptografam o tráfego, mas os navegadores não os consideram confiáveis. Utilize-os apenas para desenvolvimento e testes.
Etapa 1: Crie um Issuer e um Certificate
-
Salve o YAML a seguir como
issuer.yaml. Este arquivo defina um Issuer autoassinado e solicita um certificado de CA: -
Aplique a configuração no namespace
istio-system:kubectl apply -f issuer.yaml -n istio-system -
Verifique se o Secret do certificado existe:
kubectl get secret -n istio-systemSaída esperada:
NAME TYPE DATA AGE istio-ingressgateway-certs kubernetes.io/tls 3 68mUm Secret do tipo
kubernetes.io/tlscomDATA=3confirma a criação do certificado.
Etapa 2: Configure o gateway do ASM para HTTPS
Implante a aplicação httpbin como backend de teste.
-
Adicione um listener HTTPS na porta 443 ao Istio Gateway do httpbin. Aplique essa configuração usando o kubeconfig da instância do ASM ou edite o YAML na página Gateway do console do ASM. Para mais detalhes, consulte Manage Istio gateways.
apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: httpbin namespace: default spec: selector: istio: ingressgateway servers: - hosts: - '*' port: name: test number: 80 protocol: HTTP - hosts: - '*' port: name: https number: 443 protocol: HTTPS tls: credentialName: istio-ingressgateway-certs mode: SIMPLEO campo
credentialNamereferencia o Secret criado pelo cert-manager. O modo TLSSIMPLEhabilita o TLS unidirecional (apenas autenticação do servidor).
Etapa 3: Verifique o acesso HTTPS
-
Obtenha o endereço IP do gateway de entrada e armazene-o em uma variável:
GATEWAY_IP=$(kubectl get svc -n istio-system -l istio=ingressgateway \ -o jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}') echo $GATEWAY_IP -
Envie uma solicitação HTTPS para o serviço httpbin. A flag
-kignora a verificação do certificado porque ele é autoassinado:curl -k --resolve istio-ingressgateway-certs:443:$GATEWAY_IP \ https://istio-ingressgateway-certs/status/418 -IO código de status
418confirma o funcionamento do HTTPS. O domínioistio-ingressgateway-certscorresponde aocommonNameno recurso Certificate.
Solução de problemas
Secret do certificado não criado
Verifique o status do recurso Certificate:
kubectl describe certificate istio-ingressgateway-certs -n istio-system
Analise a seção Events em busca de mensagens de erro. Causas comuns incluem:
Issuer sem o status
Ready. Executekubectl get issuer -n istio-systempara verificar.Pod do controlador do cert-manager parado. Execute
kubectl get pods -n cert-managerpara verificar.
Gateway não serve HTTPS
Confirme se o Secret existe no namespace istio-system:
kubectl get secret istio-ingressgateway-certs -n istio-system
O Secret deve estar em istio-system para que o gateway de entrada possa carregá-lo. Caso o Secret exista, mas o HTTPS ainda falhe, verifique os logs do gateway de entrada:
kubectl logs -n istio-system -l istio=ingressgateway --tail=50
Incompatibilidade entre versões do cert-manager e do Kubernetes
Se os pods do cert-manager falharem ao iniciar ou as CRDs não forem instaladas, confirme se a versão do cert-manager é compatível com a versão do Kubernetes. Consulte Supported releases.
Se ocorrer um erro ao usar o cert-manager em um cluster no plano de dados, entre no grupo 30421250 do DingTalk para obter suporte.
Limpeza
Remova os recursos criados neste guia:
# Delete the Gateway and httpbin resources
kubectl delete gateway httpbin -n default
# Delete the Certificate and Issuer
kubectl delete certificate istio-ingressgateway-certs -n istio-system
kubectl delete issuer selfsigned -n istio-system
# Delete the TLS Secret
kubectl delete secret istio-ingressgateway-certs -n istio-system