Compreenda o recurso personalizado ClusterCIDRConfig

Vista geral

O ClusterCIDRConfig é um recurso de alocador CIDR personalizado que lhe permite alocar dinamicamente mais intervalos de endereços IP para pods.

A gestão de endereços IP (IPAM) permite a utilização eficiente de sub-redes IP e evita sobreposições nos intervalos de endereços, o que impede conflitos e interrupções de rede. O Kubernetes atribui CIDRs de pods por nó, que são usados como endereços IP para os pods em execução nesse nó.

O Kubernetes NodeIPAM atual tem as seguintes limitações:

  • Todos os CIDRs de agrupamentos são atribuídos a partir de um CIDR de cluster. Tem de especificar o intervalo de endereços IP completo, tendo em conta o cluster maior no momento da criação do cluster. Esta limitação pode desperdiçar endereços IP.

  • Se aumentar o tamanho do cluster, é difícil adicionar mais endereços IP.

  • O CIDR do cluster é um intervalo grande. Pode ser difícil encontrar um bloco contíguo de endereços IP que satisfaça as necessidades do cluster.

  • Cada nó recebe um intervalo de IP de tamanho fixo num cluster. Se os nós tiverem tamanhos e capacidade diferentes, não pode atribuir um intervalo de pods maior a um determinado nó com maior capacidade e um intervalo menor a nós com menor capacidade. Isto desperdiça muitos endereços IP. Para um cluster grande com muitos nós, este desperdício é agravado em todos os nós do cluster.

Com a funcionalidade ClusterCIDRConfig, pode evitar atribuir um bloco CIDR grande a um cluster, mapear o tamanho do cluster para a escala dos seus pods e, por conseguinte, preservar os endereços IP. Pode guardar endereços IP usando ClusterCIDRConfigs com diferentes combinações do CIDR e perNodeMaskSize. O recurso ClusterCIDRConfig suporta o seguinte:

  • Vários blocos CIDR de IP não contíguos para o CIDR do cluster a um nível mais detalhado

  • Afinidade de nós de blocos CIDR

  • Tamanhos de blocos diferentes atribuídos a nós

O Google Distributed Cloud usa a funcionalidade ClusterCIDRConfig nas seguintes funcionalidades:

Cluster.spec.clusterNetwork.pods.cidrBlocks é um campo opcional e não está definido por predefinição. Tem de a definir se alguma das funcionalidades da lista anterior não a tiver definida. Por exemplo, é necessário quando os clusters são criados no modo de ilha IPv4 e tem de ser especificado, uma vez que é usado como um CIDR de encaminhamento nativo.

A tabela seguinte indica a utilização do comportamento do campo Cluster.spec.clusterNetwork.pods.cidrBlocks de ClusterCIDRConfig para diferentes modos de rede.

Modo de rede Valor ClusterCIDRConfig
Ilha IPv4 (predefinição) (Campo obrigatório) Especifique Cluster.spec.clusterNetwork.pods.cidrBlocks.
IPv4 Flat (predefinição) Cluster.spec.clusterNetwork.pods.cidrBlocks são completamente ignorados e podem ser ignorados. Os utilizadores têm de definir explicitamente ClusterCIDRConfigs (por nó, por conjunto de nós e/ou por cluster).
Pilha dupla (IPv4 Island, IPv4 Flat)

Especifique o CIDR IPv4.

Não especifique o CIDR IPv6 em Cluster.spec.clusterNetwork.pods.cidrBlocks.

Especifique ClusterCIDRConfigs com CIDRs IPv4 e IPv6. O CIDR IPv4 configurado em todos os ClusterCIDRConfigs tem de ser igual ao CIDR IPv4 de Cluster.spec.clusterNetwork.pods.cidrBlocks, incluindo o valor PerNodeMask para IPv4. Para mais informações sobre ClusterCIDRConfig e exemplos da sua utilização, consulte Exemplos: pilha dupla (ilha IPv4, IPv6 plana)

Pilha dupla (IPv4 simples, IPv6 simples) Pode ignorar Cluster.spec.clusterNetwork.pods.cidrBlocks, uma vez que são completamente ignorados. Tem de definir explicitamente ClusterCIDRConfigs (por nó, por conjunto de nós e/ou por cluster) com CIDRs IPv4 e IPv6.

Configurar o recurso de alocador de CIDR personalizado ClusterCIDRConfig

ClusterCIDRConfig

Quando configurar o recurso de alocador de CIDR personalizado ClusterCIDRConfig, tenha em atenção os seguintes pontos:

  • A atribuição de CIDR de pods de um ClusterCIDRConfig específico a um nó baseia-se em seletores de etiquetas. Isto é semelhante ao mecanismo nodeSelector usado para agendar pods num nó.

  • Tem de configurar o ClusterCIDRConfig durante o processo de criação do cluster no ficheiro YAML de configuração do cluster. Depois de especificar ClusterCIDRConfigs, não pode modificar os valores posteriormente.

  • Pode especificar várias ClusterCIDRConfigs com CIDRs sobrepostos.

  • Se não for encontrado nenhum ClusterCIDRConfig correspondente para um nó, o nó permanece num estado NotReady até ser criado um ClusterCIDRConfig com etiquetas correspondentes.

  • Se o ClusterCIDRConfig com a melhor correspondência não tiver mais CIDRs disponíveis para atribuição, é escolhido o CIDR seguinte com a melhor correspondência e os CIDRs de pods são atribuídos a partir dos CIDRs disponíveis.

  • No caso de um modelo de pilha dupla, se quiser atribuir CIDRs de pods de pilha dupla aos nós, faça o seguinte:

    • Configure os CIDRs IPv4 e IPv6 no ClusterCIDRConfig.

    • Certifique-se de que todos os ClusterCIDRConfig têm CIDRs DualStack, se estiverem configurados vários ClusterCIDRConfig.

    • Certifique-se de que os CIDRs IPv4 e IPv6 configurados têm um número igual de endereços IP atribuíveis por nó.

    Por exemplo, 32 - spec.IPv4.PerNodeMaskSize == 128 - spec.IPv6.PerNodeMaskSize

    spec.IPv4.PerNodeMaskSize = 24

    spec.IPv6.PerNodeMaskSize = 120

    Assim, 32 - 24 == 128 - 120, uma vez que a diferença é 8.

  • Várias ClusterCIDRConfigs podem corresponder às etiquetas do nodeSelector às etiquetas dos nós.

Regras de atribuição ClusterCIDRConfig

Para determinar que ClusterCIDRConfig é usado para atribuir CIDRs de pods ao nó atual, use as seguintes regras de desempate. Implemente estas regras na ordem indicada. Implemente a regra seguinte apenas se o empate não for desfeito pela regra anterior.

  1. Escolha o ClusterCIDRConfig cujo NodeSelector corresponda ao maior número de etiquetas no nó. Por exemplo, {'node.kubernetes.io/instance-type':'medium', 'rack': 'rack1'} (Match Count: 2) é escolhido antes de {'node.kubernetes.io/instance-type': 'medium'}. (Match Count: 1).

  2. Escolha o ClusterCIDRConfig com o menor número de CIDRs de pods atribuíveis. Por exemplo, {CIDR: "10.0.0.0/16", PerNodeMaskSize: "16"} (1 possible Pod CIDR) é escolhido antes de {CIDR: "192.168.0.0/20", PerNodeMaskSize: "22"} (4 possible Pod CIDRs).

  3. Escolha o ClusterCIDRConfig cujo PerNodeMaskSize tenha o menor número de endereços IP. Por exemplo, 27 (2^(32-27)= 32 endereços IP) escolhidos antes de 25 (2^(32-25)=128 endereços IP).

  4. Escolha o ClusterCIDRConfig cuja etiqueta NodeSelector correspondente tenha um valor alfanumérico inferior. Por exemplo, {'kubernetes.io/hostname': 'node-1'} é escolhido em detrimento de {'node.kubernetes.io/instance-type':'medium'}.

  5. Escolha o ClusterCIDRConfig cujo IP CIDR tenha um valor inferior. Independentemente de a configuração ser uma configuração IPv4 ou uma configuração DualStack, apenas os CIDRs IPv4 são comparados. Por exemplo, {CIDR: "10.0.0.0/16"} is picked over {CIDR: "192.168.0.0/16"}.

Exemplos de configuração

Esta secção apresenta exemplos de configuração para Cluster e ClusterCIDRConfig para todos os modos de rede.