Crie um cluster partilhado para executar cargas de trabalho de contentores

Este documento explica como criar um cluster do Kubernetes partilhado numa zona isolada do Google Distributed Cloud (GDC). Um cluster partilhado abrange vários projetos e inclui serviços geridos pelo GDC abrangentes que oferecem uma configuração de cluster do Kubernetes altamente opinativa e menos configurável do que o cluster padrão. Para mais informações sobre clusters padrão, consulte o artigo Configurações de clusters do Kubernetes.

Os clusters partilhados são um recurso zonal e não podem abranger várias zonas. Para operar clusters num universo de várias zonas, tem de criar manualmente clusters em cada zona.

Este documento destina-se a públicos-alvo como programadores de aplicações no grupo de operadores de aplicações, que são responsáveis pela gestão de cargas de trabalho de contentores na respetiva organização. Para mais informações, consulte o artigo Públicos-alvo para a documentação do GDC isolado.

Antes de começar

  • Para receber as autorizações de que precisa para criar um cluster partilhado, peça ao administrador de IAM da organização para lhe atribuir a função de administrador do cluster do utilizador (user-cluster-admin). Esta função não está associada a um espaço de nomes.

  • Para usar a API ou o Terraform para criar um cluster partilhado, gere o ficheiro kubeconfig do servidor da API zonal para alojar o cluster. Defina a variável de ambiente MANAGEMENT_API_SERVER para o caminho kubeconfig. Para mais informações, consulte o artigo Recursos do servidor da API de gestão zonal.

  • Reveja os limites de clusters para considerações sobre recursos.

Planeie o bloco CIDR de pods

Para atribuir o bloco CIDR de pods com o tamanho adequado para as suas cargas de trabalho, tem de calcular a quantidade de endereços IP necessários para o cluster do Kubernetes antes de o criar. Não é possível alterar a maioria dos parâmetros de rede após a criação do cluster.

Um cluster do Kubernetes segue a lógica seguinte ao atribuir endereços IP:

  • O Kubernetes atribui um bloco CIDR /24 composto por 256 endereços a cada um dos nós. Esta quantidade está em conformidade com o máximo predefinido de 110 pods por nó para clusters do Kubernetes.
  • O tamanho do bloco CIDR atribuído a um nó depende do valor de pods máximos por nó.
  • O bloco contém sempre, pelo menos, o dobro dos endereços do número máximo de pods por nó.

Consulte o exemplo seguinte para compreender como o valor predefinido de Tamanho da máscara por nó= /24 foi calculado para acomodar 110 pods:

Maximum pods per node = 110
Total number of IP addresses required = 2 * 110 = 220

Per node mask size = /24
Number of IP addresses in a /24 = 2(32 - 24) = 256

Determine a máscara CIDR de pods necessária para configurar o cluster do Kubernetes com base no número de nós necessários. Planeie futuras adições de nós ao cluster ao configurar o intervalo CIDR:

  Total number of nodes supported = 2(Per node mask size - pod CIDR mask)

Dado que existe um Tamanho da máscara por nó= /24 predefinido , consulte a seguinte tabela que mapeia a máscara CIDR de pods para o número de nós compatíveis.

Máscara CIDR de pods Cálculo: 2(Tamanho da máscara por nó - Máscara CIDR mask) Número máximo de nós compatíveis, incluindo nós do plano de controlo
/21 2(24 - 21) 8
/20 2(24-20) 16
/19 2(24 - 19) 32
/18 2(24 - 18) 64

Depois de calcular o bloco CIDR de pods para o cluster do Kubernetes, configure-o como parte do fluxo de trabalho de criação do cluster na secção seguinte.

Crie um cluster partilhado

Conclua os passos seguintes para criar um cluster do Kubernetes partilhado:

Consola

  1. No seletor de projetos, selecione a sua organização.

    Os clusters partilhados são recursos com âmbito da organização. Se selecionar um projeto, cria um cluster padrão, que tem âmbito do projeto. Para mais informações, consulte o artigo Hierarquia de recursos.

  2. No menu de navegação, selecione Kubernetes Engine > Clusters.

  3. Clique em Criar cluster.

  4. No campo Nome, especifique um nome para o cluster.

  5. Selecione a versão do Kubernetes para o cluster.

  6. Selecione a zona na qual quer criar o cluster.

  7. Clique em Anexar projeto e selecione um projeto existente para anexar ao cluster. Em seguida, clique em Guardar. Pode anexar ou desanexar projetos após a criação do cluster a partir da página de detalhes do projeto. Tem de ter um projeto anexado ao cluster antes de implementar cargas de trabalho de contentores no mesmo.

    Crie um cluster através da consola.

  8. Clique em Seguinte.

  9. Configure as definições de rede para o cluster. Não pode alterar estas definições de rede após a criação do cluster. O protocolo de Internet predefinido e compatível para clusters do Kubernetes é a versão 4 do protocolo de Internet (IPv4).

    1. Se quiser criar nós de balanceador de carga dedicados, introduza o número de nós a criar. Por predefinição, recebe zero nós e o tráfego do balanceador de carga é executado através dos nós de controlo.

    2. Selecione o CIDR de serviços (Classless Inter-Domain Routing) a usar. Os serviços implementados, como os balanceadores de carga, recebem endereços IP deste intervalo.

    3. Selecione o CIDR de pods a usar. O cluster atribui endereços IP deste intervalo aos seus pods e VMs.

    4. Clique em Seguinte.

  10. Reveja os detalhes do node pool predefinido gerado automaticamente para o cluster. Clique em Editar para modificar o node pool predefinido.

  11. Para criar node pools adicionais, selecione Adicionar node pool. Ao editar o node pool predefinido ou adicionar um novo node pool, pode personalizá-lo com as seguintes opções:

    1. Atribua um nome ao node pool. Não pode modificar o nome após a criação do node pool.
    2. Especifique o número de nós de trabalho a criar no node pool.
    3. Selecione a classe de máquina que melhor se adequa aos requisitos da sua carga de trabalho. Veja a lista das seguintes definições:

      • Tipo de máquina
      • CPU
      • Memória
    4. Clique em Guardar.

  12. Clique em Criar para criar o cluster.

A criação de um cluster partilhado pode demorar até 90 minutos a concluir.

API

  1. Crie o recurso personalizado Cluster:

    kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
    apiVersion: cluster.gdc.goog/v1
    kind: Cluster
    metadata:
      name: CLUSTER_NAME
      namespace: platform
    spec:
      clusterNetwork:
        podCIDRSize: POD_CIDR
        serviceCIDRSize: SERVICE_CIDR
      initialVersion:
        kubernetesVersion: KUBERNETES_VERSION
      nodePools:
      - machineTypeName: MACHINE_TYPE
        name: NODE_POOL_NAME
        nodeCount: NUMBER_OF_WORKER_NODES
        taints: TAINTS
        labels: LABELS
        acceleratorOptions:
          gpuPartitionScheme: GPU_PARTITION_SCHEME
      releaseChannel:
        channel: UNSPECIFIED
    EOF
    

    Substitua o seguinte:

    • MANAGEMENT_API_SERVER: o caminho kubeconfig do servidor da API zonal.
    • CLUSTER_NAME: o nome do cluster. O nome do cluster não pode terminar com -system. O sufixo -system está reservado para clusters criados pelo GDC.
    • POD_CIDR: o tamanho dos intervalos de rede a partir dos quais são atribuídos endereços IP virtuais de pods. Se não estiver definido, é usado um valor predefinido 21.
    • SERVICE_CIDR: o tamanho dos intervalos de rede a partir dos quais são atribuídos endereços IP virtuais de serviços. Se não estiver definido, é usado um valor predefinido 23.
    • KUBERNETES_VERSION: a versão do Kubernetes do cluster, como 1.26.5-gke.2100. Para ver uma lista das versões do Kubernetes disponíveis para configuração, consulte o artigo Veja uma lista das versões do Kubernetes disponíveis para um cluster.
    • MACHINE_TYPE: o tipo de máquina para os nós de trabalho do node pool. Veja os tipos de máquinas disponíveis para saber o que está disponível para configuração.
    • NODE_POOL_NAME: o nome do node pool.
    • NUMBER_OF_WORKER_NODES: o número de nós de trabalho a aprovisionar no node pool.
    • TAINTS: os taints a aplicar aos nós deste node pool. Este é um campo opcional.
    • LABELS: as etiquetas a aplicar aos nós deste node pool. Contém uma lista de pares de chave-valor. Este é um campo opcional.
    • GPU_PARTITION_SCHEME: o esquema de partição da GPU, se estiver a executar cargas de trabalho de GPU. Este é um campo opcional. Por exemplo, mixed-2. A GPU não é dividida se este campo não estiver definido. Para mais informações sobre os perfis de GPU multi-instância (MIG) disponíveis, consulte o artigo Perfis de MIG compatíveis.

    A criação de um cluster partilhado pode demorar até 90 minutos a concluir.

  2. Crie o recurso personalizado ProjectBinding:

    kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
    apiVersion: resourcemanager.gdc.goog/v1
    kind: ProjectBinding
    metadata:
      name: CLUSTER_NAME-PROJECT_NAME
      namespace: platform
      labels:
        resourcemanager.gdc.goog/projectbinding-for-user-project: "true"
    spec:
      clusterRef:
        name: CLUSTER_NAME
      selector:
        nameSelector:
          matchNames:
          - PROJECT_NAME
    EOF
    

    Substitua o seguinte:

    • MANAGEMENT_API_SERVER: o caminho kubeconfig do servidor da API zonal.
    • CLUSTER_NAME: o nome do cluster.
    • PROJECT_NAME: o nome do projeto a associar. Cada recurso ProjectBinding só pode ser mapeado para um cluster. Se um projeto precisar de acesso a vários clusters, tem de ser criado um ProjectBinding exclusivo para cada cluster.

    Tem de anexar um projeto ao cluster antes de um programador poder implementar cargas de trabalho de contentores no cluster.

Terraform

  1. Num ficheiro de configuração do Terraform, insira o seguinte fragmento de código para criar o recurso personalizado Cluster:

    provider "kubernetes" {
      config_path = "MANAGEMENT_API_SERVER"
    }
    
    resource "kubernetes_manifest" "CLUSTER_RESOURCE_NAME" {
      manifest = {
        "apiVersion" = "cluster.gdc.goog/v1"
        "kind" = "Cluster"
        "metadata" = {
          "name" = "CLUSTER_NAME"
          "namespace" = "platform"
        }
        "spec" = {
          "clusterNetwork" = {
            "podCIDRSize" = "POD_CIDR"
            "serviceCIDRSize" = "SERVICE_CIDR"
          }
          "initialVersion" = {
            "kubernetesVersion" = "KUBERNETES_VERSION"
          }
          "nodePools" = [{
            "machineTypeName" = "MACHINE_TYPE"
            "name" = "NODE_POOL_NAME"
            "nodeCount" = "NUMBER_OF_WORKER_NODES"
            "taints" = "TAINTS"
            "labels" = "LABELS"
            "acceleratorOptions" = {
              "gpuPartitionScheme" = "GPU_PARTITION_SCHEME"
            }
          }]
          "releaseChannel" = {
            "channel" = "UNSPECIFIED"
          }
        }
      }
    }
    

    Substitua o seguinte:

    • MANAGEMENT_API_SERVER: o caminho kubeconfig do servidor da API zonal.
    • CLUSTER_RESOURCE_NAME: o nome do recurso Terraform exclusivo do cluster, como cluster-1. Este nome é usado pelo Terraform para identificar o cluster e não é usado pelo GDC.
    • CLUSTER_NAME: o nome do cluster. O nome do cluster não pode terminar com -system. O sufixo -system está reservado para clusters criados pelo GDC.
    • POD_CIDR: o tamanho dos intervalos de rede a partir dos quais são atribuídos endereços IP virtuais de pods. Se não estiver definido, é usado um valor predefinido 21.
    • SERVICE_CIDR: o tamanho dos intervalos de rede a partir dos quais são atribuídos endereços IP virtuais de serviços. Se não estiver definido, é usado um valor predefinido 23.
    • KUBERNETES_VERSION: a versão do Kubernetes do cluster, como 1.26.5-gke.2100. Para ver uma lista das versões do Kubernetes disponíveis para configuração, consulte o artigo Veja uma lista das versões do Kubernetes disponíveis para um cluster.
    • MACHINE_TYPE: o tipo de máquina para os nós de trabalho do node pool. Veja os tipos de máquinas disponíveis para saber o que está disponível para configuração.
    • NODE_POOL_NAME: o nome do node pool.
    • NUMBER_OF_WORKER_NODES: o número de nós de trabalho a aprovisionar no node pool.
    • TAINTS: os taints a aplicar aos nós deste node pool. Este é um campo opcional.
    • LABELS: as etiquetas a aplicar aos nós deste node pool. Contém uma lista de pares de chave-valor. Este é um campo opcional.
    • GPU_PARTITION_SCHEME: o esquema de partição da GPU, se estiver a executar cargas de trabalho de GPU. Este é um campo opcional. Por exemplo, mixed-2. A GPU não é dividida se este campo não estiver definido. Para mais informações sobre os perfis de GPU multi-instância (MIG) disponíveis, consulte o artigo Perfis de MIG compatíveis.
  2. Num ficheiro de configuração do Terraform, insira o seguinte fragmento de código para criar o recurso personalizado ProjectBinding:

    provider "kubernetes" {
      config_path = "MANAGEMENT_API_SERVER"
    }
    
    resource "kubernetes_manifest" "PROJECT_BINDING_RESOURCE_NAME" {
      manifest = {
        "apiVersion" = "resourcemanager.gdc.goog/v1"
        "kind" = "ProjectBinding"
        "metadata" = {
          "name" = "CLUSTER_NAME-PROJECT_NAME"
          "namespace" = "platform"
          "labels" = {
            "resourcemanager.gdc.goog/projectbinding-for-user-project" = "true"
          }
        }
        "spec" = {
          "clusterRef" = {
            "name" = "CLUSTER_NAME"
          }
          "selector" = {
            "nameSelector" = {
              "matchNames" = [
                "PROJECT_NAME",
              ]
            }
          }
        }
      }
    }
    

    Substitua o seguinte:

    • MANAGEMENT_API_SERVER: o caminho kubeconfig do servidor da API zonal.
    • PROJECT_BINDING_RESOURCE_NAME: o nome do recurso Terraform da associação de projetos, como project-binding-1. Este nome é usado pelo Terraform para identificar a associação de projetos e não é usado pelo GDC.
    • CLUSTER_NAME: o nome do cluster.
    • PROJECT_NAME: o nome do projeto a associar. Cada recurso ProjectBinding só pode ser mapeado para um cluster. Se um projeto precisar de acesso a vários clusters, tem de ser criado um ProjectBinding exclusivo para cada cluster.

    Tem de anexar um projeto ao cluster antes de um programador poder implementar cargas de trabalho de contentores no cluster.

  3. Aplique os novos recursos personalizados com o Terraform:

    terraform apply
    

A criação de um cluster partilhado pode demorar até 90 minutos a concluir.

O que se segue?