Exibindo aplicativos publicamente com o Ingress

Exponha publicamente vários aplicativos em seu cluster do Red Hat® OpenShift® on IBM Cloud® criando recursos Ingress gerenciados pelo controlador Ingress.

Pré-requisitos

Antes de começar com o Ingresso, revise os pré-requisitos a seguir.

  • A configuração do Ingress requer as funções do IBM Cloud IAM a seguir:
    • Função de acesso à plataforma de administrador para o cluster em IBM Cloud Kubernetes Service.
    • Função de acesso ao serviço de gerenciamento em todos os namespaces do IBM Cloud Kubernetes Service (projetos do Red Hat OpenShift ).
  • Se uma zona falhar, você pode ver falhas intermitentes em solicitações a apps que são expostos pelo controlador de ingresso naquela zona.
  • Para assegurar a alta disponibilidade, pelo menos dois nós do trabalhador por zona são recomendados.

Exposição pública de aplicativos em clusters por meio de um endpoint de serviço em nuvem pública

Clusters clássicos Nuvem Privada Virtual

Se o seu cluster tiver sido criado na infraestrutura clássica, ou se tiver sido criado na infraestrutura VPC e você tiver habilitado o endpoint do serviço de nuvem pública no momento da criação, você poderá usar o controlador Ingress público padrão para expor os aplicativos do seu cluster, de modo que recebam solicitações provenientes da rede pública.

Antes de Iniciar:

Etapa 1: Implementar apps e criar serviços de app

Inicie implementando seus apps e criando serviços do Kubernetes para expô-los.

  1. Implemente o seu app no cluster. Assegure-se de incluir um rótulo em sua implementação na seção de metadados de seu arquivo de configuração, como app: code. Este rótulo é necessário para identificar todos os pods em que seu app executa para que os pods estejam no balanceamento de carga de ingresso.

  2. Para cada implementação de app que você deseja expor, crie um serviço ClusterIP do Kubernetes. O seu app deve ser exposto por um serviço do Kubernetes a ser incluído no balanceamento de carga do Ingress.

oc expose deploy <app_deployment_name> --name my-app-svc --port <app_port> -n <namespace>

Etapa 2: Configurar uma terminaçã TLS e com certificados TLS e segredos Kubernetes

Seu certificado do TLS deve ser armazenado como um segredo do Kubernetes em cada namespace onde seus aplicativos estejam hospedados.

Etapa 3: Criar o recurso de Ingresso

Os recursos do Ingress definem as regras de roteamento que o controlador do Ingress usa para rotear o tráfego para o seu serviço de app.

  1. Defina um arquivo de configuração de recursos do Ingress que use o domínio fornecido pela IBM ou seu domínio customizado para rotear o tráfego de rede recebido para os serviços criados anteriormente.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: myingressresource
    spec:
      tls:
      - hosts:
        - <domain>
        secretName: <secret_name>
      rules:
      - host: <domain>
        http:
          paths:
          - path: /<app1_path>
            pathType: Prefix
            backend:
                service:
                    name: test
                    port:
                        number: 80
          - path: /<app2_path>
            backend:
                service:
                    name: <app2_service>
                    port:
                        number: 80
    
    tls
    Se quiser usar o TLS, inclua esta seção TLS em seu recurso. Substitua <domain> pelo seu subdomínio. Não use * para o seu host ou deixe a propriedade do host vazia para evitar falhas durante a criação do Ingresso. Substitua <tls_secret_name> pelo segredo que você criou anteriormente que mantém o seu certificado e chave de TLS para um domínio customizado ou o segredo de TLS que foi gerado automaticamente para um subdomínio fornecido pela IBM.
    host
    Substitua <domain> pelo subdomínio do Ingress fornecido pela IBM ou o domínio customizado. Se o seu cluster tiver diversos projetos nos quais os apps são expostos, um recurso do Ingress será necessário por projeto. É possível usar o mesmo subdomínio em cada recurso ou subdomínios diferentes em cada recurso. Por exemplo, se você usar um domínio curinga, poderá anexar um subdomínio curinga no início do domínio, como subdomain1.custom_domain.net ou subdomain1.mycluster-<hash>-0000.us-south.containers.appdomain.cloud. Não use * para o seu host ou deixe a propriedade do host vazia para evitar falhas durante a criação do Ingress.
    path
    Substitua <app_path> pelo caminho no qual seu aplicativo está em escuta. O caminho é anexado ao domínio fornecido pela IBM ou ao seu domínio customizado para criar uma rota exclusiva para o app. Quando você insere essa rota em um navegador da web, o tráfego de rede é roteado para o controlador de Ingresso. O controlador de ingresso consulta o serviço associado e envia o tráfego de rede para o serviço. O serviço então encaminha o tráfego para os pods nos quais o app é executado. Muitos apps não atendem em um caminho específico, mas usam o caminho raiz e uma porta específica. Neste caso, defina o caminho raiz como / e não especifique um caminho individual para o seu app. Para http://domain/, insira / como o caminho. Para http://domain/app1_path, insira /app1_path como o caminho.
    pathType
    O método de correspondência de caminho da URL. Os valores suportados são ImplementationSpecific, Exact ou Prefix. Para obter mais informações e exemplos de cada tipo de caminho, consulte a Documentação do Kubernetes da comunidade.
    name
    Substitua <app1_service> e <app2_service>, e assim por diante, pelo nome dos serviços que você criou para expor seus apps. Se os seus apps forem expostos por serviços em diferentes projetos no cluster, inclua somente os serviços de app que estão no mesmo projeto. Deve-se criar um recurso do Ingress para cada projeto no qual haja apps a serem expostos.
    port
    A porta na qual o serviço atende. Use a mesma porta que você definiu quando criou o serviço do Kubernetes para seu app.
  2. Crie o recurso de Ingresso para seu cluster. Assegure-se de que o recurso seja implementado no mesmo projeto que os serviços de app especificados no recurso.

    oc apply -f myingressresource.yaml -n <project>
    
  3. Verifique se o recurso de Ingresso foi criado com êxito. Se as mensagens nos eventos indicarem um erro na configuração do seu recurso, corrija os valores no arquivo de recursos e reaplique o arquivo ao recurso.

    oc describe ingress myingressresource
    

Seu recurso do Ingress é criado no mesmo projeto que seus serviços de app e seus apps são registrados com o controlador do Ingress.

Etapa 4: Acessar seu app na Internet

Em um navegador da web, insira a URL do serviço de app a ser acessado.

https://<domain>/<app1_path>

Se tiver exposto diversos apps, acesse-os mudando o caminho anexado à URL.

https://<domain>/<app2_path>

Se você usa um domínio curinga, acesse esses apps com os seus próprios subdomínios.

http://<subdomain1>.<domain>/<app1_path>
http://<subdomain2>.<domain>/<app1_path>

Não é possível conectar ao seu app por meio do Ingress? Tente Resolução de problemas do Ingress.

Expondo apps publicamente em clusters de VPC com um terminal em serviço de nuvem privada apenas

Nuvem Privada Virtual

Se o seu cluster for criado em uma infraestrutura VPC e você tiver habilitado apenas o endpoint do serviço de nuvem privada no momento da criação, ele será criado, por padrão, apenas com um controlador Ingress privado. Para expor publicamente apps, deve-se primeiro criar um controlador do Ingress público. Em seguida, deve-se registrar o controlador do Ingress com um subdomínio e, opcionalmente, importar o próprio certificado TLS.

Etapa 1: Implementar apps e criar serviços de app

Inicie implementando seus apps e criando serviços do Kubernetes para expô-los.

  1. Implemente o seu app no cluster. Assegure-se de incluir um rótulo em sua implementação na seção de metadados de seu arquivo de configuração, como app: code. Este rótulo é necessário para identificar todos os pods em que seu app executa para que os pods estejam no balanceamento de carga de ingresso.

  2. Para cada implementação de app que você deseja expor, crie um serviço ClusterIP do Kubernetes. O seu app deve ser exposto por um serviço do Kubernetes a ser incluído no balanceamento de carga do Ingress.

oc expose deploy <app_deployment_name> --name my-app-svc --port <app_port> -n <namespace>

Etapa 2: Configurar uma terminaçã TLS e com certificados TLS e segredos Kubernetes

Seu certificado do TLS deve ser armazenado como um segredo do Kubernetes em cada namespace onde seus aplicativos estejam hospedados.

TLS segredos para domínios personalizados do Ingress

Para usar um domínio criado por você mesmo, como um domínio registrado em um provedor externo, consulte a seção “Configurando segredos d TLS para subdomínios personalizados ”.

TLS segredos para domínios do Ingress gerenciados pelo IBM

Siga as etapas para configurar os segredos d TLS para o domínio do Ingress gerenciado pelo IBM.

  1. Liste os subdomínios existentes em seu cluster. Na coluna Subdomínio da saída, copie o subdomínio que tem o valor de 000<n> mais alto.
    ibmcloud oc nlb-dns ls --cluster CLUSTER_NAME_OR_ID
    
    Nesta saída de exemplo, o subdomínio mycluster-a1b2cdef345678g9hi012j3kl4567890-0002.us-south.containers.appdomain.cloud tem o valor 000<n> mais alto de 0002.
    Subdomain                                                                               Load Balancer Hostname                        Health Monitor   SSL Cert Status           SSL Cert Secret Name
    mycluster-a1b2cdef345678g9hi012j3kl4567890-0000.us-south.containers.appdomain.cloud     ["1234abcd-us-south.lb.appdomain.cloud"]      None             created                   mycluster-a1b2cdef345678g9hi012j3kl4567890-0000
    mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud     ["5678efgh-us-south.lb.appdomain.cloud"]      None             created                   mycluster-a1b2cdef345678g9hi012j3kl4567890-0001
    mycluster-a1b2cdef345678g9hi012j3kl4567890-0002.us-south.containers.appdomain.cloud     ["9012ijkl-us-south.lb.appdomain.cloud"]      None             created                   mycluster-a1b2cdef345678g9hi012j3kl4567890-0002
    
  2. No subdomínio que você copiou, mude o valor 000<n> no subdomínio para 000<n+1>. Por exemplo, o subdomínio mycluster-a1b2cdef345678g9hi012j3kl4567890-0002.us-south.containers.appdomain.cloud é alterado para mycluster-a1b2cdef345678g9hi012j3kl4567890-0003.us-south.containers.appdomain.cloud. O valor n+1 indica o próximo subdomínio consecutivo criado nesse cluster. Você registra este subdomínio nas etapas posteriores. Ao registrar o domínio, um segredo de “ TLS ” para o domínio é gerado automaticamente. O nome secreto segue um formato truncado do subdomínio, como mycluster-a1b2cdef345678g9hi012j3kl4567890-0003.

Etapa 3: criar e configurar um controlador do Ingress público

Após obter seu certificado de domínio e TLS pronto, você deve criar um controlador Ingresso público e configurar o controlador com o seu domínio.

  1. Crie um arquivo de configuração para um controlador do Ingress público.

    apiVersion: operator.openshift.io/v1
    kind: IngressController
    metadata:
      name: public-ingress-controller
      namespace: openshift-ingress-operator
    spec:
      replicas: 2
      domain: <domain>
      endpointPublishingStrategy:
        loadBalancer:
          scope: External
        type: LoadBalancerService
    
  2. Crie o recurso IngressController no projeto openshift-ingress-operator do seu cluster. Quando você cria o IngressController, um controlador de ingresso Público é automaticamente criado e implementado no projeto openshift-ingress com base nas configurações do IngressController. Além disso, um serviço de controlador de ingresso é criado para expor o controlador de ingresso.

    oc create -f public-ingress-controller.yaml -n openshift-ingress-operator
    
  3. Execute o comando oc get e localize o nome do host do VPC no campo EXTERNAL IP do serviço do router-public-ingress-controller Em clusters de VPC, os endereços IP externos dos serviços são não estáticos e, em vez disso, são mantidos atrás de um nome do host designado por VPC.

    oc get svc router-public-ingress-controller -n openshift-ingress
    

    Saída de exemplo

    NAME                                  TYPE           CLUSTER-IP       EXTERNAL-IP                             PORT(S)                      AGE
    router-public-ingress-controller     LoadBalancer   172.21.57.132    1234abcd-us-south.lb.appdomain.cloud    80/TCP,443/TCP,1940/TCP      3m
    
  4. Registre o nome do host da VPC do serviço com o domínio que você escolheu anteriormente.

    • Domínio customizado: trabalhe com seu provedor de DNS para incluir o nome do host da VPC do serviço router-public-ingress-controller como um CNAME que é mapeado para o seu domínio customizado.
    • Domínio fornecido pela IBM: crie uma entrada DNS para o nome do host da VPC do serviço router-public-ingress-controller. Ao executar o comando a seguir, o subdomínio que você especificou no arquivo public-ingress-controller.yaml é gerado automaticamente e é registrado com o serviço router-public-ingress-controller. Um segredo do TLS para o domínio é gerado automaticamente no projeto que você especifica no qual seu app é executado. O nome secreto segue um formato truncado do subdomínio, como mycluster-a1b2cdef345678g9hi012j3kl4567890-0003.
        ibmcloud oc nlb-dns create vpc-gen2 --cluster <cluster_name_or_ID> --lb-host <VPC_hostname> --secret-namespace <project>
        ```
    
    

Etapa 4: Criar o Recurso do Ingresso

Os recursos do Ingress definem as regras de roteamento que o controlador do Ingress usa para rotear o tráfego para o seu serviço de app.

  1. Defina um arquivo de configuração de recursos do Ingress que use o domínio fornecido pela IBM ou seu domínio customizado para rotear o tráfego de rede recebido para os serviços criados anteriormente.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: myingressresource
    spec:
      tls:
      - hosts:
        - <subdomain>
        secretName: <custom_secret_name>
      rules:
      - host: <subdomain>
        http:
          paths:
          - path: /<app1_path>
            pathType: Prefix
            backend:
                service:
                  name: <app1_service>
                  port:
                    number: 80
          - path: /<app2_path>
            backend:
                service:
                  name: <app2_service>
                  port:
                    number: 80
    
    tls
    Se quiser usar o TLS, inclua esta seção TLS em seu recurso.
    Substitua <domain> pelo seu subdomínio. Não use * para o seu host ou deixe a propriedade do host vazia para evitar falhas durante a criação do Ingress.
    Substitua <tls_secret_name> pelo segredo que você criou anteriormente que mantém o seu certificado e chave TLS para um domínio customizado ou o segredo de TLS que foi gerado automaticamente para um subdomínio fornecido pela IBM.
    host
    Substitua <domain> pelo seu subdomínio. Se o seu cluster tiver diversos projetos nos quais os apps são expostos, um recurso do Ingress será necessário por projeto. É possível usar o mesmo subdomínio em cada recurso ou subdomínios diferentes em cada recurso. Por exemplo, se você usar um domínio curinga, será possível anexar um subdomínio curinga ao início do domínio, como subdomain1.custom_domain.net. Não use * para o seu host ou deixe a propriedade do host vazia para evitar falhas durante a criação do Ingress.
    path
    Substitua <app_path> pelo caminho no qual seu aplicativo está em escuta. O caminho é anexado ao domínio fornecido pela IBM ou ao seu domínio customizado para criar uma rota exclusiva para o app. Quando você insere essa rota em um navegador da web, o tráfego de rede é roteado para o controlador de Ingresso. O controlador de ingresso consulta o serviço associado e envia o tráfego de rede para o serviço. O serviço então encaminha o tráfego para os pods nos quais o app é executado. Muitos apps não atendem em um caminho específico, mas usam o caminho raiz e uma porta específica. Neste caso, defina o caminho raiz como / e não especifique um caminho individual para o seu app. Por exemplo, para usar http://domain/, digite / como o caminho. Para http://domain/app1_path, insira /app1_path como o caminho.
    pathType
    O método de correspondência de caminho da URL. Os valores suportados são ImplementationSpecific, Exact ou Prefix. Para obter mais informações e exemplos de cada tipo de caminho, consulte a Documentação do Kubernetes da comunidade.
    name
    Substitua <app1_service> e <app2_service>, e assim por diante, pelo nome dos serviços que você criou para expor seus apps. Se os seus apps forem expostos por serviços em diferentes projetos no cluster, inclua somente os serviços de app que estão no mesmo projeto. Deve-se criar um recurso do Ingress para cada projeto no qual haja apps a serem expostos.
    port
    A porta na qual o serviço atende. Use a mesma porta que você definiu quando criou o serviço do Kubernetes para seu app.
  2. Crie o recurso de Ingresso para seu cluster. Assegure-se de que o recurso seja implementado no mesmo projeto que os serviços de app especificados no recurso.

    oc apply -f myingressresource.yaml -n <project>
    
  3. Verifique se o recurso de Ingresso foi criado com êxito. Se as mensagens nos eventos indicarem um erro na configuração do seu recurso, corrija os valores no arquivo de recursos e reaplique o arquivo ao recurso.

    oc describe ingress myingressresource
    

Seu recurso do Ingress é criado no mesmo projeto que seus serviços de app e seus apps são registrados com o controlador do Ingress.

Etapa 5: acessar seu app por meio da Internet

Em um navegador da web, insira a URL do serviço de app a ser acessado.

https://<domain>/<app1_path>

Se tiver exposto diversos apps, acesse-os mudando o caminho anexado à URL.

https://<domain>/<app2_path>

Se você usa um domínio curinga, acesse esses apps com os seus próprios subdomínios.

http://<subdomain1>.<domain>/<app1_path>
http://<subdomain2>.<domain>/<app1_path>

Não é possível conectar ao seu app por meio do Ingress? Tente Resolução de problemas do Ingress.

Expondo publicamente apps que estão fora de seu cluster

Exponha apps que estão fora de seu cluster para o público, incluindo-os no balanceamento de carga do Ingress público. As solicitações públicas recebidas no domínio customizado ou fornecido pela IBM são encaminhadas automaticamente para o app externo.

Antes de começar, certifique-se de que o aplicativo externo que você deseja incluir no balanceamento de carga do cluster possa ser acessado por meio de um endereço IP público.

Para disponibilizar ao público os aplicativos que estão fora do seu cluster, siga estas etapas.

  1. Defina um arquivo de configuração do serviço Kubernetes para o aplicativo que o controlador Ingress expõe. Esse serviço encaminha as solicitações recebidas para um terminal externo que você cria em etapas subsequentes.

    apiVersion: v1
    kind: Service
    metadata:
      name: myexternalservice
    spec:
      ports:
       - protocol: TCP
         port: <app_port>
    
  2. Crie o serviço em seu cluster.

    oc apply -f myexternalservice.yaml
    
  3. Defina um arquivo de configuração de terminal externo. Inclua todos os endereços IP públicos e portas que podem ser usados para acessar seu app externo. Observe que o nome do endpoint deve ser o mesmo que o nome do serviço que você criou na etapa anterior; por exemplo, myexternalservice.

    kind: Endpoints
    apiVersion: v1
    metadata:
      name: myexternalservice
    subsets:
      - addresses:
          - ip: <external_IP1>
          - ip: <external_IP2>
        ports:
          - port: <external_port>
    
    name
    Substitua <myexternalendpoint> pelo nome do serviço Kubernetes que você criou anteriormente.
    ip
    Substitua <external_IP> pelos endereços IP públicos para se conectar ao seu app externo.
    port
    Substitua <external_port> pela porta em que seu app externo atende.
  4. Crie o terminal em seu cluster.

    oc apply -f myexternalendpoint.yaml
    
  5. Continue com a segunda etapa em Publicar apps em clusters de VPC com um terminal em serviço de nuvem privada apenas ou Publicar apps em clusters com um terminal em serviço de nuvem pública.