Como usar certificados SSL gerenciados pelo Google

Visão geral

No Google Kubernetes Engine (GKE), é possível usar 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. Para saber como criar um, leia Como trabalhar com certificados SSL gerenciados pelo Google.

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 adicionando uma anotação networking.gke.io/managed-certificates à Entrada. Essa anotação é uma lista separada por vírgulas de recursos ManagedCertificate, cert1,cert2,cert3, por exemplo.

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 Google Cloud.

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 Cloud para criar um endereço IP reservado, chamado 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 Cloud.

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

    2. Especifique um nome para esse 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.

    Configurar conector

    Observação: esta etapa requer o Config Connector. Siga as instruções de instalação para instalar o Conector de configuração no cluster.

    apiVersion: compute.cnrm.cloud.google.com/v1alpha3
    kind: ComputeAddress
    metadata:
      name: example-ip-address
    spec:
      location: global
    Para implantar esse manifesto, faça o download dele para sua máquina como compute-address.yaml e execute:
    kubectl apply -f compute-address.yaml

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 manifesto ManagedCertificate do exemplo a seguir em um arquivo chamado example-certificate.yaml. Substitua myapp.example.com pelo nome do seu domínio:

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

    Use kubectl para criar o recurso:

    kubectl apply -f example-certificate.yaml
    
  2. Crie um serviço NodePort para publicar o aplicativo na Internet. Veja a seguir 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, para fins práticos, as especificações de serviço precisam ter um seletor.

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

    Use 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 como o nome do seu certificado.
    • Para o 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 como o nome do seu endereço IP reservado.

    Veja a seguir um exemplo de manifesto de 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 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. Neste exemplo, crie um registro A para apontar myapp.example.com para 203.0.113.32. 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
    

    Depois que um certificado for provisionado com sucesso, o valor do campo Status.CertificateStatus será Active. O exemplo a seguir mostra a saída de kubectl describe após o certificado de exemplo ser provisionado com sucesso:

    Name:         example-certificate
    Namespace:    default
    Labels:       <none>
    Annotations:  <none>
    API Version:  networking.gke.io/v1beta1
    Kind:         ManagedCertificate
    (...)
    Spec:
      Domains:
        example.com
    Status:
      CertificateStatus: Active
    (...)
    
  7. Acesse seu domínio com o prefixo https:// para verificar se o SSL está funcionando. Neste exemplo, use https://myapp.example.com. 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

Com 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 Cloud.

    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.

Configurar conector

Observação: esta etapa requer o Config Connector. Siga as instruções de instalação para instalar o Conector de configuração no cluster.

apiVersion: compute.cnrm.cloud.google.com/v1alpha3
kind: ComputeAddress
metadata:
  name: example-ip-address
spec:
  location: global
Para implantar esse manifesto, faça o download dele para sua máquina como compute-address.yaml e execute:
kubectl delete -f compute-address.yaml

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

Seus 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 curinga no campo spec.domains. Os certificados gerenciados não são compatíveis com domínios 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