Service ClusterIP 할당

Service ClusterIP 할당 (Service ClusterIP allocation)

Kubernetes에서 Services는 Pod 집합에서 실행되는 애플리케이션을 노출하는 추상적인 방법이에요. Service는 클러스터 범위의 가상 IP 주소(type: ClusterIP Service)를 가질 수 있어요. 클라이언트는 그 가상 IP로 연결하고, Kubernetes는 트래픽을 백업 Pod들에 로드밸런싱해요.

Service ClusterIP는 어떻게 할당되나?

Kubernetes가 Service에 가상 IP 주소를 할당해야 할 때, 다음 두 가지 중 하나로 할당돼요.

  • 동적으로(dynamically): 클러스터 컨트롤 플레인이 type: ClusterIP Service용으로 구성된 IP 범위 안에서 사용 가능한 IP를 자동으로 선택.
  • 정적으로(statically): Service용 구성된 IP 범위 안에서 원하는 IP를 직접 지정.

전체 클러스터에서 모든 Service ClusterIP는 유일해야 해요. 이미 할당된 ClusterIP로 Service를 만들려고 하면 오류가 나요.

왜 Service ClusterIP를 예약해야 하나?

클러스터의 다른 컴포넌트와 사용자가 쓸 수 있도록 Service를 잘 알려진 IP 주소에 두고 싶을 수 있어요. 가장 좋은 예가 클러스터의 DNS Service예요. 일부 Kubernetes 설치 도구는 Service IP 범위의 10번째 IP를 DNS 서비스에 할당하는 관례를 써요. Service IP 범위 10.96.0.0/16에서 DNS IP를 10.96.0.10으로 쓰고 싶다면 그렇게 Service를 만들면 돼요.

하지만 10.96.0.10은 예약되어 있지 않아요. 다른 Service가 동적 할당과 동시에 만들어지면 그 IP를 할당받을 수 있어요. 그러면 충돌 오류로 DNS Service를 만들 수 없게 돼요.

Service ClusterIP 충돌은 어떻게 피하나?

Kubernetes가 ClusterIP를 할당하는 구현 전략은 충돌 위험을 줄여요.

ClusterIP 범위는 min(max(16, cidrSize / 16), 256) 공식으로 나뉘는데, 16 미만 또는 256 초과가 아니며 그 사이에서 점진적으로 증가한다고 설명돼요.

동적 IP 할당은 기본적으로 위쪽 밴드(upper band)를 사용하고, 그것이 소진되면 아래쪽 범위를 사용해요. 이는 사용자가 충돌 위험이 낮은 아래쪽 밴드에 정적 할당을 쓸 수 있게 해줘요.

예시

예시 1

IP 범위 10.96.0.0/24 (CIDR) 사용.

Range Size: 2^8 - 2 = 254 Band Offset: min(max(16, 256/16), 256) = min(16, 256) = 16 Static band start: 10.96.0.1 Static band end: 10.96.0.16 Range end: 10.96.0.254

예시 2

IP 범위 10.96.0.0/20 (CIDR) 사용.

Range Size: 2^12 - 2 = 4094 Band Offset: min(max(16, 4096/16), 256) = min(256, 256) = 256 Static band start: 10.96.0.1 Static band end: 10.96.1.0 Range end: 10.96.15.254

예시 3

IP 범위 10.96.0.0/16 (CIDR) 사용.

Range Size: 2^16 - 2 = 65534 Band Offset: min(max(16, 65536/16), 256) = min(4096, 256) = 256 Static band start: 10.96.0.1 Static band end: 10.96.1.0 Range end: 10.96.255.254

더 알아보기 (Learn more)