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 gateway de entrada para veicular 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 tiver instalado o Cloud Service Mesh com 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 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 o Knative serving implantado .

Exemplos

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