Usar os seus próprios certificados TLS

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

Em alternativa, pode usar a funcionalidade de certificados TLS geridos, que cria e renova automaticamente certificados TLS através do Let's Encrypt

Para usar os seus próprios certificados, armazena os certificados TLS num segredo do Kubernetes e, em seguida, configura o gateway de entrada do Cloud Service Mesh para usar esse segredo.

Antes de começar

  • Estas instruções pressupõem que já obteve os seus certificados TLS.
  • Tem de configurar um domínio personalizado. Para ver detalhes, consulte o artigo Mapear domínios personalizados.
  • Tem de configurar cada um dos seus serviços de publicação do Knative que usam o gateway de entrada para publicar tráfego externo. Se estes serviços virados para o exterior não estiverem configurados para usar os seus certificados TLS, os serviços não vão poder validar uma ligação HTTPS e, por isso, nunca vão atingir o estado ready.

Armazenar certificados TLS num secret do Kubernetes

Para armazenar os certificados num segredo:

  1. Abra um terminal e navegue para o diretório onde se encontram os seus certificados TLS.

  2. Use o seguinte comando para criar um segredo que armazena os seus certificados:

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

    Substituição:

    • INGRESS_NAMESPACE com o espaço de nomes do seu serviço de entrada, istio-ingressgateway. Especifique o istio-system namespace se instalou o Cloud Service Mesh com a configuração predefinida.
    • SECRET_NAME com o nome que quer usar para o seu segredo do Kubernetes.
    • PRIVATE_KEY.pem com o nome do ficheiro que contém a chave privada do certificado.
    • FULL_CHAIN.pem com o nome do ficheiro que contém o seu certificado público.

Já pode configurar o gateway de entrada para usar o segredo que acabou de criar para o seu certificado TLS.

Configurar o gateway de entrada para usar os seus certificados

Modifique o gateway de entrada do Cloud Service Mesh para usar o segredo que criou para os 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 do gateway de entrada predefinido:

    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 seu segredo anexando os atributos hosts, port e tls ao YAML existente.

    • Para configurar todos os serviços para usar o mesmo segredo: 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 segredo que criou.

      Veja o exemplo.

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

      Para cada serviço, especifica valores para os 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
      

      Substituição:

      • SERVICE_NAME com o nome do serviço Knative serving. Todos os serviços que usam o gateway de entrada para publicar tráfego externo têm de ser configurados individualmente.
      • SERVICE_NAMESPACE com o nome do espaço de nomes no qual o serviço está a ser executado.
      • CUSTOM_DOMAIN com o domínio personalizado para o qual configurou o serviço para usar.
      • SECRET_NAME com o nome do segredo que quer que o serviço use. Se criou vários segredos para diferentes conjuntos de certificados TLS, pode especificar que segredo cada serviço usa.

      Veja o exemplo.

  3. Guarde as alterações.

Já pode usar o protocolo HTTPS para aceder aos seus serviços Knative Serving implementados.

Exemplos

Configurar todos os serviços:

Este exemplo demonstra como configurar todos os serviços para usar o segredo 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 todos os três serviços que estão a publicar 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