Comprende el recurso personalizado ClusterCIDRConfig

Descripción general

ClusterCIDRConfig es un recurso asignador CIDR personalizado que te permite asignar más rangos de direcciones IP para Pods de forma dinámica.

La administración de direcciones IP (IPAM) permite un uso eficiente de las subredes de IP y evita tener superposiciones en los rangos de direcciones, lo que evita interrupciones y conflictos de red. Kubernetes asigna CIDR de Pod por nodo, que se usan como direcciones IP para los Pods que se ejecutan en ese nodo.

El NodeIPAM de Kubernetes actual tiene las siguientes limitaciones:

  • Todos los CIDR del Pod se asignan desde un CIDR del clúster. Debes especificar todo el rango de direcciones IP que representa el clúster más grande cuando se crea el clúster. Esta limitación puede desperdiciar direcciones IP.

  • Si aumentas el tamaño del clúster, es difícil agregar más direcciones IP.

  • El CIDR del clúster es un rango grande. Puede ser difícil encontrar un bloque contiguo de direcciones IP que satisfagan las necesidades del clúster.

  • Cada nodo obtiene un rango de IP de tamaño fijo dentro de un clúster. Si los nodos son de diferentes tamaños y capacidades, no puedes asignar un rango de Pods más grande a un nodo determinado con mayor capacidad y un rango más pequeño a nodos con menor capacidad. Esto desperdicia una gran cantidad de direcciones IP. En el caso de un clúster grande con muchos nodos, este desperdicio se acumula en todos los nodos del clúster.

Con la funcionalidad ClusterCIDRConfig, puedes evitar asignar un bloque CIDR grande a un clúster, asignar el tamaño del clúster a la escala de los Pods y, por lo tanto, conservar las direcciones IP. Puedes guardar direcciones IP mediante ClusterCIDRConfigs con diferentes combinaciones de CIDR y perNodeMaskSize. El recurso ClusterCIDRConfig admite lo siguiente:

  • Varios bloques de CIDR de IP discontinuos para el CIDR del clúster a un nivel más detallado

  • Afinidad de nodos de los bloques CIDR

  • Diferentes tamaños de bloque asignados a los nodos

Google Distributed Cloud utiliza la funcionalidad ClusterCIDRConfig en las siguientes características:

Cluster.spec.clusterNetwork.pods.cidrBlocks es un campo opcional y no se define de forma predeterminada. Debes definirla si alguna de las funciones de la lista anterior no la tiene definida. Por ejemplo, es necesario cuando los clústeres se crean en modo de isla IPv4 y debe especificarse ya que se usa como un CIDR de enrutamiento nativo.

En la siguiente tabla, se muestra cómo usar el comportamiento del campo Cluster.spec.clusterNetwork.pods.cidrBlocks de ClusterCIDRConfig para diferentes modos de red.

Modo de red Valor de ClusterCIDRConfig
Isla IPv4 (predeterminada) (Campo obligatorio) Especifica Cluster.spec.clusterNetwork.pods.cidrBlocks.
IPv4 plano (predeterminado) Cluster.spec.clusterNetwork.pods.cidrBlocks se ignoran por completo y se pueden omitir. Los usuarios deben definir ClusterCIDRConfigs de forma explícita (por nodo, por grupo de nodos o por clúster).
Pila doble (isla IPv4, IPv4 plano)

Especifica el CIDR de IPv4.

No especifiques el CIDR de IPv6 en Cluster.spec.clusterNetwork.pods.cidrBlocks.

Especifica ClusterCIDRConfigs con CIDR de IPv4 y de IPv6. El CIDR de IPv4 configurado en todos los ClusterCIDRConfigs debe ser el mismo que el CIDR de IPv4 de Cluster.spec.clusterNetwork.pods.cidrBlocks, incluido el valor PerNodeMask de IPv4. Para obtener más información sobre ClusterCIDRConfig y ejemplos sobre su uso, consulta Ejemplos: Dualstack (isla IPv4, IPv6 plano).

Pila doble (IPv4 plano, IPv6 plana) Puedes omitir Cluster.spec.clusterNetwork.pods.cidrBlocks, ya que se ignoran por completo. Debes definir ClusterCIDRConfigs de forma explícita (por nodo, por grupo de nodos o por clúster) con CIDR de IPv4 e IPv6.

Configura el recurso asignador de CIDR personalizado ClusterCIDRConfig

ClusterCIDRConfig

Cuando configures el recurso asignador CIDR personalizado de ClusterCIDRConfig, ten en cuenta los siguientes puntos:

  • La asignación de CIDR de Pod de un ClusterCIDRConfig en particular a un nodo se basa en selectores de etiquetas. Esto es similar al mecanismo nodeSelector que se usa para programar Pods en un nodo.

  • Debes configurar ClusterCIDRConfig durante el proceso de creación del clúster en el archivo YAML de configuración del clúster. Una vez que especifiques ClusterCIDRConfigs, no podrás modificar los valores más adelante.

  • Puedes especificar varios ClusterCIDRConfigs con CIDR superpuestos.

  • Si no se encuentra ningún ClusterCIDRConfig que coincida para un nodo, este permanece en un estado NotReady hasta que se cree un ClusterCIDRConfig con etiquetas coincidentes.

  • Si el ClusterCIDRConfig que mejor coincide no tiene más CIDR disponibles para la asignación, se elige el siguiente mejor CIDR y los CIDR del Pod se asignan desde los CIDR disponibles.

  • En el caso del modelo de pila doble, si deseas asignar CIDR de Pods de pila doble a los nodos, haz lo siguiente:

    • Configura CIDR de IPv4 y de IPv6 en ClusterCIDRConfig.

    • Asegúrate de que todos los ClusterCIDRConfig tengan CIDR de DualStack, si hay varios ClusterCIDRConfig configurados.

    • Asegúrate de que los CIDR IPv4 e IPv6 configurados tengan la misma cantidad de direcciones IP asignables por nodo.

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

    spec.IPv4.PerNodeMaskSize = 24

    spec.IPv6.PerNodeMaskSize = 120

    Por lo tanto, 32 - 24 == 128 - 120, ya que la diferencia es 8.

  • Varios ClusterCIDRConfigs pueden hacer coincidir las etiquetas del nodeSelector con las del nodo.

Reglas de asignación de ClusterCIDRConfig

A fin de determinar qué ClusterCIDRConfig se usa para asignar CIDR de Pod al nodo actual, usa las siguientes reglas de tie-break. Implementa estas reglas en el orden determinado. Implementa la siguiente regla solo si el empate no se rompe por la regla anterior.

  1. Elige el ClusterCIDRConfig cuyo NodeSelector coincide con la mayor cantidad de etiquetas en el nodo. Por ejemplo, {'node.kubernetes.io/instance-type':'medium', 'rack': 'rack1'} (Match Count: 2) se elige antes que {'node.kubernetes.io/instance-type': 'medium'}. (Match Count: 1).

  2. Elige ClusterCIDRConfig con la menor cantidad de CIDR de Pod asignables. Por ejemplo, {CIDR: "10.0.0.0/16", PerNodeMaskSize: "16"} (1 possible Pod CIDR) se elige antes de {CIDR: "192.168.0.0/20", PerNodeMaskSize: "22"} (4 possible Pod CIDRs).

  3. Elige el ClusterCIDRConfig cuyo PerNodeMaskSize tenga la menor cantidad de direcciones IP. Por ejemplo, 27 (2^(32-27)= 32 direcciones IP) elegidas antes de 25 (2^(32-25)=128 direcciones IP).

  4. Elige el ClusterCIDRConfig cuya etiqueta NodeSelector coincidente tenga un valor alfanumérico inferior. Por ejemplo, {'kubernetes.io/hostname': 'node-1'} se elige antes que {'node.kubernetes.io/instance-type':'medium'}.

  5. Elige el ClusterCIDRConfig cuya IP de CIDR tiene un valor más bajo. Solo se comparan los CIDR de IPv4, independientemente de si la configuración es de IPv4 o de DualStack. Por ejemplo, {CIDR: "10.0.0.0/16"} is picked over {CIDR: "192.168.0.0/16"}.

Ejemplos de configuración

En esta sección, se enumeran ejemplos de configuración de ClusterCIDRConfig y ClusterCIDRConfig para todos los modos de red.