Multilocação de cluster

Nesta página, você verá uma explicação sobre a multilocação de cluster no Google Kubernetes Engine. Esse conceito inclui tanto clusters compartilhados por usuários diferentes em uma única organização quanto clusters compartilhados por instâncias por cliente de um aplicativo de Software as a Service (SaaS). A multilocação de cluster é uma alternativa ao gerenciamento de muitos clusters com um único locatário.

Você também encontrará nesta página um resumo dos recursos do Kubernetes e do GKE que podem ser usados para gerenciar clusters multilocatários.

O que é multilocação?

Um cluster multilocatário é compartilhado por vários usuários e/ou cargas de trabalho, chamados de “locatários”. Os operadores desse tipo de cluster precisam isolar os locatários uns dos outros para minimizar o dano que um locatário comprometido ou mal-intencionado pode causar ao cluster e aos outros locatários. Além disso, é necessário alocar os recursos do cluster de maneira justa entre os locatários.

Ao planejar uma arquitetura multilocatária, pense nas camadas de isolamento de recursos no Kubernetes: cluster, namespace, nó, pod e contêiner. Pense também nas implicações na segurança que resultarão do compartilhamento de tipos diferentes de recursos entre os locatários. Por exemplo, programar pods de locatários diferentes no mesmo nó pode reduzir o número de máquinas necessárias no cluster. Por outro lado, talvez seja necessário impedir que determinadas cargas de trabalho sejam colocalizadas. Por exemplo, é possível proibir que códigos não confiáveis provenientes de fora da organização sejam executados no mesmo nó dos contêineres que processam informações confidenciais.

O Kubernetes não garante um isolamento perfeitamente seguro entre os locatários, mas oferece recursos que podem ser suficientes para casos de uso específicos. É possível separar cada locatário e respectivos recursos do Kubernetes nos próprios namespaces deles. Depois, use as políticas para impor o isolamento entre locatários. Geralmente, essas políticas têm o escopo definido por namespace e podem ser usadas para restringir o acesso a APIs, limitar o uso de recursos e determinar o que os contêineres podem fazer.

Os locatários de um cluster desse tipo compartilham:

A operação de um cluster multilocatário apresenta várias vantagens em comparação com a operação de vários clusters com um único locatário:

  • Redução nos esforços de gerenciamento
  • Redução na fragmentação de recursos.
  • Eliminação da necessidade de esperar pela criação de um cluster para cada locatário novo

Casos de uso de multilocação

Nesta seção, você descobrirá como configurar um cluster para vários casos de uso de multilocação.

Multilocação empresarial

Em um ambiente empresarial, os locatários de um cluster são equipes distintas dentro da organização. Normalmente, cada locatário tem um namespace correspondente. Modelos alternativos de multilocação com um locatário por cluster ou por projeto do GCP são mais difíceis de gerenciar. O tráfego de rede dentro de um namespace é irrestrito. É necessário que o tráfego de rede entre namespaces seja explicitamente colocado na lista de permissões. É possível aplicar essas políticas usando a política de rede do Kubernetes.

Os usuários do cluster são divididos em três papéis diferentes, dependendo do privilégio de cada um:

Administrador do cluster
Esse papel cabe aos administradores do cluster inteiro, que gerenciam todos os locatários. Os administradores do cluster podem criar, ler, atualizar e excluir qualquer objeto de política. Eles podem criar namespaces e atribuí-los a administradores de namespace.
Administrador de namespace
Esse papel é atribuído aos administradores de locatários únicos e específicos. Um administrador de namespace pode gerenciar os usuários incluídos em seu próprio namespace.
Desenvolvedor
Os membros com esse papel podem criar, ler, atualizar e excluir objetos em namespace e não relacionados a política, como podspods, jobs, e entradas. Os desenvolvedores têm esses privilégios apenas nos namespaces a que eles têm acesso.

Multilocação de provedor de SaaS

Os locatários de um cluster de provedor de SaaS são as instâncias por cliente do aplicativo e o plano de controle do SaaS. Para aproveitar as políticas com escopo por namespace, é necessário que as instâncias do aplicativo sejam organizadas nos próprios namespaces delas, assim como os componentes do plano de controle do SaaS. Os usuários finais não podem interagir diretamente com o plano de controle do Kubernetes. Em vez disso, eles usam a interface do SaaS que, por sua vez, interage com o plano de controle do Kubernetes.

Por exemplo, uma plataforma de blog pode ser executada em um cluster multilocatário. Nesse caso, os locatários são as instâncias de blog de cada cliente e o próprio plano de controle da plataforma. O plano de controle da plataforma e cada blog hospedado são executados em namespaces separados. Os clientes criam e excluem blogs e atualizam as versões do software por meio da interface da plataforma, sem visibilidade de como o cluster opera.

Aplicação de políticas de multilocação

O GKE e o Kubernetes fornecem vários recursos que podem ser usados para gerenciar clusters multilocatários. Leia nas seções a seguir uma visão geral desses recursos.

Controle de acesso

O GKE tem dois sistemas de controle de acesso: Cloud Identity & Access Management (Cloud IAM) e controle de acesso baseado em papéis (RBAC, na sigla em inglês). O Cloud IAM é o sistema de controle de acesso do GCP para o gerenciamento de autenticação e autorização de recursos da plataforma. Use o Cloud IAM para conceder aos usuários acesso a recursos do GKE e do Kubernetes. O RBAC vem incorporado ao Kubernetes e concede permissões granulares para operações e recursos específicos dentro dos clusters.

Consulte a Visão geral do controle de acesso para mais informações sobre essas opções e quando usar cada uma delas.

Consulte o Guia de instruções do RBAC e o Guia de instruções do Cloud IAM para saber como usar esses sistemas de controle de acesso.

Políticas de rede

As políticas de rede do cluster dão a você o controle sobre a comunicação entre os pods do cluster. Elas especificam com quais namespaces, rótulos e intervalos de endereços IP um pod pode se comunicar.

Consulte o guia de instruções das políticas de rede para saber como ativar a aplicação no GKE.

Siga o tutorial das políticas de rede para aprender como gravá-las.

Cotas de recursos

As cotas de recursos gerenciam a quantidade de recursos usada pelos objetos em um namespace. É possível defini-las em termos de uso de CPU e memória ou de contagens de objetos. Com as cotas de recursos, é possível garantir que nenhum locatário use mais recursos do cluster do que a parcela atribuída a ele.

Consulte a documentação sobre cotas de recursos para mais informações.

Políticas de segurança de pods

A PodSecurityPolicies é um tipo de API Kubernetes que valida solicitações para criar e atualizar pods. PodSecurityPolicies define valores e requisitos padrão para os campos com risco à segurança da especificação do Pod. É possível criar políticas que restringem a implantação de pods que acessam o sistema de arquivos do host, redes, namespaces PID, volumes e muito mais.

Consulte as instruções de PodSecurityPolicies para mais informações.

Antiafinidade de pods

É possível usar a antiafinidade de pods para impedir que pods de locatários diferentes sejam programados no mesmo nó. As restrições antiafinidade são baseadas nos rótulos dos pods. Por exemplo, a especificação de pod abaixo descreve um pod com o rótulo "team": "billing" e uma regra antiafinidade que impede que o pod seja programado com pods sem o rótulo.

apiVersion: v1
kind: Pod
metadata:
  name: bar
  labels:
    team: "billing"
spec:
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - topologyKey: "kubernetes.io/hostname"
        labelSelector:
          matchExpressions:
          - key: "team"
            operator: NotIn
            values: ["billing"]

A desvantagem dessa técnica é que usuários mal-intencionados podem burlar a regra aplicando o rótulo team: billing para um pod arbitrário. Por si só, o uso de antiafinidade de pods não garante que a política seja aplicada com segurança em clusters com locatários não confiáveis.

Consulte a documentação sobre antiafinidade de pods para mais informações.

Nós dedicados com taints e tolerâncias

Os taints de nó são outra maneira de controlar a programação de cargas de trabalho. É possível usá-los para reservar nós especializados a serem usados por determinados locatários. Por exemplo, é possível dedicar nós equipados com GPU a locatários específicos com cargas de trabalho que exigem GPUs.

Para dedicar um pool de nós a um determinado locatário, aplique um taint com effect: "NoSchedule" ao pool de nós. Assim, apenas os pods com tolerância correspondente poderão ser programados para os nós no pool.

A desvantagem dessa técnica é que usuários mal-intencionados podem adicionar uma tolerância aos pode deles para ter acesso ao pool de nós dedicado. Por si só, o uso de tolerâncias e taints de nós não garante que a política seja aplicada com segurança em clusters com locatários não confiáveis.

Consulte a página de instruções dos taints de nós para aprender como controlar a programação com eles.

A seguir

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Documentação do Kubernetes Engine