ClusterCIDRConfig 커스텀 리소스 이해하기

개요

ClusterCIDRConfig는 포드에 더 많은 IP 주소 범위를 동적으로 할당할 수 있게 해주는 커스텀 CIDR 할당기 리소스입니다.

IP 주소 관리(IPAM)를 사용하면 IP 서브넷을 효율적으로 사용할 수 있으며, 주소 범위가 겹치지 않도록 하여 네트워크 충돌 및 중단을 방지할 수 있습니다. Kubernetes는 노드당 포드 CIDR을 할당합니다. 이는 해당 노드에서 실행되는 포드의 IP 주소로 사용됩니다.

현재 Kubernetes NodeIPAM에는 다음과 같은 제한사항이 있습니다.

  • 모든 포드 CIDR은 하나의 클러스터 CIDR에서 할당됩니다. 클러스터를 만들 때 가장 큰 클러스터를 고려해서 전체 IP 주소 범위를 지정해야 합니다. 이러한 제한사항으로 인해 IP 주소가 낭비될 수 있습니다.

  • 클러스터 크기를 늘리면 IP 주소를 더 추가하기가 어렵습니다.

  • 클러스터 CIDR은 하나의 큰 범위입니다. 클러스터 요구를 충족하는 연속적인 IP 주소 블록을 찾는 것이 어려울 수 있습니다.

  • 각 노드는 클러스터 내에서 고정된 크기의 IP 범위를 가져옵니다. 노드의 크기와 용량이 서로 다른 경우 용량이 큰 특정 노드에 더 큰 포드 범위를 할당하고 용량이 작은 노드에 더 작은 범위를 할당하는 것이 불가능합니다. 그로 인해 많은 IP 주소가 낭비됩니다. 노드가 많은 대규모 클러스터의 경우 클러스터의 모든 노드에서 이 같은 낭비가 가중됩니다.

ClusterCIDRConfig 기능을 사용하면 하나의 큰 CIDR 블록을 클러스터에 할당하지 않고, 클러스터 크기를 포드 규모에 매핑하므로 IP 주소를 보존할 수 있습니다. 다양한 조합의 CIDR 및 perNodeMaskSize로 ClusterCIDRConfig를 사용하여 IP 주소를 저장할 수 있습니다. ClusterCIDRConfig 리소스는 다음을 지원합니다.

  • 보다 세분화된 수준의 클러스터 CIDR을 위한 연속되지 않은 여러 IP CIDR 블록

  • CIDR 블록의 노드 어피니티

  • 노드에 할당된 다양한 블록 크기

베어메탈용 GKE는 다음 기능에서 ClusterCIDRConfig 기능을 사용합니다.

Cluster.spec.clusterNetwork.pods.cidrBlocks는 선택적 필드로서 기본적으로 정의되지 않습니다. 이전 목록의 기능에 정의되지 않은 경우 이를 정의해야 합니다. 예를 들어 이 필드는 IPv4 섬(island) 모드로 클러스터를 만들 때 필요하며 기본 라우팅 CIDR로 사용되므로 이를 지정해야 합니다.

다음 표에서는 여러 네트워크 모드에서 ClusterCIDRConfig의 Cluster.spec.clusterNetwork.pods.cidrBlocks 필드 동작 사용을 보여줍니다.

네트워크 모드 ClusterCIDRConfig 값
IPv4 섬(Island)(기본값) (필수 필드) Cluster.spec.clusterNetwork.pods.cidrBlocks를 지정합니다.
IPv4 플랫(기본값) Cluster.spec.clusterNetwork.pods.cidrBlocks는 완전히 무시되므로 건너뛰어도 됩니다. 사용자가 ClusterCIDRConfig(노드별, 노드 풀별 또는 클러스터별)를 명시적으로 정의해야 합니다.
이중 스택(IPv4 섬(Island), IPv4 플랫)

IPv4 CIDR을 지정합니다.

Cluster.spec.clusterNetwork.pods.cidrBlocks에서 IPv6 CIDR을 지정하지 마세요.

ClusterCIDRConfig를 IPv4 및 IPv6 CIDR 모두로 지정합니다. 모든 ClusterCIDRConfigs에 구성된 IPv4 CIDR은 IPv4의 PerNodeMask 값을 포함하여 Cluster.spec.clusterNetwork.pods.cidrBlocks의 IPv4 CIDR과 동일해야 합니다. ClusterCIDRConfig 및 사용 예시에 대한 자세한 내용은 예시: 이중 스택(IPv4 섬(Island), IPv6 플랫)을 참조하세요.

이중 스택(플랫 IPv4, 플랫 IPv6) Cluster.spec.clusterNetwork.pods.cidrBlocks는 완전히 무시되므로 건너뛰어도 됩니다. IPv4 및 IPv6 CIDR 모두를 사용해 ClusterCIDRConfig(노드별, 노드 풀별 또는 클러스터별)를 명시적으로 정의해야 합니다.

ClusterCIDRConfig 커스텀 CIDR 할당기 리소스 구성

ClusterCIDRConfig

ClusterCIDRConfig 커스텀 CIDR 할당기 리소스를 구성할 때는 다음 사항을 고려하세요.

  • 특정 ClusterCIDRConfig에서 노드로 포드 CIDR을 할당할 때는 라벨 선택기를 기반으로 합니다. 이는 노드에서 포드를 예약하는 데 사용되는 nodeSelector 메커니즘과 비슷합니다.

  • 클러스터 생성 프로세스 중에 ClusterCIDRConfig를 클러스터 구성 YAML 파일에 구성해야 합니다. ClusterCIDRConfig를 지정한 후에는 값을 수정할 수 없습니다.

  • 겹치는 CIDR을 사용해서 여러 ClusterCIDRConfig를 지정할 수 있습니다.

  • 노드에 일치하는 ClusterCIDRConfig가 없으면 일치하는 라벨이 있는 ClusterCIDRConfig가 생성될 때까지 노드가 NotReady 상태로 유지됩니다.

  • 가장 일치하는 ClusterCIDRConfig에 할당에 사용할 수 있는 CIDR이 더 이상 없으면 차선인 CIDR이 선택되고 사용 가능한 CIDR에서 포드 CIDR이 할당됩니다.

  • 이중 스택 모델의 경우 노드에 이중 스택 포드 CIDR을 할당하려면 다음을 수행하세요.

    • ClusterCIDRConfig에 IPv4 및 IPv6 CIDR을 모두 구성합니다.

    • 여러 ClusterCIDRConfig가 구성된 경우 모든 ClusterCIDRConfig에 DualStack CIDR이 포함되는지 확인합니다.

    • 구성된 IPv4 및 IPv6 CIDR 모두 노드당 할당 가능한 IP 주소의 수가 동일해야 합니다.

    예를 들면 32 - spec.IPv4.PerNodeMaskSize == 128 - spec.IPv6.PerNodeMaskSize입니다.

    spec.IPv4.PerNodeMaskSize = 24

    spec.IPv6.PerNodeMaskSize = 120

    따라서 차이가 8이므로 32 - 24 == 128 - 120입니다.

  • 여러 ClusterCIDRConfig가 노드 라벨에 대한 nodeSelector의 라벨과 일치할 수 있습니다.

ClusterCIDRConfig 할당 규칙

포드 CIDR을 현재 노드에 할당하는 데 사용되는 ClusterCIDRConfig를 결정하려면 다음 결정 규칙을 사용합니다. 이러한 규칙을 지정된 순서로 구현합니다. 이전 규칙으로 결정되지 않은 경우에만 다음 규칙을 구현합니다.

  1. NodeSelector가 노드에 있는 대부분의 라벨과 일치하는 ClusterCIDRConfig를 선택합니다. 예를 들어 {'node.kubernetes.io/instance-type': 'medium'}. (Match Count: 1)보다 먼저 {'node.kubernetes.io/instance-type':'medium', 'rack': 'rack1'} (Match Count: 2)가 선택됩니다.

  2. 할당 가능한 포드 CIDR 수가 가장 적은 ClusterCIDRConfig를 선택합니다. 예를 들어 {CIDR: "192.168.0.0/20", PerNodeMaskSize: "22"} (4 possible Pod CIDRs)보다 먼저 {CIDR: "10.0.0.0/16", PerNodeMaskSize: "16"} (1 possible Pod CIDR)이 선택됩니다.

  3. PerNodeMaskSize의 IP 주소가 가장 적은 ClusterCIDRConfig를 선택합니다. 예를 들어 25(2^(32-25)= IP 주소 128개)보다 먼저 27(2^(32-27)= IP 주소 32개)을 선택합니다.

  4. 일치하는 NodeSelector 라벨의 영숫자 값이 낮은 ClusterCIDRConfig를 선택합니다. 예를 들어 {'node.kubernetes.io/instance-type':'medium'}보다는 {'kubernetes.io/hostname': 'node-1'}을 선택합니다.

  5. CIDR IP의 값이 더 낮은 ClusterCIDRConfig를 선택합니다. 구성이 IPv4 구성이든 이중 스택 구성이든 관계없이 IPv4 CIDR만 비교합니다. 예를 들면 {CIDR: "10.0.0.0/16"} is picked over {CIDR: "192.168.0.0/16"}입니다.

구성 예

이 섹션에는 모든 네트워킹 모드에 대한 클러스터 및 ClusterCIDRConfig의 구성 예시가 나와 있습니다.