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 리소스는 다음을 지원합니다.
Cluster.spec.clusterNetwork.pods.cidrBlocks는 선택적 필드로서 기본적으로 정의되지 않습니다. 이전 목록의 기능에 정의되지 않은 경우 이를 정의해야 합니다. 예를 들어 이 필드는 IPv4 섬(island) 모드로 클러스터를 만들 때 필요하며 기본 라우팅 CIDR로 사용되므로 이를 지정해야 합니다.
다음 표에서는 여러 네트워크 모드에서 ClusterCIDRConfig의 Cluster.spec.clusterNetwork.pods.cidrBlocks 필드 동작 사용을 보여줍니다.
ClusterCIDRConfig를 IPv4 및 IPv6 CIDR 모두로 지정합니다. 모든 ClusterCIDRConfig에 구성된 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이 할당됩니다.
여러 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를 결정하려면 다음 결정 규칙을 사용합니다. 이러한 규칙을 지정된 순서로 구현합니다. 이전 규칙으로 결정되지 않은 경우에만 다음 규칙을 구현합니다.
NodeSelector가 노드의 가장 많은 라벨과 일치하는 ClusterCIDRConfig를 선택합니다. 예를 들어 {'node.kubernetes.io/instance-type': 'medium'}. (Match Count: 1)보다 먼저 {'node.kubernetes.io/instance-type':'medium', 'rack':
'rack1'} (Match Count: 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)이 선택됩니다.
PerNodeMaskSize의 IP 주소가 가장 적은 ClusterCIDRConfig를 선택합니다.
예를 들어 25(2^(32-25)= IP 주소 128개)보다 먼저 27(2^(32-27)= IP 주소 32개)을 선택합니다.
일치하는 NodeSelector 라벨의 영숫자 값이 낮은 ClusterCIDRConfig를 선택합니다. 예를 들어 {'node.kubernetes.io/instance-type':'medium'}보다는 {'kubernetes.io/hostname': 'node-1'}을 선택합니다.
CIDR IP의 값이 더 낮은 ClusterCIDRConfig를 선택합니다. 구성이 IPv4 구성이든 이중 스택 구성이든 관계없이 IPv4 CIDR만 비교합니다. 예를 들면 {CIDR: "10.0.0.0/16"} is picked over
{CIDR: "192.168.0.0/16"}입니다.
구성 예
이 섹션에는 모든 네트워킹 모드에 대한 클러스터 및 ClusterCIDRConfig의 구성 예시가 나와 있습니다.
예: IPv4 섬(Island) 모드(기본값)
클러스터 구성(기본값)
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
name: bm-cluster
namespace: cluster-default
spec:
...
clusterNetwork:
# Pods specify the IP ranges from which pod networks are allocated.
pods:
cidrBlocks:
- 192.168.0.0/16
services:
cidrBlocks:
- 10.96.0.0/12
... (other cluster config omitted)
[[["이해하기 쉬움","easyToUnderstand","thumb-up"],["문제가 해결됨","solvedMyProblem","thumb-up"],["기타","otherUp","thumb-up"]],[["Hard to understand","hardToUnderstand","thumb-down"],["Incorrect information or sample code","incorrectInformationOrSampleCode","thumb-down"],["Missing the information/samples I need","missingTheInformationSamplesINeed","thumb-down"],["번역 문제","translationIssue","thumb-down"],["기타","otherDown","thumb-down"]],["최종 업데이트: 2023-12-08(UTC)"],[],[]]