Información sobre el recurso personalizado de ClusterCIDRConfig

Descripción general

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

La administración de direcciones IP (IPAM) permite el uso eficiente de las subredes de IP y evita tener superposiciones en los rangos de direcciones, lo que impide los conflictos y las interrupciones de la 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 actual de Kubernetes tiene las siguientes limitaciones:

  • Todos los CIDR de Pods se asignan desde un CIDR de clúster. Debes especificar el rango de direcciones IP completo que abarque el clúster más grande en el momento de la creación del 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 satisfaga las necesidades del clúster.

  • Cada nodo obtiene un rango de IP de tamaño fijo dentro de un clúster. Si los nodos tienen 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 los nodos con menor capacidad. Esto desperdicia muchas direcciones IP. En un clúster grande con muchos nodos, este desperdicio se acumula en todos los nodos del clúster.

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

  • Varios bloques CIDR de IP no contiguos para el CIDR del clúster en un nivel más detallado

  • Afinidad de nodo de los bloques CIDR

  • Diferentes tamaños de bloque asignados a los nodos

Google Distributed Cloud usa la funcionalidad de ClusterCIDRConfig en las siguientes funciones:

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

En la siguiente tabla, se indica el uso del comportamiento del campo Cluster.spec.clusterNetwork.pods.cidrBlocks de ClusterCIDRConfig para diferentes modos de red.

Modo de red Valor de ClusterCIDRConfig
Isla de IPv4 (predeterminado) (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 de forma explícita ClusterCIDRConfigs (por nodo, por grupo de nodos o por clúster).
Pila doble (isla IPv4, plana IPv4)

Especifica el CIDR de IPv4.

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

Especifica ClusterCIDRConfigs con CIDR de IPv4 e 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 de PerNodeMask para IPv4. Para obtener más información sobre ClusterCIDRConfig y ejemplos de su uso, consulta Ejemplos: Pila doble (isla IPv4, plano IPv6).

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

Configura el recurso de asignador de CIDR personalizado ClusterCIDRConfig

ClusterCIDRConfig

Cuando configures el recurso personalizado del asignador de CIDR 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 coincidente para un nodo, este permanecerá en el 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 de Pods se asignan a partir de los CIDR disponibles.

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

    • Configura los CIDR de IPv4 e IPv6 en ClusterCIDRConfig.

    • Asegúrate de que todos los ClusterCIDRConfig tengan CIDR de pila doble si se configuraron varios ClusterCIDRConfig.

    • 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 coincidir con las etiquetas de nodeSelector con las etiquetas de nodo.

Reglas de asignación de ClusterCIDRConfig

Para determinar qué ClusterCIDRConfig se usa para asignar CIDR de Pods al nodo actual, usa las siguientes reglas de desempate. Implementa estas reglas en el orden indicado. Implementa la siguiente regla solo si la regla anterior no resuelve el empate.

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

  2. Elige el ClusterCIDRConfig con la menor cantidad de CIDR de Pods asignables. Por ejemplo, se elige {CIDR: "10.0.0.0/16", PerNodeMaskSize: "16"} (1 possible Pod CIDR) antes que {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, se elige 27 (2^(32-27)= 32 direcciones IP) antes que 25 (2^(32-25)=128 direcciones IP).

  4. Elige el ClusterCIDRConfig cuya etiqueta NodeSelector coincidente tenga un valor alfanumérico más bajo. Por ejemplo, se elige {'kubernetes.io/hostname': 'node-1'} en lugar de {'node.kubernetes.io/instance-type':'medium'}.

  5. Elige el ClusterCIDRConfig cuya IP de CIDR tenga un valor más bajo. Independientemente de si la configuración es IPv4 o de pila doble, solo se comparan los CIDR de IPv4. 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 para Cluster y ClusterCIDRConfig en todos los modos de redes.