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

IP 자동 감지 구성하기

원문 보기 위키 갱신

Calico 노드의 IP 자동 감지(IP autodetection)를 구성해서 라우팅에 올바른 IP 주소가 쓰이도록 만드는 방법을 다뤄요. first-found, Kubernetes 내부 IP, 인터페이스 정규식, CIDR, skip-interface 같은 감지 방식 선택부터 노드 리소스로 IP와 서브넷을 수동 구성하는 절차까지 정리했어요. 멀티 NIC 호스트나 여러 IP가 있는 인터페이스 환경이라면 꼭 확인할 문서예요.

출처: 문서

본문

큰 그림

라우팅에 올바른 IP 주소가 쓰이도록 Calico 노드의 IP 자동 감지를 구성해요.

가치

노드에 Calico를 설치하면 IP 주소와 서브넷이 자동으로 감지돼요. Calico는 IP/서브넷 자동 감지를 구성하는 여러 방법을 제공하고, 다음 경우에 특정 IP를 지정할 수 있게 지원해요.

개념

노드 IP 주소와 서브넷 자동 감지

노드 간 라우팅을 위해 각 Calico 노드에는 IPv4 주소와/또는 IPv6 주소가 구성되어야 해요. 노드에 Calico를 설치하면 호스트에서 감지한 라우팅 정보를 바탕으로 노드 리소스가 자동 생성돼요. 배포 형태에 따라 자동 감지를 업데이트해서 노드가 올바른 IP 주소를 갖게 만들고 싶을 수 있어요.

설치 후 기본 노드 리소스 샘플

apiVersion: projectcalico.org/v3
kind: Node
metadata:
  name: node-hostname
spec:
  bgp:
    asNumber: 64512
    ipv4Address: 10.244.0.1/24
    ipv6Address: 2000:db8:85a3::8a2e:370:7335/120
    ipv4IPIPTunnelAddr: 192.168.0.1

자동 감지 방식

기본적으로 Calico는 first-found 방식을 사용해요. 첫 번째 인터페이스(docker bridge 같은 로컬 인터페이스 제외)에서 첫 번째 유효한 IP 주소를 고르는 방식이에요. 하지만 기본 방식을 다음 중 하나로 바꿀 수 있어요.

  • Kubernetes 노드에 할당된 주소 (kubernetes-internal-ip)
  • 노드가 특정 IP나 도메인에 도달할 때 쓰는 주소 (can-reach)
  • 매칭되는 인터페이스를 포함하는 정규식 (interface)
  • 매칭되는 인터페이스를 제외하는 정규식 (skip-interface)
  • 노드에서 고를 유효한 IP 주소를 판단할 CIDR 형식의 IP 범위 목록 (cidrs)

자동 감지 방식에 대한 자세한 내용은 노드 구성 레퍼런스를 참고하세요.

방법

자동 감지 방식 바꾸기

탭: Operator

앞서 말했듯이 기본 자동 감지 방식은 첫 번째 유효한 인터페이스 발견(first-found)이에요. 다른 자동 감지 방식을 쓰려면 기본 Installation 커스텀 리소스를 편집해서 방식을 지정하세요. 지원되는 자동 감지 방식의 예제는 아래와 같아요.

SECONDARY: 아래 방식 중 어떤 것이든 IPv6의 기본 자동 감지 방식을 구성하려면 nodeAddressAutodetectionV6 필드를 사용하세요.

  • Kubernetes 노드 IP

    Calico는 Kubernetes 노드의 Status.Addresses 필드에 나열된 첫 번째 내부 IP 주소를 선택해요.

    kind: Installation
    apiVersion: operator.tigera.io/v1
    metadata:
      name: default
    spec:
      calicoNetwork:
        nodeAddressAutodetectionV4:
          kubernetes: NodeInternalIP
    
  • IP 또는 도메인에 도달할 때 쓰는 소스 주소

    Calico는 주어진 "도달 가능(can reach)" IP 주소나 도메인에 도달할 때 쓰이는 IP 주소를 선택해요. 예를 들면 다음과 같아요.

    kind: Installation
    apiVersion: operator.tigera.io/v1
    metadata:
      name: default
    spec:
      calicoNetwork:
        nodeAddressAutodetectionV4:
          canReach: 8.8.8.8
    
  • 매칭되는 인터페이스 포함

    Calico는 주어진 정규식에 매칭되는 인터페이스에서 각 노드의 주소를 선택해요. 예를 들면 다음과 같아요.

    kind: Installation
    apiVersion: operator.tigera.io/v1
    metadata:
      name: default
    spec:
      calicoNetwork:
        nodeAddressAutodetectionV4:
          interface: eth.*
    
  • 매칭되는 인터페이스 제외

    Calico는 주어진 정규식에 매칭되지 않는 인터페이스에서 각 노드의 주소를 선택해요. 예를 들면 다음과 같아요.

    kind: Installation
    apiVersion: operator.tigera.io/v1
    metadata:
      name: default
    spec:
      calicoNetwork:
        nodeAddressAutodetectionV4:
          skipInterface: eth.*
    
  • CIDR 포함

    Calico는 주어진 CIDR에 속한 노드의 IP 주소를 선택해요. 예를 들면 다음과 같아요.

    kind: Installation
    apiVersion: operator.tigera.io/v1
    metadata:
      name: default
    spec:
      calicoNetwork:
        nodeAddressAutodetectionV4:
          cidrs:
            - '192.168.200.0/24'
    

탭: Manifest

앞서 말했듯이 기본 자동 감지 방식은 첫 번째 유효한 인터페이스 발견(first-found)이에요. 다른 자동 감지 방식을 쓰려면 다음 kubectl set env 커맨드로 방식을 지정하세요.

  • IPv4

    kubectl set env daemonset/calico-node -n kube-system IP_AUTODETECTION_METHOD=<autodetection-method>
    
  • IPv6

    kubectl set env daemonset/calico-node -n kube-system IP6_AUTODETECTION_METHOD=<autodetection-method>
    

자동 감지 방식은 다음을 기준으로 해요.

  • Kubernetes 노드 IP

    Calico는 Kubernetes 노드의 Status.Addresses 필드에 나열된 첫 번째 내부 IP 주소를 선택해요.

    kubectl set env daemonset/calico-node -n kube-system IP_AUTODETECTION_METHOD=kubernetes-internal-ip
    
  • IP 또는 도메인에 도달할 때 쓰는 소스 주소

    Calico는 주어진 "도달 가능(can reach)" IP 주소나 도메인에 도달할 때 쓰이는 IP 주소를 선택해요. 예를 들면 다음과 같아요.

    kubectl set env daemonset/calico-node -n kube-system IP_AUTODETECTION_METHOD=can-reach=www.google.com
    
  • 매칭되는 인터페이스 포함

    Calico는 주어진 정규식에 매칭되는 인터페이스에서 각 노드의 주소를 선택해요. 예를 들면 다음과 같아요.

    kubectl set env daemonset/calico-node -n kube-system IP_AUTODETECTION_METHOD=interface=eth.*
    
  • 매칭되는 인터페이스 제외

    Calico는 주어진 정규식에 매칭되지 않는 인터페이스에서 각 노드의 주소를 선택해요. 예를 들면 다음과 같아요.

    kubectl set env daemonset/calico-node -n kube-system IP_AUTODETECTION_METHOD=skip-interface=eth.*
    
  • CIDR 포함

    Calico는 주어진 CIDR에 속한 노드의 IP 주소를 선택해요. 예를 들면 다음과 같아요.

    kubectl set env daemonset/calico-node -n kube-system IP_AUTODETECTION_METHOD=cidr=192.168.200.0/24,172.15.0.0/24
    

노드의 IP 주소와 서브넷 수동 구성하기

다음 시나리오에서는 특정 IP와 서브넷을 직접 구성하고 싶을 수 있어요.

  • 외부 인터페이스가 여러 개인 호스트
  • 여러 IP 주소를 가진 호스트 인터페이스
  • 서브넷을 넘나드는 패킷 캡슐화 변경
  • 호스트 IP 주소 변경

탭: Operator

IP 자동 감지를 끈 다음 Node 리소스를 업데이트하면 노드에 특정 IP 주소와 서브넷을 구성할 수 있어요.

자동 감지 끄기

자동 감지 방식을 끄려면 Installation 리소스에서 해당 NodeAddressAutodetection 필드를 업데이트하세요.

apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
  name: default
spec:
  calicoNetwork:
    nodeAddressAutodetectionV4: {}
    nodeAddressAutodetectionV6: {}

Node 리소스로 IP와 서브넷 구성하기

Node 리소스에 IP 주소와 서브넷을 구성할 수 있어요.

calicoctl patch로 현재 노드 구성을 업데이트하세요. 예를 들면 다음과 같아요.

calicoctl patch node kind-control-plane \
  --patch='{"spec":{"bgp": {"ipv4Address": "10.0.2.10/24", "ipv6Address": "fd80:24e2:f998:72d6::/120"}}}'

탭: Manifest

환경 변수를 쓰거나 Node 리소스를 업데이트해서 노드에 특정 IP 주소와 서브넷을 구성할 수 있어요. IP 주소와 서브넷을 환경 변수로도 Node 리소스로도 구성할 수 있기 때문에, 값이 어떻게 동기화되는지는 다음 표를 참고하세요.

이 환경 변수가... 다음 상태이면... 그러면...
IP/IP6 명시적으로 설정됨 지정한 값이 사용되고, Node 리소스가 업데이트돼요.
autodetect로 설정됨 요청한 방식(first-found, can-reach, interface, skip-interface, kubernetes-internal-ip)이 사용되고, Node 리소스가 업데이트돼요.
설정되지 않음, 그러나 Node 리소스에 IP/IP6 값이 있음 Node 리소스의 값이 사용돼요.
IP 설정되지 않음, 그리고 Node 리소스에 IP 값이 없음 IPv4 주소와 서브넷을 자동 감지하고, Node 리소스를 업데이트해요.
IP6 설정되지 않음, 그리고 Node 리소스에 IP6 값이 없음 노드에서 IPv6 라우팅을 수행하지 않아요.

환경 변수로 IP와 서브넷 구성하기

환경 변수로 IP와 서브넷 값을 구성하려면 kubectl set env 커맨드를 사용하세요. 예를 들면 다음과 같아요.

kubectl set env daemonset/calico-node -n kube-system IP=10.0.2.10/24 IP6=fd80:24e2:f998:72d6::/120

SECONDARY: 서브넷을 생략하면 기본값은 /32(IPv4)와 /128(IPv6)이에요. IP 주소를 지정할 때는 명확성을 위해 서브넷 정보를 함께 넣기를 권장해요.

Node 리소스로 IP와 서브넷 구성하기

Node 리소스에 IP 주소와 서브넷을 구성할 수도 있어요.

SECONDARY: Node 리소스에 IP 주소를 구성할 때는 노드의 IP 주소 옵션이나 환경 변수를 끄는 게 좋을 수 있어요. 컨테이너의 IP 옵션이 우선하기 때문에 Node 리소스에 구성한 값을 덮어써버려요.

calicoctl patch로 현재 노드 구성을 업데이트하세요. 예를 들면 다음과 같아요.

calicoctl patch node kind-control-plane \
  --patch='{"spec":{"bgp": {"ipv4Address": "10.0.2.10/24", "ipv6Address": "fd80:24e2:f998:72d6::/120"}}}'

추가 리소스

더 알아보기 (Learn more)

first-found는 간단하지만 여러 NIC가 있는 호스트에서 엉뚱한 인터페이스를 고를 수 있으니, 설치 후 calicoctl get node로 감지 결과를 꼭 확인하세요. 환경 변수와 Node 리소스 중 어느 쪽이 이기는지는 위 동기화 표에 정리되어 있어요. IPv6를 함께 쓴다면 nodeAddressAutodetectionV6 설정도 잊지 마세요.