쿠버네티스 기본 서비스 CIDR 재구성

기능 상태: Kubernetes v1.33 [stable] (enabled by default: true)

이 문서는 클러스터에 할당된 기본 서비스 IP 범위를 재구성하는 방법을 다룬다.

시작하기 전에

쿠버네티스 클러스터가 필요하고, kubectl 커맨드-라인 툴이 클러스터와 통신할 수 있도록 설정되어 있어야 한다. 이 튜토리얼은 컨트롤 플레인 호스트가 아닌 노드가 적어도 2개 포함된 클러스터에서 실행하는 것을 추천한다. 만약, 아직 클러스터를 가지고 있지 않다면, minikube를 사용해서 생성하거나 다음 쿠버네티스 플레이그라운드 중 하나를 사용할 수 있다.

쿠버네티스 서버의 버전은 다음과 같거나 더 높아야 함. 버전: v1.33.

버전 확인을 위해서, 다음 커맨드를 실행 kubectl version.

쿠버네티스 기본 서비스 CIDR 재구성

이 문서는 쿠버네티스 클러스터 내 서비스 IP 주소 범위를 관리하는 방법을 설명하며, 이는 클러스터가 서비스에 대해 지원하는 IP 패밀리에도 영향을 준다.

서비스 ClusterIPs에 사용 가능한 IP 패밀리는 kube-apiserver의 --service-cluster-ip-range 플래그에 의해 결정된다. 서비스 IP 주소 할당에 대해 더 잘 이해하려면 가상 IP 및 서비스 프록시 문서를 참고한다.

쿠버네티스 1.33부터, 클러스터에 대해 설정된 서비스 IP 패밀리는 kubernetes라는 이름의 ServiceCIDR 오브젝트로 반영된다. kubernetes ServiceCIDR 오브젝트는 최초로 실행된 kube-apiserver 인스턴스가 자신에게 설정된 --service-cluster-ip-range 플래그를 기반으로 생성한다. 일관된 클러스터 동작을 보장하기 위해, 모든 kube-apiserver 인스턴스는 동일한 --service-cluster-ip-range 값으로 설정되어야 하며, 이는 기본 쿠버네티스 ServiceCIDR 오브젝트와 일치해야 한다.

쿠버네티스 서비스 CIDR 재구성 유형

서비스 CIDR 재구성은 다음과 같은 시나리오로 구분할 수 있다.

  • 기존 서비스 CIDR 확장: 이는 kube-apiserver를 재구성할 필요 없이 새 ServiceCIDR 오브젝트를 추가하여 동적으로 수행할 수 있다. 자세한 내용은 [서비스 IP 범위 확장] (https://kubernetes.io/ko/docs/tasks/network/extend-service-ip-ranges/) 문서를 참고한다.

  • 단일 스택에서 기본 서비스 CIDR을 유지한 채 이중 스택으로 전환: 이는 원래의 IP 패밀리를 기본으로 유지하면서 보조 IP 패밀리(IPv4 전용 클러스터에 IPv6 추가, 또는 IPv6 전용 클러스터에 IPv4 추가)를 도입하는 것을 의미한다. 이를 위해 kube-apiserver 구성을 업데이트해야 하며 이 추가된 IP 패밀리를 처리해야 하는 다양한 클러스터 컴포넌트들도 함께 수정해야 한다. 이러한 컴포넌트에는 kube-proxy, CNI 또는 네트워크 플러그인, 서비스 메시 구현체, DNS 서비스 등이 포함되지만 이에 국한되지는 않는다.

  • 이중 스택에서 기본 서비스 CIDR을 유지한 채 단일 스택으로 전환: 이는 이중 스택 클러스터에서 보조 IP 패밀리를 제거하고, 원래의 기본 IP 패밀리를 유지한 채 단일 IP 패밀리로 되돌리는 것을 의미한다. 컴포넌트를 새 IP 패밀리에 맞게 재구성하는 것뿐 아니라, 제거된 IP 패밀리를 사용하도록 명시적으로 설정된 서비스들을 처리해야 할 수도 있다.

  • 기본 서비스 CIDR를 변경하는 경우: 기본 ServiceCIDR 전체를 교체하는 것은 복잡한 작업이다. 새로운 ServiceCIDR이 기존 범위와 겹치지 않는다면 [기존 서비스들의 재번호 부여와 kubernetes.default 서비스의 변경] (#illustrative-reconfiguration-steps)이 필요하다. 기본 IP 패밀리 자체가 변경되는 경우에는 훨씬 더 복잡해지며, 새로운 기본 IP 패밀리에 맞추기 위해 (kubelet, 네트워크 플러그인 등) 여러 클러스터 구성 요소를 변경해야 할 수도 있다.

기본 서비스 CIDR 교체를 위한 수동 작업

기본 서비스 CIDR을 재구성하려면 클러스터 운영자, 관리자, 또는 클러스터 라이프사이클을 관리하는 소프트웨어가 수행하는 수동 절차가 필요하다. 일반적으로 다음과 같은 작업을 포함한다.

  1. kube-apiserver 구성 업데이트: 새로운 IP 범위로 --service-cluster-ip-range 플래그를 수정한다.
  2. 네트워크 컴포넌트 재구성: 이는 중요한 단계이며, 구체적인 절차는 사용 중인 네트워크 컴포넌트에 따라 다르다. 구성 파일 업데이트, 에이전트 파드 재시작, 또는 새 서비스 CIDR과 파드의 원하는 IP 패밀리 구성을 처리하도록 컴포넌트를 업데이트하는 작업이 포함될 수 있다. 일반적으로 kube-proxy와 같은 쿠버네티스 서비스 구현체, 구성된 네트워크 플러그인, 그리고 서비스 메시 컨트롤러와 DNS 서버와 같은 다른 네트워킹 컴포넌트가 이에 해당하며, 이들이 새 IP 패밀리 구성에서 트래픽을 올바르게 처리하고 서비스 디스커버리를 수행할 수 있어야 한다.
  3. 기존 서비스 관리: 이전 CIDR에서 할당된 서비스 IP가 새로 구성된 범위에 속하지 않는 경우 이를 처리해야 한다. 방법으로는 (다운타임과 새 IP 할당을 수반하는) 재생성 또는 더 복잡한 재구성 전략이 있다.
  4. 내부 쿠버네티스 서비스 재생성: 기본 IP 패밀리가 변경되었거나 다른 네트워크로 교체된 경우, kubernetes.default 서비스는 새 서비스 CIDR에서 IP를 할당받도록 삭제 후 재생성해야 한다.

재구성 단계 예시

다음 단계들은 기본 서비스 CIDR을 완전히 교체하고 kubernetes.default 서비스 재생성에 초점을 맞춘 제어된 재구성 절차를 설명한다.

  1. 초기 --service-cluster-ip-range 값으로 kube-apiserver를 시작한다.
  2. 이 범위에서 IP를 할당받는 초기 서비스를 생성한다.
  3. 재구성을 위한 임시 대상으로 새로운 서비스 CIDR을 추가한다.
  4. kubernetes 기본 서비스 CIDR을 삭제 대상으로 표시한다(기존 IP와 파이널라이저(finalizer)로 인해 삭제 대기 상태로 남는다). 이렇게 하면 이전 범위에서 새 할당이 이루어지는 것을 방지한다.
  5. 기존 서비스를 재생성한다. 이제 새 임시 서비스 CIDR에서 IP가 할당된다.
  6. 새 서비스 CIDR로 설정된 kube-apiserver를 재시작하고 이전 인스턴스를 종료한다.
  7. kubernetes.default 서비스를 삭제한다. 새 kube-apiserver가 이를 새 서비스 CIDR 내에서 재생성한다.

다음 내용