Aprendendo sobre a arquitetura e o isolamento de carga de trabalho do Code Engine

O IBM Cloud® Code Engine é a plataforma abrangente da IBM Cloud que unifica as imagens de contêiner, os apps de 12 fatores, as funções e as tarefas em lote. Ele é um sistema de diversos locatários que consiste em três grandes blocos de construção: um plano de controle, um (conjunto de) shard (ou shards) e uma camada de roteamento. O plano de controle e os shards são realizados como clusters Kubernetes multizona separados. O diagrama a seguir dá uma visão geral gráfica da arquitetura.

Code Engine diagrama de arquitetura diagrama de arquitetura diagrama de arquitetura
Code Engine

O Code Engine é baseado em clusters do IBM Cloud Kubernetes Service e depende dos componentes e do isolamento de carga de trabalho do IBM Cloud Kubernetes Service. Para obter mais informações, consulte arquitetura de cluster da VPC do IBM Cloud Kubernetes Service.

Todos os componentes são gerenciados e pertencentes à IBM e executados na conta da IBM Cloud. Cada cluster está em execução em sua própria VPC e separado de outros clusters.

O plano de controle do Code Engine executa os componentes que são compartilhados entre todos os usuários do Code Engine e tornam o cluster Kubernetes um verdadeiro sistema de diversos locatários. O plano de controle consiste em quatro microsserviços que são implementados nele.

Code Engine microsserviços de plano de controle
Componente Propósito
Broker de recurso Cria e exclui recursos do projeto do Code Engine no controlador de recurso da IBM Cloud e solicita o posicionamento do projeto em um shard.
Controlador de posicionamento de projeto Seleciona um shard e solicita a criação, a exclusão e o isolamento do projeto no shard.
Servidor de API Fornece as informações de destino (arquivo KUBECONFIG) para o projeto selecionado. Ele também executa verificações de política de acesso do IAM e grava registros de auditoria.
Kube API proxy Executa proxy de cada solicitação de API para o cluster de shard adequado, executa verificações de política do IAM e grava registros de auditoria.

Os shards estão executando a carga de trabalho do cliente, como construções, tarefas em lote ou apps. Portanto, o cluster de shard executa os microsserviços a seguir para controlar as cargas de trabalho do cliente.

Microsserviços de cluster de fragmentos
Componente Propósito
Controlador de isolamento do projeto Gerencia e isola o namespace do Kubernetes correspondente ao recurso do projeto do Code Engine. Ele monitora e assegura os aspectos de isolamento, como o controle de acesso baseado na função (RBAC), as políticas de segurança de pod e a cota de recurso. Além disso, as políticas de rede são aplicadas.
Controlador de certificados e domínio do projeto Gerencia o domínio e os certificados para o terminal de rota do projeto. O terminal consiste em uma entrada do DNS e um certificado curinga.
Knative e Istio Gerencie o ciclo de vida dos aplicativos. O Knative é responsável pelo ajuste de escala do aplicativo. O Istio é responsável por rotear o tráfego para a revisão e o contêiner adequados do aplicativo.
Controlador de lote Gerencia o ciclo de vida e os contêineres para tarefas e execuções de tarefa.
Controlador de compilação Gerencia o ciclo de vida e os contêineres para construções e execuções de compilação.
Ligação de serviços e operador da IBM Cloud Gerencie o ciclo de vida de segredos que estão associados a ligações de serviços da IBM Cloud para aplicativos e tarefas.
Controlador de origem de eventos do IBM Cloud Object Storage Gerencie o ciclo de vida de inscrições de evento por meio do serviço do IBM Cloud Object Storage.
Escalador automático do nó do cluster Escala o shard incluindo e removendo nós do trabalhador com base na demanda de capacidade.
IBM Cloud Monitoring Envia métricas de serviço para o IBM Cloud Monitoring. Para obter mais informações sobre essas métricas, consulte Monitoramento para o Code Engine.
IBM® Cloud Logs Encaminhe logs e métricas de plataforma para o IBM Cloud Logs. Para obter mais informações, consulte Eventos de auditoria para o Code Engine.

Isolamento de carga de trabalho do Code Engine

O Code Engine é um serviço regional multilocatário em que os locatários compartilham a mesma rede e infraestrutura de computação. Em particular, a infraestrutura de rede e de computação são recursos compartilhados e alguns componentes de gerenciamento são comuns a todos os locatários. O Code Engine implementa os controles a seguir para separar locatários:

  • Os recursos do projeto Code Engine são separados dentro de um ambiente Kubernetes protegido que está sendo executado em uma região com várias zonas IBM Cloud.
  • Os projetos do Code Engine e os seus recursos de conteúdo, como aplicativos, construções e tarefas que são executados em clusters compartilhados que usam componentes de gerenciamento compartilhados.
  • Para separar o acesso aos recursos do projeto, o Code Engine executa vários níveis de verificações de autenticação e autorização dentro dos componentes apiserver e kube-api-proxy (ver tabela anterior),
    • As verificações de políticas de autenticação e de acesso do IAM são executadas em um nível de projeto.
    • Para gerenciar o acesso de diversos locatários à API de Kubernetes subjacente, o acesso direto ao servidor de API não é permitido. Em vez disso, use a API Kube-api-proxy customizada do Code Engine para acessar.
    • As verificações de controle de acesso baseadas em função são executadas em um nível de recursos para permitir que somente usuários autorizados executem determinadas operações em recursos do projeto.
  • A autorização é controlada pelo cliente, designando funções de manager, reader ou writer para usuários para um recurso do projeto do Code Engine dentro do IAM.
  • Para restringir a carga de trabalho do cliente, o Code Engine reforça os conceitos a seguir,
    • Isolamento de contêiner por meio de várias técnicas de isolamento do Linux. Essas técnicas garantem várias camadas de segurança para evitar a escalada de privilégio de contêineres e para restringir os contêineres a usarem um conjunto limitado de privilégios no sistema.
    • Cota de recurso e LimitRange para evitar o consumo excessivo de recurso.
    • Políticas de rede para controlar os fluxos de rede dentro do ambiente.
  • Os componentes de diversos locatários compartilhados são assegurados, por exemplo, desativando a consulta reversa em KubeDNS.
  • Para limitar o raio de explosão, cada cluster de shard está em execução em sua própria VPC, que é isolada de outras VPCs de shard.
  • A proteção DDOS é ativada automaticamente para todos os terminais, incluindo aplicativos de cliente, por meio do Cloud Internet Services (CIS) sem nenhum custo adicional. DDoS a proteção abrange ataques ao protocolo de Camada 3 e Camada 4 (TCP/IP) da Interconexão de Sistemas (OSI), mas não ataques à Camada 7 ( HTTP ). Consulte DDoS protection.
  • Se você precisar de regras de firewall de aplicativo da Web (WAF), configure sua própria instância IBM Cloud Internet Services ( CIS ) ou um serviço de gateway de terceiros com um domínio personalizado na frente dos pontos de extremidade Code Engine e ative um firewall de aplicativo da Web nessa instância.