Comprende el recurso personalizado ClusterCIDRConfig

Descripción general

ClusterCIDRConfig es un recurso asignador 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 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 en el momento de la creación. 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 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 son de diferentes tamaños y capacidades, no puedes asignar un rango de Pods más grande a un nodo dado con mayor capacidad y uno más pequeño a nodos con capacidad menor. 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 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, 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 bloques CIDR

  • Diferentes tamaños de bloque asignados a los nodos

GKE en Bare Metal usa la funcionalidad ClusterCIDRConfig en las siguientes características:

Cluster.spec.clusterNetwork.pods.cidrBlocks es un campo opcional y no está definido de forma predeterminada. Debes definirla si alguna de las funciones de la lista anterior no la tiene definida. 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 enumera 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 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).
Doble pila (isla IPv4, IPv4 plana)

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 de IPv6).

Doble pila (IPv4 plana, 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 IPv4 e IPv6.

Configura el recurso asignador de CIDR personalizado de 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 específico a un nodo se basa en los 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 un ClusterCIDRConfig que coincida con un nodo, este permanecerá 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 mejor CIDR que sigue y se asignan los CIDR del Pod de los CIDR disponibles.

  • En el caso del modelo de pila doble, si deseas asignar CIDR de Pod de doble pila 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 se configuraron varios ClusterCIDRConfig.

    • Asegúrate de que tanto los CIDR de IPv4 como de 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 etiquetas 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 desempate. Implementa estas reglas en el orden determinado. Implementa la siguiente regla solo si el empate no se rompe con 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 de 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 la ClusterCIDRConfig cuya IP 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 de ClusterCIDRConfig y ClusterCIDRConfig para todos los modos de red.