Configurando o Controlador de Entrada Nativa do OCI

Descubra como configurar e personalizar o controlador de entrada nativo do OCI para balancear a carga e rotear o tráfego de entrada para pods de serviço executados em nós de trabalho em um cluster do Kubernetes.

Quando você tiver instalado o controlador de entrada nativo do OCI (como um programa independente ou como complemento de cluster) e criado os recursos relacionados à entrada do Kubernetes necessários para usá-lo, poderá configurar o controlador de entrada nativo do OCI:

Especificando Regras de Roteamento para o Controlador de Entrada Nativo do OCI

Para especificar como o balanceador de carga do OCI criado pelo controlador de entrada nativo do OCI (instalado como programa independente ou como complemento de cluster) roteia as solicitações de entrada, especifique regras de roteamento no manifesto Ingress.

Solicitações de roteamento com base no host

Você pode configurar o controlador de entrada nativo do OCI para rotear uma solicitação de entrada com base no nome do domínio no cabeçalho Host da solicitação (o host para o qual a solicitação foi originalmente enviada).

Para rotear uma solicitação para um serviço de backend e uma porta específicos com base no host, crie uma regra de roteamento no manifesto Ingress. Se o host corresponder à regra de roteamento, o controlador de entrada nativo do OCI roteará a solicitação para o serviço de backend e a porta associados.

Por exemplo, você pode definir a regra a seguir para rotear solicitações enviadas originalmente para http://foo.bar.com para um serviço de backend chamado ServiceA na porta 80. Todo o tráfego de entrada enviado originalmente para http://foo.bar.com é roteado para ServiceA na porta 80.

kind: Ingress
...
spec:
  rules:
  - host: "foo.bar.com"
    http:
      paths:
        - pathType: Prefix
          path: /
          backend:
            serviceName: ServiceA
            servicePort: 80

Rotear solicitações para diferentes serviços de backend com base no caminho

Você pode configurar o controlador de entrada nativo do OCI para rotear solicitações de entrada para diferentes serviços de backend, com base nos elementos no caminho para o qual as solicitações foram enviadas originalmente.

Para rotear uma solicitação para um serviço de backend e uma porta específicos com base no caminho, crie uma regra de roteamento no manifesto Ingress. Se o caminho corresponder à regra de roteamento, o controlador de entrada nativo do OCI roteará a solicitação para o serviço de backend e a porta associados. Você pode especificar vários caminhos na mesma regra para rotear solicitações para diferentes backends.

Por exemplo, você pode definir a seguinte regra para rotear solicitações com base no caminho para o qual a solicitação foi originalmente enviada:

  • Se o caminho começar com /app1, o controlador de entrada nativo do OCI roteará a solicitação para um serviço de backend chamado ServiceA na porta 80.
  • Se o caminho começar com /app2, o controlador de entrada nativo do OCI roteará a solicitação para um serviço de backend chamado ServiceB na porta 443.

Como a regra não especifica um host, ela se aplica a todo o tráfego de entrada.

kind: Ingress
...
spec:
  rules:
    - http:
      paths:
        - pathType: Prefix
          path: /app1
          backend:
            serviceName: ServiceA
            servicePort: 80
        - pathType: Prefix
          path: /app2
          backend:
            serviceName: ServiceB
            servicePort: 443

Solicitações de roteamento com base no host e no caminho

Você pode configurar o controlador de entrada nativo do OCI para rotear uma solicitação de entrada com base no nome do domínio no cabeçalho Host da solicitação (o host para o qual a solicitação foi enviada originalmente) e nos elementos no caminho para o qual a solicitação original foi enviada.

Para rotear uma solicitação para um serviço de backend e uma porta específicos com base no host e no caminho, crie uma regra de roteamento no manifesto Ingress. Se o host e o caminho corresponderem à regra de roteamento, o controlador de entrada nativo do OCI roteará a solicitação para o serviço de backend e a porta associados.

Por exemplo, você pode definir a seguinte regra para rotear solicitações originalmente enviadas para http://foo.bar.com/app1 para um serviço de backend chamado foo na porta 80:

kind: Ingress
...
spec:
  rules:
  - host: "foo.bar.com"
    http:
      paths:
        - pathType: Prefix
          path: /app1
          backend:
            serviceName: foo
            servicePort: 80

Rotear solicitações para um backend padrão

Você pode configurar o controlador de entrada nativo do OCI para rotear solicitações de entrada para um backend padrão. Você pode configurar um backend padrão para tratar solicitações que não correspondem a nenhuma regra de roteamento.

Por exemplo, você pode definir o defaultBackend a seguir para rotear solicitações que não correspondem a outras regras no manifesto Ingress para um serviço de backend chamado ServiceC na porta 8080.

Observe que, se você não especificar outras regras em um manifesto Ingress, deverá especificar um defaultBackend.

kind: Ingress
...
spec:
  rules:
    - http:
      paths:
        - pathType: Prefix
          path: /app1
          backend:
            serviceName: ServiceA
            servicePort: 80
        - pathType: Prefix
          path: /app2
          backend:
            serviceName: ServiceB
            servicePort: 443
  defaultBackend:
    service:
      name: ServiceC
      port:
        number: 8080

Personalizando o Comportamento do Controlador de Entrada Nativo do OCI Usando Anotações

Você pode adicionar anotações aos manifestos de recursos IngressClass ou Ingress para personalizar o comportamento do controlador de entrada nativo do OCI (instalado como um programa independente ou como um complemento de cluster).

Personalizando o comportamento geral usando anotações

Você pode adicionar anotações aos manifestos de recursos IngressClass ou Ingress para personalizar o comportamento geral do controlador de entrada nativo do OCI.

Anotação Descrição Adicionar anotação a este manifesto de recursos Exemplo
oci-native-ingress.oraclecloud.com/id OCID de um balanceador de carga do OCI existente a ser usado, em vez de criar um novo.

Observe que, se você especificar um balanceador de carga existente, suas propriedades serão atualizadas conforme necessário para se alinhar aos valores nos manifestos de recursos IngressClassParameters e de Entrada.

IngressClass oci-native-ingress.oraclecloud.com/id: ocid1.loadbalancer.oc1.iad.aaaaaaaan___u7a
oci-native-ingress.oraclecloud.com/waf-policy-ocid OCID de uma política de firewall de aplicativo web (WAF) existente. Consulte Políticas do Serviço Web Application Firewall. IngressClass oci-native-ingress.oraclecloud.com/waf-policy-ocid: ocid1.webappfirewallpolicy.oc1.iad.ama___aqq
oci-native-ingress.oraclecloud.com/protocol Protocolo a ser usado para listener no balanceador de carga. Um de HTTP2 ou TCP.

(Observe que, se você especificar HTTP2 como protocolo, um listener configurado por TLS será obrigatório.)

Ingress oci-native-ingress.oraclecloud.com/protocol: "HTTP2"
oci-native-ingress.oraclecloud.com/backend-tls-enabled Se os pods de serviço de backend podem receber solicitações de TLS.

Se definido como false, as solicitações TLS serão encerradas no listener do balanceador de carga e as solicitações entre o conjunto de backend e os backends serão trocadas em texto simples.

Ingress oci-native-ingress.oraclecloud.com/backend-tls-enabled: "false"
oci-native-ingress.oraclecloud.com/http-listener-port

Crie uma única porta de listener para todos os caminhos HTTP sob essa entrada, em vez de criar uma porta de listener para cada porta de serviço. As políticas de roteamento são configuradas adequadamente.

Ingress oci-native-ingress.oraclecloud.com/http-listener-port: "100"
oci-native-ingress.oraclecloud.com/https-listener-port Crie uma única porta de listener para todos os caminhos HTTPS nessa entrada, em vez de criar uma porta de listener para cada porta de serviço. As políticas de roteamento são configuradas adequadamente. Ingress oci-native-ingress.oraclecloud.com/https-listener-port: "500"
oci-native-ingress.oraclecloud.com/policy Política a ser usada pelo conjunto de backend do balanceador de carga para distribuição de tráfego. Ingress oci-native-ingress.oraclecloud.com/policy: "ROUND_ROBIN"

Personalizando o comportamento de verificação de integridade usando anotações

Você pode adicionar anotações ao manifesto de recursos Ingress para personalizar as verificações de integridade executadas pelo balanceador de carga criado pelo controlador de entrada nativo do OCI. Para obter mais informações sobre verificações de integridade do balanceador de carga, consulte Verificações de Integridade para Balanceadores de Carga.

Anotação Descrição Adicionar anotação a este manifesto de recursos Exemplo
oci-native-ingress.oraclecloud.com/healthcheck-protocol Protocolo a ser usado para as verificações de integridade do conjunto de backend do balanceador de carga. Ingress oci-native-ingress.oraclecloud.com/healthcheck-protocol: "HTTP"
oci-native-ingress.oraclecloud.com/healthcheck-port Porta a ser usada para as verificações de integridade do conjunto de backend do balanceador de carga. Ingress oci-native-ingress.oraclecloud.com/healthcheck-port: "80"
oci-native-ingress.oraclecloud.com/healthcheck-path Caminho a ser usado para as verificações de integridade do conjunto de backend do balanceador de carga. Ingress oci-native-ingress.oraclecloud.com/healthcheck-path: "/test"
oci-native-ingress.oraclecloud.com/healthcheck-interval-milliseconds Intervalo entre as verificações de integridade do conjunto de backend do balanceador de carga. Ingress oci-native-ingress.oraclecloud.com/healthcheck-interval-milliseconds: "1000"
oci-native-ingress.oraclecloud.com/healthcheck-timeout-milliseconds Período após o qual a verificação de integridade do conjunto de backend do balanceador de carga é considerada como tendo falhado. Ingress oci-native-ingress.oraclecloud.com/healthcheck-timeout-milliseconds: "750"
oci-native-ingress.oraclecloud.com/healthcheck-retries Número de novas tentativas após as quais a verificação de integridade do conjunto de backend do balanceador de carga é considerada como tendo falhado. Ingress oci-native-ingress.oraclecloud.com/healthcheck-retries: "5"
oci-native-ingress.oraclecloud.com/healthcheck-return-code O código de status que o conjunto de backend do balanceador de carga deve retornar em resposta a uma verificação de integridade para ser considerado íntegro. Ingress oci-native-ingress.oraclecloud.com/healthcheck-return-code: "200"
oci-native-ingress.oraclecloud.com/healthcheck-response-regex Expressão regular para fazer parsing do corpo da resposta do conjunto de backend do balanceador de carga. É possível especificar qualquer valor regex (como * ou / ) ou um valor vazio. Ingress oci-native-ingress.oraclecloud.com/healthcheck-response-regex: "*"
oci-native-ingress.oraclecloud.com/healthcheck-force-plaintext Se uma verificação de integridade deve ser enviada para o backend do balanceador de carga sem SSL (somente HTTP). Se não for especificado, false será o valor padrão. Ingress oci-native-ingress.oraclecloud.com/healthcheck-force-plaintext: "true"

Configurando um Portão de Prontidão do Pod

As portas de prontidão do pod são condições adicionais incluídas em um manifesto de pod para indicar que um pod está pronto para receber tráfego. Os portões de prontidão do pod permitem implementar verificações de prontidão personalizadas complexas e podem ajudar a obter tempo de inatividade zero durante implantações contínuas. Para obter mais informações, consulte detalhes de preparação do pod na documentação do Kubernetes.

Ao usar o controlador de entrada nativo do OCI (como um programa independente ou como complemento de cluster) com um cluster que tenha rede de pod nativo da VCN como o tipo de rede, você pode especificar que o controlador de entrada nativo do OCI deve injetar um portão de preparação de pod na especificação de pod de cada pod criado em um namespace específico. Observe que você não pode usar o controlador de entrada nativo do OCI para injetar portas de prontidão de pod em especificações de pod se o cluster tiver Sobreposição de canal como o tipo de rede.

Especifique se o controlador de entrada nativo do OCI deve injetar um portão de preparação de pod na especificação de pod de cada pod criado em um namespace específico digitando:

kubectl label ns <namespace> podreadiness.ingress.oraclecloud.com/pod-readiness-gate-inject=enabled

O controlador de entrada nativo do OCI injeta uma condição na especificação de pod de cada pod criado no namespace. Por exemplo:


kind: Pod
...
    spec:
      readinessGates:
      - conditionType: podreadiness.ingress.oraclecloud.com/k8s_6b5b1b3a38
Você pode verificar o status dos portões de preparação do pod digitando:
kubectl get pods -o wide -w
Exemplo de saída:
NAME                                             READY   STATUS    RESTARTS   AGE   IP            NODE          NOMINATED NODE   READINESS GATES
testecho-7cdcfff87f-b6xt4                        1/1     Running   0          35s   10.0.10.242   10.0.10.135   <none>           0/1
testecho-7cdcfff87f-b6xt4                        1/1     Running   0          72s   10.0.10.242   10.0.10.135   <none>           1/1

Configurando Listeners TCP

Você pode usar o controlador de entrada nativo do OCI (como um programa independente ou como complemento de cluster) para configurar listeners do balanceador de carga como listeners TCP. Cada listener TCP simplesmente encaminha o tráfego TCP recebido em uma porta específica para o serviço de backend especificado para essa porta em um manifesto de recursos Ingress, sem executar qualquer roteamento da camada de transporte 7.

Você define a anotação oci-native-ingress.oraclecloud.com/protocol para especificar que o controlador de entrada nativo do OCI deve criar um listener TCP para cada porta exclusiva incluída nas regras de roteamento em um manifesto de recursos Ingress.

Para especificar que o controlador de entrada nativo do OCI deve criar listeners TCP:

  1. Defina um novo recurso de entrada em um arquivo .yaml. Consulte Criar recurso de Entrada.
  2. Na seção metadata:, adicione um elemento annotations: e defina a anotação oci-native-ingress.oraclecloud.com/protocol como TCP, no formato:
    kind: Ingress
    metadata:
      name: <i-name>
      annotations:
        oci-native-ingress.oraclecloud.com/protocol: TCP
    spec:
    ...

    em que name: <i-name> é sua opção de nome para o recurso de entrada.

    Por exemplo:

    kind: Ingress
    metadata:
      name: ingress-pass-through
      annotations:
        oci-native-ingress.oraclecloud.com/protocol: TCP
    spec:
    ...
  3. Na seção rules: do manifesto de recursos Ingress, adicione uma regra para cada listener que deve receber tráfego TCP:
    • (recomendado) Defina paths.pathType como ImplementationSpecific.
    • Defina paths.backend.service.name como o nome do serviço de backend.
    • Defina paths.backend.service.port.number como a porta na qual escutar o tráfego TCP e para a qual encaminhar o tráfego TCP.

    Por exemplo, se você quiser que um listener TCP na porta 8080 encaminhe o tráfego TCP para my-first-svc:8080 e um listener TCP na porta 8081 encaminhe o tráfego TCP para my-second-svc:8081, poderá configurar um manifesto de recursos Ingress da seguinte forma:

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: ingress-pass-through
      annotations:
        oci-native-ingress.oraclecloud.com/protocol: TCP
    spec:
      rules:
        - http:
            paths:
              - pathType: ImplementationSpecific
                backend:
                  service:
                    name: my-first-svc
                    port:
                      number: 8080
        - http:
            paths:
              - pathType: ImplementationSpecific
                backend:
                  service:
                    name: my-second-svc
                    port:
                      number: 8081 
    
  4. Crie o recurso digitando kubectl create -f <filename>.yaml

Adicionando Suporte a Solicitações HTTPS/TLS

Você pode usar o controlador de entrada nativo do OCI (como um programa independente ou como complemento de cluster) para oferecer suporte à comunicação HTTPS segura. Usando o controlador de entrada nativo do OCI, você pode configurar listeners e conjuntos de backend do balanceador de carga do OCI para tratar o tráfego criptografado usando TLS (anteriormente SSL).

Ao usar o controlador de entrada nativo do OCI para oferecer suporte à comunicação HTTPS, você tem duas opções:

Ao tratar o tráfego HTTPS, o balanceador de carga do OCI criado pelo controlador de entrada nativo do OCI implementa TLS de ponta a ponta por padrão. O balanceador de carga usa certificados para aceitar uma solicitação criptografada TLS de um cliente e, em seguida, usa regras de roteamento para encaminhar a solicitação ao conjunto de backend apropriado. O conjunto de backend cria uma nova conexão TLS com backends em execução no cluster (usando o pacote de CAs como autoridade confiável para a nova conexão).

Observe o seguinte:

  • Se você excluir um recurso IngressClass, o controlador de entrada nativo do OCI excluirá o balanceador de carga que ele criou (ou excluirá o balanceador de carga existente especificado pela anotação oci-native-ingress.oraclecloud.com/id). No entanto, observe que o controlador de entrada não exclui recursos criados no serviço OCI Certificates. Você é responsável por excluir esses recursos de serviço de Certificados. Em particular, se você especificou um segredo do Kubernetes no manifesto de recursos Ingress, observe que você é responsável por excluir todos os recursos do serviço Certificates que o controlador de entrada nativo do OCI criou para você.
  • Os certificados obtidos do serviço OCI Certificates do tipo Importado não podem ser alternados automaticamente. Se você quiser que os certificados sejam alternados automaticamente, obtenha manualmente um certificado no serviço OCI Certificates especificando que deseja que o certificado seja emitido por uma CA interna do serviço Certificates (os certificados são do tipo Emitido por CA interna). Você pode configurar certificados do tipo Emitido por CA interna para serem alternados automaticamente.
  • Se você especificar um segredo do Kubernetes no manifesto de recursos Ingress, observe que os certificados obtidos pelo controlador de entrada nativo do OCI do serviço Certificates são do tipo Importado e, portanto, não alternados automaticamente. Para rotacionar manualmente esses certificados de serviço de Certificados, primeiro crie um novo segredo do Kubernetes usando um novo par de chaves pública e privada TLS e um novo certificado. Em seguida, atualize o recurso Ingress com o nome do novo segredo. O controlador de entrada nativo do OCI obtém um novo certificado e um pacote de CAs do serviço Certificates e os associa ao listener e ao conjunto de backend (substituindo o certificado e o pacote de CAs anteriores).
  • Um listener só pode ser associado a um certificado. Portanto, não crie vários recursos de entrada que tenham regras especificando a mesma combinação de serviço/porta de backend, mas em que os recursos de entrada usem certificados diferentes.
  • Por padrão, o balanceador de carga do OCI criado pelo controlador de entrada nativo do OCI implementa TLS de ponta a ponta. O balanceador de carga encerra a solicitação de TLS no listener e uma nova conexão de TLS é estabelecida entre o conjunto de backend e os backends. No entanto, se os backends não estiverem executando um servidor HTTPS e, portanto, você quiser que a conexão entre o conjunto de backend e os backends esteja em texto simples, defina a anotação oci-native-ingress.oraclecloud.com/backend-tls-enabled como "false". Quando a anotação oci-native-ingress.oraclecloud.com/backend-tls-enabled é definida como "false", o balanceador de carga pode aceitar tráfego criptografado de um cliente, mas o tráfego entre o balanceador de carga e os backends não é criptografado.

Opção 1: O Controlador de Entrada Nativo do OCI obtém o certificado do serviço Certificates usando um segredo do Kubernetes

Para configurar o controlador de entrada nativo do OCI para obter um certificado do serviço OCI Certificates:

  1. Obtenha um par de chaves pública e privada TLS e um certificado.

    Em ambientes de produção, você obtém um certificado TLS da Autoridade de Certificação escolhida enviando uma solicitação de assinatura de certificado. Durante o processo de solicitação de certificado, uma chave pública e a chave privada correspondente são geradas.

    Em ambientes de desenvolvimento e teste, você mesmo pode criar um certificado autoassinado e gerar uma chave privada usando uma ferramenta como OpenSSL. Por exemplo (usando OpenSSL 3.0 ou posterior):

    1. Gere um par de chaves pública e privada informando os seguintes comandos:

      openssl genrsa -out rootCA.key 4096
      openssl req -x509 -addext basicConstraints=critical,CA:TRUE -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.crt -subj /CN=RootCA
    2. Gere um certificado informando os seguintes comandos:

      openssl genrsa -out server.key 4096
      openssl req -new -sha256 -key server.key -subj /C=US/ST=CA/O=MyOrg,Inc./CN=my.example.com -out server.csr
      openssl x509 -req -in server.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out server.crt -days 500 -sha256

    Neste exemplo:

    • rootCA.key contém o par de chaves da CA raiz.
    • rootCA.crt contém o certificado da CA raiz.
    • server.key contém o par de chaves para gerar o certificado do servidor.
    • server.csr contém a solicitação de assinatura do certificado do servidor.
    • server.crt contém o certificado do servidor gerado.
  2. Crie um recurso secreto do Kubernetes de uma das seguintes maneiras:
    • Usando o comando kubectl create secret generic, digitando:

      kubectl create secret generic <k8s-secret-name> --type=kubernetes.io/tls --from-file=ca.crt=<path-and-filename>.crt --from-file=tls.crt=<path-and-filename>.crt --from-file=tls.key=<path-and-filename>.key

      em que:

      • <k8s-secret-name> é sua escolha de nome para o segredo do Kubernetes
      • --from-file=ca.crt=<path-and-filename>.crt especifica o caminho para o arquivo que contém o certificado da CA raiz. Por exemplo, --from-file=ca.crt=rootCA.crt
      • --from-file=tls.crt=<path-and-filename>.crt especifica o caminho para o arquivo que contém o certificado do servidor gerado. Por exemplo, --from-file=tls.crt=server.crt
      • --from-file=tls.key=<path-and-filename>.key especifica o caminho para o arquivo que contém a chave privada gerada. Por exemplo, --from-file=tls.key=server.key

      Por exemplo:

      kubectl create secret generic example-tls-secret --type=kubernetes.io/tls --from-file=ca.crt=rootCA.crt --from-file=tls.crt=server.crt --from-file=tls.key=server.key
    • Usando um arquivo de manifesto de recursos Secret:
      1. Defina o segredo do Kubernetes em um arquivo .yaml, no formato:

        apiVersion: v1
        kind: Secret
        metadata:
          name: <k8s-secret-name>
        type: kubernetes.io/tls
        data:
          ca.crt: <base64-encoded-certificate-chain>
          tls.crt: <base64-encoded-server-certificate>
          tls.key: <base64-encoded-private-key>

        em que:

        • name: <k8s-secret-name> é sua escolha de nome para o recurso secreto do Kubernetes.
        • ca.crt: <base64-encoded-certificate-chain> é o conteúdo do arquivo (ou arquivos) que contém certificados intermediários que formam uma cadeia de certificados do certificado folha de volta para a Autoridade de Certificação. Observe que você pode omitir ca.cert, desde que inclua toda a cadeia de certificados como o valor de tls.cert (nesse caso, inicie a cadeia de certificados com o conteúdo do arquivo que contém o certificado do servidor gerado, seguido pelos certificados restantes).
        • tls.crt: <base64-encoded-server-certificate> é o conteúdo do arquivo que contém o certificado do servidor gerado.
        • tls.key: <base64-encoded-private-key> é o conteúdo do arquivo que contém a chave privada gerada.

        Por exemplo:

        apiVersion: v1
        kind: Secret
        metadata:
          name: example-tls-secret
        type: kubernetes.io/tls
        data:
          ca.crt : MIIFGERTegcDFRTuSDGfghREdE______Jre
          tls.crt: MIIC2DCCAcCgAwIBAgIBATANBg______kqh
          tls.key: MIIEpgIBAAKCAQEA7yn3bRHQ5F______HMQ
      2. Crie o recurso secreto digitando kubectl create -f <filename>.yaml

  3. Adicione o segredo do Kubernetes a um manifesto de recursos Ingress:
    1. Defina um novo recurso de entrada em um arquivo .yaml. Consulte Criar recurso de Entrada.
    2. Na seção spec: do manifesto, adicione um elemento tls: que especifique o host que receberá o tráfego HTTPS e o nome do segredo do Kubernetes, no formato:
      kind: Ingress
      ...
      spec:
        tls:
        - hosts:
            - <host-name>
          secretName: <k8s-secret-name>

      Por exemplo:

      kind: Ingress
      ...
      spec:
        tls:
        - hosts:
            - my.example.com
          secretName: example-tls-secret
    3. Na seção rules: do manifesto, adicione uma regra para o host que receberá o tráfego HTTPS e especifique 443 como a porta na qual escutar o tráfego HTTPS.

      Por exemplo:

      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: acme-tls-secret-ingress
      spec:
        tls:
        - hosts:
            - my.example.com
          secretName: example-tls-secret
        rules:
        - host: "my.example.com"
          http:
            paths:
            - pathType: Prefix
              path: "/TLSPath"
              backend:
                service:
                  name: tls-test
                  port:
                    number: 443
    4. Crie o recurso digitando kubectl create -f <filename>.yaml

Quando você cria o recurso de entrada, o controlador de entrada nativo do OCI usa o segredo do Kubernetes para obter um certificado do tipo Importado e um pacote de CAs (pacote de Autoridade de Certificação), do serviço OCI Certificates. O controlador de entrada nativo do OCI associa o certificado ao listener e o pacote de CAs ao conjunto de backend.

Quando o listener que atende na porta 443 recebe uma solicitação HTTPS para o host especificado, o listener usa o certificado para encerramento de TLS. Em seguida, o listener usa a regra de roteamento para encaminhar a solicitação ao conjunto de backend. O conjunto de backend cria uma nova conexão TLS com os backends em execução no cluster (usando o pacote de CAs como autoridade confiável para a nova conexão).

Opção 2: Você obtém o certificado do serviço Certificates

Para configurar o controlador de entrada nativo do OCI para usar um certificado obtido do serviço OCI Certificates:

  1. Crie um certificado no serviço OCI Certificates de uma das seguintes maneiras:
    • importando um certificado emitido por uma CA de terceiros (o certificado será do tipo Importado)
    • emitindo o certificado internamente de uma CA do serviço Certificates (o certificado será do tipo Issued by internal CA)

    Não crie um certificado para gerenciar externamente (do tipo Emitido por CA interna, gerenciado externamente). Para obter mais informações, consulte Criando um Certificado.

  2. Anote o OCID do certificado.
  3. Adicione o OCID do certificado a um manifesto de recursos Ingress:
    1. Defina um novo recurso de entrada em um arquivo .yaml. Consulte Criar recurso de Entrada.
    2. Na seção metadata:, adicione um elemento annotations: que especifique o OCID do certificado criado no serviço OCI Certificates, no formato:
      kind: Ingress
      metadata:
        name: <i-name>
        annotations:
          oci-native-ingress.oraclecloud.com/certificate-ocid: <certificate-ocid>
      spec:
      ...

      em que:

      • name: <i-name> é sua escolha de nome para o recurso de entrada.
      • oci-native-ingress.oraclecloud.com/certificate-ocid: <certificate-ocid> é o OCID do certificado criado no serviço OCI Certificates

      Por exemplo:

      kind: Ingress
      metadata:
        name: acme-tls-certificate-ingress
        annotations:
          oci-native-ingress.oraclecloud.com/certificate-ocid: ocid1.certificate.oc1.iad.amaaaaaa______gabc
      spec:
      ...
    3. Na seção rules: do manifesto de recursos Ingress, adicione uma regra para o host que receberá o tráfego HTTPS e especifique 443 como a porta na qual escutar o tráfego HTTPS.

      Por exemplo:

      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: acme-tls-certificate-ingress
        annotations:
          oci-native-ingress.oraclecloud.com/certificate-ocid: ocid1.certificate.oc1.iad.amaaaaaa______gabc
      spec:
        rules:
        - host: "my.example.com"
          http:
            paths:
            - pathType: Prefix
              path: "/TLSPath"
              backend:
                service:
                  name: tls-test
                  port:
                    number: 443
    4. Crie o recurso digitando kubectl create -f <filename>.yaml

O que acontece quando você cria o recurso de entrada depende de como criou o certificado no serviço OCI Certificates:

  • Se você criou o certificado importando um certificado emitido por uma CA de terceiros, o certificado será do tipo Importado. O controlador de entrada nativo do OCI associa o certificado ao listener, cria um pacote de CAs da cadeia de certificados e associa o pacote de CAs ao conjunto de backend. Observe que não é possível configurar certificados do tipo Importado para serem alternados automaticamente.
  • Se você criou o certificado emitindo o certificado internamente de uma CA do serviço Certificates, o certificado será do tipo Emitido por CA interna. O controlador de entrada nativo do OCI associa o certificado ao listener, obtém o OCID da CA e associa esse OCID ao conjunto de backend. Observe que você pode configurar certificados do tipo Emitido por CA interna para serem alternados automaticamente.

Quando o listener que atende na porta 443 recebe uma solicitação HTTPS para o host especificado, o listener usa o certificado para encerramento de TLS. Em seguida, o listener usa a regra de roteamento para encaminhar a solicitação ao conjunto de backend. O conjunto de backend cria uma nova conexão TLS com os backends em execução no cluster (usando o pacote de CAs ou a CA identificada por seu OCID, como a autoridade confiável para a nova conexão).

Agregando Portas do Listener HTTP/HTTPS

Ao usar o controlador de entrada nativo do OCI (como um programa independente ou como complemento de cluster), você pode agregar todo o tráfego HTTP em uma única porta de listener e, da mesma forma, pode agregar todo o tráfego HTTPS em uma única porta.

Por padrão, o controlador de entrada nativo do OCI cria um listener do balanceador de carga do OCI para cada porta de serviço de backend definida em um manifesto Ingress. O controlador de entrada nativo do OCI também cria uma política de roteamento para cada porta do listener. No entanto, você pode usar a anotação oci-native-ingress.oraclecloud.com/http-listener-port e/ou a anotação oci-native-ingress.oraclecloud.com/https-listener-port para criar um único listener e uma política de roteamento para todas as solicitações HTTP e/ou um único listener e uma política de roteamento para todas as solicitações HTTPS.

Por exemplo, você pode definir uma entrada com regras para quatro serviços de backend, cada serviço atendendo em uma porta diferente, da seguinte forma:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: sample-ingress
spec:
  tls:
    - hosts:
        - "foo.bar.com3"
        - "foo.bar.com4"
      secretName: secret_name
  rules:
    - host: "foo.bar.com1"
      http:
        paths:
          - pathType: Prefix
            path: "/testecho1"
            backend:
              service:
                name: testecho1
                port:
                  number: 80
    - host: "foo.bar.com2"
      http:
        paths:
          - pathType: Prefix
            path: "/testecho2"
            backend:
              service:
                name: testecho2
                port:
                  number: 81
    - host: "foo.bar.com3"
      http:
        paths:
          - pathType: Prefix
            path: "/testecho3"
            backend:
              service:
                name: testecho3
                port:
                  number: 443
    - host: "foo.bar.com4"
      http:
        paths:
          - pathType: Prefix
            path: "/testecho4"
            backend:
              service:
                name: testecho4
                port:
                  number: 444 

Neste exemplo, o manifesto Ingress define quatro serviços:

  • testecho1, fazendo listening na porta 80 para tráfego HTTP
  • testecho2, fazendo listening na porta 81 para tráfego HTTP
  • testecho3, fazendo listening na porta 443 para tráfego HTTPS
  • testecho4, fazendo listening na porta 444 para tráfego HTTPS

Por padrão, o controlador de entrada nativo do OCI cria:

  • Quatro listeners no balanceador de carga (dois listeners com listener nas portas 80 e 81 para tráfego HTTP e dois listeners com listener nas portas 443 e 444 para tráfego HTTPS).
  • Quatro políticas de roteamento (uma para cada porta do listener).

Para simplificar a administração, você pode decidir ter um único listener atendendo ao tráfego HTTP e um único listener atendendo ao tráfego HTTPS, definindo anotações da seguinte forma:

oci-native-ingress.oraclecloud.com/http-listener-port: "100"
oci-native-ingress.oraclecloud.com/https-listener-port: "500"

Com as anotações definidas conforme mostrado, o controlador de entrada nativo do OCI cria:

  • um único listener que está escutando tráfego HTTP na porta 100 e uma única política de roteamento para a porta 100 com caminhos para backends nas portas testecho1:80 e testecho2:81
  • um único listener que faz listening do tráfego HTTPS na porta 500 e uma única política de roteamento para a porta 500 com caminhos para backends nas portas testecho3:443 e testecho4:444

Observe o seguinte:

  • Você pode definir as anotações oci-native-ingress.oraclecloud.com/http-listener-port e oci-native-ingress.oraclecloud.com/https-listener-port independentemente umas das outras, para que não precise definir as duas anotações.

  • Se o manifesto do recurso Ingress incluir a anotação oci-native-ingress.oraclecloud.com/certificate-ocid, o controlador de entrada nativo do OCI considerará todos os hosts a serem configurados para TLS. Nesse caso, o controlador de entrada nativo do OCI:

    • ignora a anotação oci-native-ingress.oraclecloud.com/http-listener-port (se presente no manifesto de recursos Ingress)
    • aplica a anotação oci-native-ingress.oraclecloud.com/https-listener-port (se presente no manifesto de recursos Ingress) para criar um único listener para todo o tráfego
  • Independentemente das anotações oci-native-ingress.oraclecloud.com/http-listener-port e oci-native-ingress.oraclecloud.com/https-listener-port, o controlador de entrada nativo do OCI só cria listeners HTTP e/ou HTTPS (e políticas de roteamento correspondentes) se necessário para serviços de backend definidos no manifesto de recursos de Entrada. Por exemplo:
    • Se você incluir a anotação oci-native-ingress.oraclecloud.com/http-listener-port em um manifesto de recursos Ingress que não define um backend HTTP, o controlador de entrada nativo do OCI não criará um listener HTTP.
    • Se você incluir a anotação oci-native-ingress.oraclecloud.com/https-listener-port em um manifesto de recursos Ingress que não defina um backend HTTPS, o controlador de entrada nativo do OCI não criará um listener HTTPS.
    • Se você incluir anotações oci-native-ingress.oraclecloud.com/http-listener-port e oci-native-ingress.oraclecloud.com/https-listener-port em um manifesto de recursos Ingress que só define backends HTTP, o controlador de entrada nativo do OCI ignorará a anotação oci-native-ingress.oraclecloud.com/https-listener-port e não criará um listener HTTPS.
    • Se você incluir anotações oci-native-ingress.oraclecloud.com/http-listener-port e oci-native-ingress.oraclecloud.com/https-listener-port em um manifesto de recursos Ingress que defina apenas backends HTTPS, o controlador de entrada nativo do OCI ignorará a anotação oci-native-ingress.oraclecloud.com/http-listener-port e não criará um listener HTTP.