Calico CNI

Uk·2024년 9월 21일
0

Calico CNI

쿠버네티스 플랫폼을 포함하여 다양한 플랫폼에서 워크로드의 네트워크 통신과 네트워크 보안 기능을 제공

쿠버네티스 CNI를 준수하여, 파드를 위한 네트워크 통신 환경을 마련

Calico Components

  • 칼리코 데이터 저장소
    칼리코 동작을 위한 데이터를 저장하는 곳,
    kubernetes API 저장소(기본값) / etcd
  • BIRD
    라우팅 데몬 프로그램
    해당 노드의 파드 네트워크 대역을(podCIDR) BGP 라우팅 프로토콜을 통해 광고
  • Felix
    BIRD로 학습한 상대방 노드 파드 네트워크 대역을 호스트의 라우팅 테이블에 최종적으로 업데이트하는 역할, IPtables 규칙 설정 관리
  • Confd
    BGP 설정 등으로 칼리코 데이터저장소에 변경이 발생하면 BIRD의 변경된 설정 파일을 만들고 반영
  • Calico IPAM(IP Address Management)
    클러스터 내에서 파드에 할당할 IP 대역

Pod ↔ Pod 통신

  • iptables FORWARD Rule 에 허용
  • calice# 인터페이스에 proxy arp 설정으로 게이트웨이의 MAC 정보를 전달
  • tunnel 인터페이스는 미 관여

파드가 없는 노드 정보

  • 파드 2개 생성 이후

  • calice#~ 2개 추가, 각각 net ns 0, 1로 호스트와 구별됨
  • pause 컨테이너가 각각 파드별로 생성됨
  • 호스팅 라우팅 대역이 라우팅 테이블에 추가됨

직접 파드에 쉘 접속 후 확인해봤을 때, 네트워크 인터페이스인 calice#~ 와 veth 연결이 돼 있으며 IP는 32bit 서브넷을 가진다.
ARP 정보는 현재 아무것도 없다.

⇒ ARP를 통해 MAC 주소를 알려주는 모습

Pod → 외부(인터넷)

⇒ 터널을 통하진 않는다.

iptables -n -t nat --list cali-nat-outgoing

src가 cali40masq-ipam-pools 에 매칭되고, dst에서 매칭 되지 않는 것은 MARSQUERADE를 통하여 통신 (외부 통신)

실제로 외부 통신 실행

MASQUERADE pkts 증가하는 모습!

calicoctl get ippool default-ipv4-ippool -o yaml | sed -e "s/natOutgoing: true/natOutgoing: false/" | calicoctl apply -f -

⇒ 위와 같이 natOutgoing을 false로 한다면 외부 통신 불가능!

다른 노드의 Pod ↔ Pod 통신

  • 각 노드에 파드 네트워크 대역은 Bird에 의해 BGP로 광고 전파 / 전달되며, Felix에 의해 호스트의 라우팅 테이블에 자동으로 추가 및 삭제
  • IPIP - tunnel에서 overlay 패킷 구조를 만들어 통신이 이뤄진다. (다른 노드 간의 파드 통신은 tunl0 인터페이스를 통해 IP 헤더에 감싸져서 상대측 노드로 도달 후 tunl0 인터페이스에서 Outer 헤더를 제거하고 내부의 파드와 통신)

파드 생성 후 현재 상태
watch -d 'ifconfig tunl0 | head -2 ; ifconfig tunl0 | grep bytes’
tcpdump -i tunl0 -nn

⇒ 터널 인터페이스에 파드간 IP 패킷 정보 확인

  • ipip (protocol 4번)에 대한 패킷 덤프
    tcpdump -i ens5 -nn proto 4

Calico 네트워크 모드

  • Calico 라우팅 모드

IPIP 모드

노드와 노드 구간 파드 간 통신이 IPIP encapsulation을 통해 이루어진다.

  • 다른 노드 간의 파드 통신은 tunl0 인터페이스를 통해 IP 헤더에 감싸져서 상대측 노드로 도달 후 tunl0 인터페이스에서 Outer 헤더를 제거하고 내부의 파드와 통신
  • 다른 노드의 파드 대역은 BGP로 전달 받아 호스트 라우팅 테이블에 업데이트

⇒ 앞서 실습했던 모드.

Direct 모드

  • 클라우드 사업자 네트워크의 경우 NIC 에 매칭되지 않는 IP 패킷은 차단되니, NIC에 Source/Destination Check 기능을 Disable
    ⇒ 노드에서 출발하는 IP와 라우팅 테이블에 IP가 다르므로 차단됨.

calicoctl get ippool default-ipv4-ippool -o yaml | sed -e "s/ipipMode: Always/ipipMode: Never/" | calicoctl apply -f -

⇒ 상대방 ip와 통신할 때 tunl0 인터페이스였으나 사라지고 ens5로 변경
⇒ 다른 대역대인 worker-node0와 통신시 실패!

⇒ 네트워크 간 라우터가 존재, 하지만 라우팅 테이블에 정보가 없다.
⇒ 되게 하는 법은, 네트워크 팀이 이걸 다 라우팅을 해줘야한다.

  • CrossSubnet 모드
    노드 간 같은 네트워크 대역 ⇒ Direct Mode
    노드 간 다른 네트워크 대역 ⇒ IPIP Mode
    calicoctl patch ippool default-ipv4-ippool -p '{"spec":{"ipipMode":"CrossSubnet"}}’

Pod 패킷 암호화

  • WireGuard 터널을 자동 생성 및 파드 트래픽을 암호화하여 노드간 전달
    calicoctl patch felixconfiguration default --type='merge' -p '{"spec":{"wireguardEnabled":true}}'

0개의 댓글