해당 문서의 쿠버네티스 버전: v1.28

Kubernetes v1.28 문서는 더 이상 적극적으로 관리되지 않음. 현재 보고있는 문서는 정적 스냅샷임. 최신 문서를 위해서는, 다음을 참고. 최신 버전.

서비스 클러스터IP 할당

쿠버네티스에서 서비스는 파드 집합에서 실행되는 애플리케이션을 노출하는 추상적인 방법이다. 서비스는 (type: ClusterIP인 서비스를 통해) 클러스터-범위의 가상 IP 주소를 가진다. 클라이언트는 해당 가상 IP 주소로 접속할 수 있으며, 쿠버네티스는 해당 서비스를 거치는 트래픽을 서비스 뒷단의 파드들에게 로드 밸런싱한다.

어떻게 서비스 클러스터IP가 할당되는가?

쿠버네티스가 서비스에 가상 IP를 할당해야 할 때, 해당 요청분에는 두가지 방법 중 하나가 수행된다.

동적 할당
클러스터의 컨트롤 플레인이 자동으로 type: ClusterIP 서비스의 설정된 IP 범위 내에서 가용 IP 주소를 선택한다.
정적 할당
서비스용으로 설정된 IP 범위 내에서 사용자가 IP 주소를 선택한다.

클러스터 전체에 걸쳐, 모든 서비스의 ClusterIP는 항상 고유해야 한다. 이미 할당된 특정 ClusterIP로 서비스를 생성하려고 하면 에러가 발생한다.

왜 서비스 클러스터 IP를 예약해야 하는가?

때로는 클러스터의 다른 컴포넌트들이나 사용자들이 사용할 수 있도록 이미 알려진 IP 주소를 통해 서비스를 실행하고 싶을 것이다.

가장 좋은 방법은 클러스터의 DNS 서비스이다. 가벼운 관례로 일부 쿠버네티스 설치 관리자들은 DNS 서비스의 10번째 주소를 서비스 IP 범위로 지정한다. 클러스터의 서비스 IP 범위가 10.96.0.0/16 인 상황에서 DNS 서비스 IP를 10.96.0.10 으로 지정하고 싶다면, 아래와 같이 서비스를 생성해야 할 것이다.

apiVersion: v1
kind: Service
metadata:
  labels:
    k8s-app: kube-dns
    kubernetes.io/cluster-service: "true"
    kubernetes.io/name: CoreDNS
  name: kube-dns
  namespace: kube-system
spec:
  clusterIP: 10.96.0.10
  ports:
  - name: dns
    port: 53
    protocol: UDP
    targetPort: 53
  - name: dns-tcp
    port: 53
    protocol: TCP
    targetPort: 53
  selector:
    k8s-app: kube-dns
  type: ClusterIP

하지만 이전에도 설명했듯이, IP 주소 10.96.0.10는 예약된 상태가 아니다. 만약 다른 서비스들이 그 전에 동적 할당으로 생성되었거나, 동시에 생성되었다면, 해당 서비스들이 IP를 할당받았을 수도 있다. 따라서, 충돌 에러로 인해 DNS 서비스를 생성하지 못할 것이다.

어떻게 하면 서비스 클러스터IP 충돌을 피할 수 있는가?

쿠버네티스에 구현된 할당 전략은 서비스에 클러스터IP 할당의 충돌 위험을 줄여준다.

ClusterIP 범위는 16 이상 256 미만의 단계적인 차수를 나타내는 min(max(16, cidrSize / 16), 256) 공식을 기반으로 나누어져 있다.

동적 IP 할당은 기본값으로 위쪽 밴드를 사용한다. 위쪽 범위가 모두 소진되었다면 아래쪽 밴드를 사용할 것이다. 이것은 사용자로 하여금 아래쪽 밴드의 정적 할당을 낮은 충돌 확률로 수행할 수 있게 해준다.

예시

예시 1

아래 예시는 서비스 IP 주소들로 10.96.0.0/24 (CIDR 표기법) IP 주소 범위를 사용한다.

범위 크기: 28 - 2 = 254
밴드 오프셋: min(max(16, 256/16), 256) = min(16, 256) = 16
정적 밴드 시작점: 10.96.0.1
정적 밴드 끝점: 10.96.0.16
범위 끝점: 10.96.0.254

pie showData title 10.96.0.0/24 "정적" : 16 "동적" : 238

예시 2

아래 예시는 서비스 IP 주소들로 10.96.0.0/20 (CIDR 표기법) IP 주소 범위를 사용한다.

범위 크기: 212 - 2 = 4094
밴드 오프셋: min(max(16, 4096/16), 256) = min(256, 256) = 256
정적 밴드 시작점: 10.96.0.1
정적 밴드 끝점: 10.96.1.0
범위 끝점: 10.96.15.254

pie showData title 10.96.0.0/20 "정적" : 256 "동적" : 3838

예시 3

아래 예시는 서비스 IP 주소들로 10.96.0.0/16 (CIDR 표기법) IP 주소 범위를 사용한다.

범위 크기: 216 - 2 = 65534
밴드 오프셋: min(max(16, 65536/16), 256) = min(4096, 256) = 256
정적 밴드 시작점: 10.96.0.1
정적 밴드 끝점: 10.96.1.0
범위 끝점: 10.96.255.254

pie showData title 10.96.0.0/16 "정적" : 256 "동적" : 65278

다음 내용