Como usar certificados SSL gerenciados pelo Google

Visão geral

No Google Kubernetes Engine, é possível usar as Entradas para criar balanceadores de carga HTTPS com certificados SSL configurados automaticamente. Os certificados SSL gerenciados pelo Google são provisionados, renovados e gerenciados para seus nomes de domínio. Leia mais sobre os certificados SSL gerenciados pelo Google aqui.

Como criar uma Entrada com um certificado gerenciado

Para configurar um certificado SSL gerenciado e associá-lo a uma Entrada, é necessário:

  • criar um objeto ManagedCertificate;
  • associar o objeto ManagedCertificate a uma Entrada ao adicionar uma anotação networking.gke.io/managed-certificates à Entrada. Essa anotação é uma lista separada por vírgulas de recursos ManagedCertificate, por exemplo, cert1,cert2,cert3.

O recurso ManagedCertificate precisa ser criado no mesmo namespace que a Entrada.

Limitações

Os certificados gerenciados pelo Google são menos flexíveis do que os certificados conseguidos e gerenciados por você. Certificados gerenciados são compatíveis com um único domínio sem caracteres curinga. Os certificados autogerenciados são compatíveis com caracteres curingas e vários nomes alternativos de entidade (SANs).

Se você precisar de certificados autogerenciados ou se já tiver certificados SSL que gostaria de configurar na Entrada, consulte a documentação da Entrada.

O número e o tipo de certificados compatíveis com uma Entrada são definidos pelos limites dos certificados SSL gerenciados pelo GCP.

Pré-requisitos

  • É preciso ser proprietário do nome de domínio. O nome do domínio não pode ter mais de 63 caracteres. É preciso usar o Google Domains ou outro registrador.
  • Crie um endereço IP externo reservado (estático). A reserva de um endereço IP estático garante que ele continuará sendo seu, mesmo que você exclua a Entrada. Se você não reservar um endereço, ele poderá ser alterado, exigindo a reconfiguração dos registros DNS do seu domínio. Use a ferramenta de linha de comando gcloud ou o Console do GCP para criar um endereço IP reservado denominado example-ip-address:

    gcloud

    gcloud compute addresses create example-ip-address --global
    

    Para encontrar o endereço IP estático que você criou:

    $ gcloud compute addresses describe example-ip-address --global
    address: 203.0.113.32
    ...
    

    Console

    1. Acesse a página "Reservar um endereço estático" no Console do GCP.

      Acessar a página "Reservar um endereço estático"

    2. Especifique um nome para este endereço IP, example-ip-address.
    3. Especifique se o endereço é IPv4 ou IPv6. O exemplo a seguir usa um endereço IPv4.
    4. Selecione a opção Global para o tipo de endereço.
    5. Clique em Reservar para reservar o IP.
    6. O endereço IP será listado na coluna Endereço externo.

Como configurar o certificado gerenciado

  1. Crie um recurso ManagedCertificate. Esse recurso especifica o domínio para que o certificado SSL será criado. Domínios com caracteres curinga não são compatíveis. A lista spec.domains precisa conter apenas um domínio.

    Salve o exemplo a seguir do manifesto ManagedCertificate em um arquivo chamado example-certificate.yaml. Substitua example.com pelo seu nome de domínio:

    apiVersion: networking.gke.io/v1beta1
    kind: ManagedCertificate
    metadata:
      name: example-certificate
    spec:
      domains:
        - example.com
    

    Use o kubectl para criar o recurso:

    kubectl apply -f example-certificate.yaml
    
  2. Crie um serviço NodePort para publicar o aplicativo na Internet. A seguir, veja um exemplo de arquivo de manifesto do serviço, example-service.yaml.

    apiVersion: v1
    kind: Service
    metadata:
      name: example-nodeport-service
    spec:
      type: NodePort
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
    

    Esta especificação de exemplo não seleciona nenhum pod para incluir no serviço. Isso é suficiente para demonstrar como configurar certificados gerenciados. No entanto, no uso prático, uma especificação de serviço precisa incluir um seletor.

    Consulte a documentação do NodePort para mais detalhes sobre como configurar o serviço.

    Use o kubectl para criar o serviço:

    kubectl apply -f example-service.yaml
    
  3. Crie uma Entrada e vincule-a ao ManagedCertificate criado anteriormente.

    • Defina a anotação networking.gke.io/managed-certificates para o nome do seu certificado.
    • No campo spec.backend.serviceName, use o nome do serviço criado na etapa anterior.
    • Defina o campo spec.backend.servicePort como a porta especificada no manifesto do serviço.
    • Defina a anotação kubernetes.io/ingress.global-static-ip-name para o nome do seu endereço IP reservado.

    A seguir, veja um exemplo de manifesto da Entrada, example-ingress.yaml:

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: example-ingress
      annotations:
        kubernetes.io/ingress.global-static-ip-name: example-ip-address
        networking.gke.io/managed-certificates: example-certificate
    spec:
      backend:
        serviceName: example-nodeport-service
        servicePort: 80
    

    Use o kubectl para criar a Entrada:

    kubectl apply -f example-ingress.yaml
    
  4. Pesquise o endereço IP do balanceador de carga criado na etapa anterior. Use o seguinte comando para conseguir o endereço IP do balanceador de carga:

    $ kubectl get ingress
    NAME              HOSTS     ADDRESS         PORTS     AGE
    example-ingress   *         203.0.113.32     80        54s
    

    O endereço IP do balanceador de carga está listado na coluna ADDRESS (203.0.113.32 neste exemplo). Se você estiver usando um endereço IP estático reservado, ele será o endereço do balanceador de carga.

    Se o endereço não estiver listado, aguarde até que a Entrada conclua a configuração.

  5. Configure os registros DNS do seu domínio para que aponte para o endereço IP do balanceador de carga. Se você usa o Cloud DNS, consulte o guia Como gerenciar registros para mais detalhes.

  6. Aguarde o provisionamento do certificado gerenciado. Isso pode levar até 15 minutos Verifique o status do certificado com o seguinte comando:

    kubectl describe managedcertificate
    

    Quando um certificado é provisionado com sucesso, o valor do campo Status.CertificateStatus será Active. O exemplo a seguir mostra a saída do kubectl describe após o provisionamento bem-sucedido do certificado:

    Name:         example-certificate
    Namespace:    default
    Labels:       
    Annotations:  
    API Version:  networking.gke.io/v1beta1
    Kind:         ManagedCertificate
    (...)
    Spec:
      Domains:
        example.com
    Status:
      CertificateStatus: Active
    (...)
    
  7. Visite seu domínio usando o prefixo https:// para verificar se o SSL está funcionando. Seu navegador indicará que a conexão é segura e que é possível visualizar os detalhes do certificado.

Como migrar para certificados gerenciados pelo Google com base em certificados autogerenciados

Ao migrar uma Entrada, fazendo a transição de certificados SSL autogerenciados para certificados SSL gerenciados pelo Google, não exclua nenhum certificado SSL autogerenciado antes que os certificados SSL gerenciados pelo Google estejam ativos. Após o provisionamento bem-sucedido dos certificados SSL gerenciados pelo Google, eles ficarão automaticamente ativos. Depois que os certificados SSL gerenciados pelo Google estiverem ativos, será possível excluir os certificados SSL autogerenciados.

Use estas instruções para migrar de certificados autogerenciados para certificados SSL gerenciados pelo Google.

  1. Adicione um novo certificado gerenciado à Entrada, conforme descrito na seção Como configurar o certificado gerenciado.
  2. Aguarde até que o status do recurso de certificado gerenciado pelo Google esteja Ativo. Verifique o status do certificado com kubectl describe managedcertificate.
  3. Quando o status estiver Ativo, atualize a Entrada para remover as referências ao certificado autogerenciado.

Como remover um certificado gerenciado

Para remover um certificado gerenciado do cluster, é necessário excluir o recurso ManagedCertificate e remover a anotação da Entrada que se refere a ele.

  1. Exclua o recurso ManagedCertificate com kubectl:

    kubectl delete -f example-certificate.yaml
    

    A seguinte saída será exibida:

    managedcertificate.networking.gke.io "example-certificate" deleted
    
  2. Remova a anotação da Entrada:

    kubectl annotate ingress example-ingress networking.gke.io/managed-certificates-
    

    Observe o sinal de menos (-) no final do comando.

  3. Libere o endereço IP estático que você reservou para o balanceador de carga:

gcloud

Como usar a ferramenta de linha de comando gcloud:

gcloud compute addresses delete [ADDRESS_NAME] --global

em que [ADDRESS_NAME] é o nome do endereço IP.

Console

  1. Acesse a página "Endereços IP externos" no Console do GCP.

    Acessar a página "Endereços IP externos"

  2. Marque a caixa ao lado do endereço IP a ser liberado.
  3. Clique em Liberar endereço IP.

Solução de problemas

As definições do ManagedCertificate são validadas antes da criação do recurso ManagedCertificate. Se a validação falhar, o recurso ManagedCertificate não será criado e uma mensagem de erro será impressa. As diferentes razões de falha são explicadas abaixo:

spec.domains in body should have at most 1 items

Os manifestos ManagedCertificate listam mais de um domínio no campo spec.domains. Os certificados gerenciados são compatíveis com apenas um domínio.

spec.domains in body should match '^(([a-zA-Z0-9]+|[a-zA-Z0-9][-a-zA-Z0-9]*[a-zA-Z0-9])\.)+[a-zA-Z][-a-zA-Z0-9]*[a-zA-Z0-9]\.?$'

Você especificou um nome de domínio inválido ou um nome de domínio com caractere curinga no campo spec.domains. Os certificados gerenciados não são compatíveis com domínios com caractere curinga, como *.example.com

spec.domains in body should be at most 63 chars long

Você especificou um nome de recurso longo demais. Certificados gerenciados são compatíveis com nomes de domínio com no máximo 63 caracteres.

A seguir

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Documentação do Kubernetes Engine