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 주소를 가진 호스트 인터페이스
- 서브넷을 넘나드는 패킷 캡슐화 변경
- 호스트 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"}}}'
추가 리소스
- 자동 감지 방식의 자세한 내용은 노드 구성 레퍼런스를 참고하세요.
- calicoctl 환경 변수는 calico/node 구성하기를 참고하세요.
- Node 리소스
- calicoctl patch 레퍼런스 문서
더 알아보기 (Learn more)
first-found는 간단하지만 여러 NIC가 있는 호스트에서 엉뚱한 인터페이스를 고를 수 있으니, 설치 후 calicoctl get node로 감지 결과를 꼭 확인하세요. 환경 변수와 Node 리소스 중 어느 쪽이 이기는지는 위 동기화 표에 정리되어 있어요. IPv6를 함께 쓴다면 nodeAddressAutodetectionV6 설정도 잊지 마세요.