본문으로 바로가기 본문 바로가기
WIKI 기술 지식 베이스

토폴로지 기반 IP 주소 할당

원문 보기 위키 갱신

IP 풀에 노드 셀렉터를 걸어 특정 존(zone), 랙(rack), 리전(region)에 IP 블록을 묶어주는 방법을 다뤄요. 이렇게 하면 파드가 클러스터 토폴로지에 맞는 IP 주소를 받게 돼요. 라우트 수를 줄이거나 외부 방화벽 요구사항을 만족시킬 때 유용해요.

출처: 문서

본문

큰 그림

IP 풀에서 서로 다른 토폴로지 영역별로 IP 주소 블록을 할당해요.

활용 가치

워크로드가 서로 다른 리전, 존, 랙에 있다면 같은 IP 풀에서 IP 주소를 받도록 만들고 싶을 수 있어요. 이 전략은 네트워크에서 필요한 라우트 수를 줄이거나, 외부 방화벽 장치나 정책이 요구하는 조건을 만족시키는 데 유용해요. Calico는 노드 레이블과 노드 셀렉터를 사용하는 IP 풀 리소스로 이 작업을 쉽게 만들어 줘요.

개념

IP 주소 할당

토폴로지 기반 IP 주소 할당은 주소가 호스트(노드)별로 관리되어야 해요. 따라서 Kubernetes 어노테이션은 사용할 수 없어요. 어노테이션은 네임스페이스별, 파드별로만 적용되거든요. CNI 설정에서 노드의 IP 주소를 설정할 수도 있지만, 그건 호스트의 파일 시스템 내부를 건드리는 일이 돼요. 가장 좋은 선택은 IP 풀을 사용하는 노드 셀렉션(node-selection) IP 주소 할당이에요.

노드 셀렉션 IP 주소 관리

노드 셀렉션 기반 IP 주소 할당은 이름 그대로예요. 노드 레이블을 설정하면, Calico가 노드 셀렉터를 사용해 그 노드에 IP 주소를 할당할 때 어떤 IP 풀을 사용할지 결정해요.

모범 사례

노드는 자신을 선택하는 IP 풀에서만 워크로드 주소를 할당해요. 워크로드가 IP를 받지 못해 시작에 실패하는 일을 피하려면, 모든 노드가 최소한 하나의 IP 풀에 의해 선택되도록 보장하는 것이 중요해요.

방법

IP 풀 만들기, 특정 노드 대상

다음 예시에서는 zone=west 레이블이 붙은 노드에만 IP 주소를 할당하는 IP 풀을 만들어요.

apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
  name: zone-west-ippool
spec:
  cidr: 192.168.0.0/24
  ipipMode: Always
  natOutgoing: true
  nodeSelector: zone == "west"

그다음, 노드에 zone=west 레이블을 붙여요. 예를 들면:

kubectl label nodes kube-node-0 zone=west

튜토리얼

이 튜토리얼에서는 두 개의 랙에 걸쳐 네 개의 노드를 가진 클러스터(랙당 노드 2개)를 만들어요.

       -------------------
       |    router       |
       -------------------
       |                 |
---------------   ---------------
| rack-0      |   | rack-1      |
---------------   ---------------
| kube-node-0 |   | kube-node-2 |
- - - - - - - -   - - - - - - - -
| kube-node-1 |   | kube-node-3 |
- - - - - - - -   - - - - - - - -

pod IP 범위 192.168.0.0/16을 사용해 다음 구성을 목표로 해요: 192.168.0.0/24와 192.168.1.0/24 풀을 각각 rack-0, rack-1용으로 예약하는 거죠. 시작해 볼까요.

기본 IP 풀을 맞추지 않은 채 Calico를 설치하면, calicoctl get ippool -o wide 실행 시 Calico가 192.168.0.0/16 기본 IP 풀을 만들었다는 것을 보여줘요:

NAME                  CIDR             NAT    IPIPMODE   DISABLED   SELECTOR
default-ipv4-ippool   192.168.0.0/16   true   Always     false      all()
  1. 기본 IP 풀을 삭제하세요.

    default-ipv4-ippool IP 풀 리소스가 이미 존재하고 /16 블록 전체를 차지하고 있으므로, 먼저 이걸 삭제해야 해요:

    calicoctl delete ippools default-ipv4-ippool
    
  2. 노드에 레이블을 붙이세요.

    특정 노드에 IP 풀을 할당하려면 kubectl label을 사용해 노드에 레이블을 붙여야 해요.

    kubectl label nodes kube-node-0 rack=0
    kubectl label nodes kube-node-1 rack=0
    kubectl label nodes kube-node-2 rack=1
    kubectl label nodes kube-node-3 rack=1
    
  3. 랙마다 IP 풀을 만드세요.

    calicoctl create -f -<<EOF
    apiVersion: projectcalico.org/v3
    kind: IPPool
    metadata:
      name: rack-0-ippool
    spec:
      cidr: 192.168.0.0/24
      ipipMode: Always
      natOutgoing: true
      nodeSelector: rack == "0"
    EOF
    
    calicoctl create -f -<<EOF
    apiVersion: projectcalico.org/v3
    kind: IPPool
    metadata:
      name: rack-1-ippool
    spec:
      cidr: 192.168.1.0/24
      ipipMode: Always
      natOutgoing: true
      nodeSelector: rack == "1"
    EOF
    

    이제 활성화된 IP 풀 두 개가 생겼을 거예요. calicoctl get ippool -o wide로 확인할 수 있어요:

    NAME                  CIDR             NAT    IPIPMODE   DISABLED   SELECTOR
    rack-0-ippool         192.168.0.0/24   true   Always     false      rack == "0"
    rack-1-ippool         192.168.1.0/24   true   Always     false      rack == "1"
    
  4. IP 풀의 노드 셀렉터가 존중되는지 확인하세요.

    각 노드에서 워크로드가 실행되도록 replica 5개짜리 nginx 디플로이먼트를 만들 거예요.

    kubectl run nginx --image nginx --replicas 5
    

    kubectl get pods -owide로 새 워크로드들이 노드가 속한 랙에 할당된 올바른 IP 풀 범위 안의 주소를 받았는지 확인하세요.

    NAME                   READY   STATUS    RESTARTS   AGE    IP             NODE          NOMINATED NODE   READINESS GATES
    nginx-5c7588df-prx4z   1/1     Running   0          6m3s   192.168.0.64   kube-node-0   <none>           <none>
    nginx-5c7588df-s7qw6   1/1     Running   0          6m7s   192.168.0.129  kube-node-1   <none>           <none>
    nginx-5c7588df-w7r7g   1/1     Running   0          6m3s   192.168.1.65   kube-node-2   <none>           <none>
    nginx-5c7588df-62lnf   1/1     Running   0          6m3s   192.168.1.1    kube-node-3   <none>           <none>
    nginx-5c7588df-pnsvv   1/1     Running   0          6m3s   192.168.1.64   kube-node-2   <none>           <none>
    

    워크로드에 할당된 IP 주소의 묶음은 어느 노드에 스케줄됐는지에 따라 달라져요. 또한 각 워크로드에 할당된 주소는 그 워크로드가 실행 중인 랙을 선택하는 해당 IP 풀 범위 안에 들어가요.

SECONDARY: Calico IPAM은 이미 실행 중인 워크로드에 IP 주소를 다시 할당하지 않아요. 새로 설정한 IP 풀의 IP 주소로 실행 중인 워크로드를 업데이트하려면 워크로드를 다시 만들어야 해요. 프로덕션에 들어가기 전이나 유지보수 창(maintenance window) 동안에 하는 것을 권장해요.

추가 리소스

Calico IPAM

더 알아보기 (Learn more)

노드 셀렉터가 붙은 IP 풀은 존·랙·리전 단위로 IP 대역을 묶는 데 딱이에요. 모든 노드가 최소 한 개의 IP 풀에 선택되도록 하는 것이 실패를 막는 핵심이에요. 실행 중인 워크로드에는 주소가 재할당되지 않으니 변경 시점을 잘 계획하세요.