Como usar seus próprios certificados TLS

Saiba como configurar o Knative serving para usar seus próprios certificados SSL/TLS.

Como alternativa, é possível usar o recurso de certificados TLS gerenciados, que cria e renova automaticamente os certificados TLS por meio de Let's Encrypt

Para usar seus próprios certificados, armazene os certificados TLS em um secret do Kubernetes e configure o gateway de entrada do Cloud Service Mesh para usar esse secret.

Antes de começar

  • Estas instruções presumem que você já tenha recebido seus certificados TLS.
  • Você precisa configurar um domínio personalizado. Para detalhes, consulte Como mapear domínios personalizados.
  • É necessário configurar cada um dos serviços do Knative serving que usam o gateway de entrada para exibir o tráfego externo. Se esses serviços externos não estiverem configurados para usar os certificados TLS, os serviços não poderão verificar uma conexão HTTPS e, portanto, nunca atingir o estado ready.

Como armazenar certificados TLS em um secret do Kubernetes

Para armazenar os certificados em um Secret, siga estas etapas:

  1. Abra um terminal e navegue até o diretório em que seus certificados TLS estão localizados.

  2. Use o seguinte comando para criar um secret que armazene seus certificados:

    kubectl create --namespace INGRESS_NAMESPACE secret tls SECRET_NAME \
      --key PRIVATE_KEY.pem \
      --cert FULL_CHAIN.pem
    

    Substitua:

    • INGRESS_NAMESPACE pelo namespace do serviço de entrada, istio-ingressgateway. Especifique o namespace istio-system se você tiver instalado o Cloud Service Mesh usando a configuração padrão.
    • SECRET_NAME pelo nome que você quer usar para o Secret do Kubernetes.
    • PRIVATE_KEY.pem pelo nome do arquivo que contém a chave privada do certificado.
    • FULL_CHAIN.pem pelo nome do arquivo que contém seu certificado público.

Agora é possível configurar o gateway de entrada para usar o secret que você acabou de criar para o certificado TLS.

Como configurar o gateway de entrada para usar seus certificados

Modifique o gateway de entrada do Cloud Service Mesh para usar o secret que você criou para seus certificados TLS:

  1. Abra o YAML do gateway de entrada no modo de edição executando o seguinte comando:

    kubectl edit gateway knative-ingress-gateway --namespace knative-serving

    Exemplo da configuração padrão do gateway de entrada:

    apiVersion: networking.istio.io/v1beta1
    kind: Gateway
    metadata:
      ...
      # other skipped configuration
      ...
    spec:
      selector:
        istio: ingressgateway
      servers:
      - hosts:
        - '*'
        port:
          name: http
          number: 80
          protocol: HTTP
    
  2. Configure o gateway de entrada para usar o secret anexando os atributos hosts, port e tls ao YAML atual.

    • Para configurar todos os serviços para usar a mesma chave secreta: anexe o seguinte à sua configuração YAML e especifique "*" como o valor do atributo hosts:

      ...
      # other skipped configuration
      ...
      - hosts:
        - "*"
        port:
          name: https
          number: 443
          protocol: HTTPS
        tls:
          mode: SIMPLE
          credentialName: SECRET_NAME
      

      Substitua SECRET_NAME pelo nome do secret que você criou.

      Veja o exemplo.

    • Para configurar cada um dos serviços individualmente: anexe o seguinte à sua configuração YAML e especifique os valores dos atributos hosts usando o nome e o namespace do serviço:

      Para cada serviço, é preciso especificar os valores dos atributos hosts, port e tls:

      ...
      # other skipped configuration
      ...
      - hosts:
        - SERVICE_NAME.SERVICE_NAMESPACE.CUSTOM_DOMAIN
        port:
          number: 443
          name: https-SERVICE_NAME
          protocol: HTTPS
        tls:
          mode: SIMPLE
          credentialName: SECRET_NAME
      

      Substitua:

      • SERVICE_NAME pelo nome do serviço do Knative serving. Cada serviço que usa o gateway de entrada para exibir o tráfego externo precisa ser configurado individualmente.
      • SERVICE_NAMESPACE pelo nome do namespace em que o serviço está sendo executado.
      • CUSTOM_DOMAIN pelo domínio personalizado para o qual você configurou o serviço a ser usado.
      • SECRET_NAME pelo nome do secret que você quer que o serviço use. Se você criou vários secrets para diferentes conjuntos de certificados TLS, especifique o secret que cada serviço usa.

      Veja o exemplo.

  3. Salve as alterações.

Agora é possível usar o protocolo HTTPS para acessar os serviços implantados do Knative serving.

Examples

Configure todos os serviços:

Neste exemplo, demonstramos como configurar todos os serviços para usar o secret TLSsecret:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  ...
  # other skipped configuration
  ...
spec:
  selector:
    istio: ingressgateway
  servers:
    - hosts:
      - "*"
      port:
        name: http
        number: 80
        protocol: HTTP
    - hosts:
      - "*"
      port:
        name: https
        number: 443
        protocol: HTTPS
      tls:
        mode: SIMPLE
        credentialName: TLSsecret
Configure serviços individuais:

Este exemplo demonstra como configurar individualmente os três serviços que veiculam o tráfego da Internet:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  ...
  # other skipped configuration
  ...
spec:
  selector:
    istio: ingressgateway
  servers:
  - hosts:
    - "*"
    port:
      name: http
      number: 80
      protocol: HTTP
  - hosts:
    - prodservice.prodnamespace.my-custom-domain.com
    port:
      number: 443
      name: https-prodservice
      protocol: HTTPS
    tls:
      mode: SIMPLE
      credentialName: TLSsecret
  - hosts:
    - experiment.namespace.my-custom-domain.com
    port:
      number: 443
      name: https-experiment
      protocol: HTTPS
    tls:
      mode: SIMPLE
      credentialName: TLSsecret
  - hosts:
    - fallbackservice.anothernamespace.my-custom-domain.com
    port:
      number: 443
      name: https-fallbackservice
      protocol: HTTPS
    tls:
      mode: SIMPLE
      credentialName: anotherTLSsecret