Comprende el recurso personalizado ClusterCIDRConfig

Descripción general

ClusterCIDRConfig es un recurso asignado de 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 que se superpongan los rangos de direcciones, lo que evita interrupciones y conflictos en 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 de Kubernetes actual tiene las siguientes limitaciones:

  • Todos los CIDR del Pod se asignan desde un CIDR del clúster. Debes especificar el rango completo de direcciones IP para 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, será difícil agregar más direcciones IP.

  • El CIDR del clúster es un rango amplio. 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 nodos con menor capacidad. Esto desperdicia muchas 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 tus Pods y, por lo tanto, preservar 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 no contiguos para el CIDR del clúster a un nivel más detallado

  • Afinidad de nodos de bloques CIDR

  • Diferentes tamaños de bloque asignados a los nodos

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

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

En la siguiente tabla, se muestra 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 IPv4 (predeterminada) (Campo obligatorio) Especifica Cluster.spec.clusterNetwork.pods.cidrBlocks.
IPv4 sin formato (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 CIDR IPv6 en Cluster.spec.clusterNetwork.pods.cidrBlocks.

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

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

Configura el recurso asignado de CIDR personalizado ClusterCIDRConfig

ClusterCIDRConfig

Cuando configures el recurso asignador de CIDR personalizado 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 especificas ClusterCIDRConfigs, no puedes modificar los valores más adelante.

  • Puedes especificar varios ClusterCIDRConfigs con CIDR superpuestos.

  • Si no se encuentra un ClusterCIDRConfig que coincida con un nodo, este permanece en un estado NotReady hasta que se crea un ClusterCIDRConfig con etiquetas coincidentes.

  • Si la mejor coincidencia ClusterCIDRConfig no tiene más CIDR disponibles para la asignación, se elige el siguiente mejor CIDR y los CIDR del Pod se asignan 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 CIDR de IPv4 e IPv6 en ClusterCIDRConfig.

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

    • Asegúrate de que los CIDR de IPv4 e IPv6 configurados tengan una cantidad igual 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 etiquetas de 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 desempate. Implementa estas reglas en el orden determinado. Implementa la siguiente regla solo si el empate no se divide según la regla anterior.

  1. Elige el ClusterCIDRConfig cuyo NodeSelector coincida 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 el ClusterCIDRConfig que tenga 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 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, 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 más bajo. 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 tenga un valor más bajo. Independientemente de si la configuración es de IPv4 o de DualStack, 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 el clúster y ClusterCIDRConfig para todos los modos de red.