반갑습니다. 저는|기업가이자, 엔지니어입니다.
K8s 의 Calico CNI 에 대해

K8s 의 Calico CNI 에 대해

Tags
k8s
Network
Published
발행일 - 2022년 8월 11일
Author
Eugene Jeon (전유진)
AuthorLink

개요

K8s 를 구축하면서 성능이 좋다는 Calico 를 사용했었다.
사용하면서 조금 더 자세히 알 필요가 있어서 학습을 해보았다.
 

CNI

CNI; Container Network Interface CNCF (Cloud Native Computing Foundation) 의 프로젝트

K8s CNI

아래 문서를 확인해 보면, 다양한 CNI 3rd-party 가 존재하고 있다는 것을 알 수 있다.
 
K8s CNI 는 K8s 의 core component 에 속하지 않으며, 애드온으로 분류된다. CNI 는 컨테이너의 네트워크를 구성하고, 호스트의 bridge 와 컨테이너 사이에 veth (Virtual Ethernet Interface) 를 연결하여 각 네트워크 인터페이스마다 대역에 맞는 IP를 할당하는 작업을 수행한다.
 
그리고 K8s CNI 는 다음 4가지 네트워크 문제를 해결해야 한다.
 
  1. 고도로 결합된 Container 사이의 통신 - pod 와 localhost 로 해결
  1. Pod 사이의 통신
  1. Pod 와 Service 사이의 통신
  1. 외부와 Service 사이의 통신
 
그리고 다음과 같은 기준 하에 동작해야 한다.
 
  1. Node 가 달라도 Pod to Pod 사이에서 NAT 없이 통신이 가능해야 한다.
  1. Node 의 agent (system daemons, kubelet) 는 하위 모든 Pod 과 통신이 가능해야 한다.
  1. Node 의 host network 에 있는 Pod 은 NAT 없이 모든 Node 의 Pod 과 통신이 가능해야 한다.
  1. Service Cluster IP 대역은 각 Node 에 할당된 Pod 의 IP 대역과 겹치지 않아야 한다. (IPAM 에 의해 제어됨)
 

Calico

 

Architecture

notion image
아래 문서에서 확인할 수 있는 calico component 의 architecture 이다.
 
[1] Datastore 와 [2] Calico Pods 를 주요 구성요소로 살펴본다.
 
  • Felix : 인터페이스 관리, 라우팅 정보 관리, ACL 관리, 상태 체크
  • BIRD : 오픈소스 라우팅 데몬으로 BGP Peer 에 라우팅 정보 전파 및 수신, BGP RR (Route Reflector)
  • Confd : 경량의 configuration management 를 위한 오픈소스 도구로 calico 설정, BGP 설정 변경 시 트리거 되어 BIRD 에 적용하는 역할을 함
  • Datastore plugin : calico 설정 정보를 저장하는 곳, etcd 또는 K8s API datastore (kdd) 가 이용됨
  • Calico IPAM plugin : 클러스터 내에서 Pod 에 할당할 IP 대역을 지정
  • calico-kube-controllers : calico 동작 감시
  • calicoctl : calico 오브젝트를 CRUD 하는 역할, datastore 에 접근이 가능함
  • BGP (Border Gateway Protocol) : AS 사이에서 이용되는 라우팅 프로토콜, 대규모 네트워크에 대응되도록 설계됨. 물리적인 라우터와도 연동이 가능함. (Flannel 의 경우, vxlan 로 연결하기 때문에 불가능)
  • AS (Autonomous System) : 하나의 정책을 바탕으로 관리되는 네트워크-자율시스템
 
notion image
  • 데몬셋으로 calico-node pod 이 생성되어, bird, felix, confd 등이 동작한다.
  • Calico Controller Pod 은 deplooyment 로 생성된다.
  • BIRD 가 BGP 프로토콜을 이용하여 Pod IP 대역을 전파한다.
  • 전파된 정보는 Felix 가 리눅스 라우팅 테이블에 추가하고, iptable rules 를 조정한다.
  • Confd 는 Datastore 로 지정된 저장소를 모니터링하고 있다가 값의 변경이 발생하면 트리거되어 정보를 갱신한다.
 

💡 Felix 가 변경한 iptables 를 확인하고 싶다면, 아래 명령어를 입력해보면 된다.
(bash)
sudo iptables -t filter -S | grep cali
(bash)
sudo iptables -t nat -S | grep cali

 

Install calicoctl

관리를 위해 Calico CLI 설치한다.
(bash)
curl -L https://github.com/projectcalico/calico/releases/download/v3.23.3/calicoctl-linux-amd64 -o calicoctl
 
IPAM 정보를 확인
(bash)
calicoctl ipam show
 
BGP 상태 확인
(bash)
calicoctl node status
 
ippool 정보 확인
(bash)
calicoctl get ippool -o wide
 

Network 동작 원리

 

동일 Node 내에 존재하는 Pod 사이의 통신

내부에서 직접 통신한다.
notion image
 

Pod 에서 외부 인터넷으로 통신

Node 의 Network Interface IP 로 출발지 IP가 변경(MASQUERADE)되고 외부와의 통신이 이루어 진다.
notion image
 

다른 Node 에 존재하는 Pod 사이의 통신

IPIP 모드 (default; 기본값) 로 통신이 이루어 진다. → 각 Node 에 Pod 네트워크 대역은 BIRD 에 의해서 BGP 로 전파되며, Felix 에 의해서 라우팅 테이블이 갱신된다. → tunl0 인터페이스를 통해 IP 헤더에 랩핑되어 다른 노드로 정보를 전달하고, tunl0 인터페이스에 의해 랩핑되었던 헤더를 제거하고 내부 Pod 으로 정보가 전달된다.
notion image
 

Network Modes

Calico 는 다양한 네트워크 통신 방법을 제공한다.
 

IPIP

서로 다른 Node 사이의 Pod 통신인 경우, IPIP 캡슐화를 통해 통신이 이루어진다. 단, Azure 와 같은 Cloud 를 사용할 경우, IPIP 통신이 불가능하기 때문에 VXLAN 모드를 사용한다.
notion image
 

Direct

출발지 Node 의 라우팅 정보를 보고 목적지 Node 로 원본 패킷 그대로를 전달한다. 단, Cloud Network 를 사용할 경우, NIC 에 매칭되지 않는 IP 매킷은 차단된다. 그래서 NIC 의 Source/Destination Check 기능을 비활성화 해야 정상적인 통신이 가능하다. 👉 AWS 를 사용할 경우, 이 글을 참고하자.
notion image
 

VXLAN

서로 다른 Node 사이의 Pod 통신인 경우, VXLAN 캡슐화를 통해 통신이 이루어진다. BGP는 사용하지 않으며, XVLAN L3 라우팅을 통해서 동작한다. UDP 를 사용하므로, Azure 와 같은 Cloud 네트워크에서도 사용이 가능하다.
notion image
 

참고사항

BGP 연동

K8s Cluster 내부 네트워크와 IDC 내부망 네트워크 사이에 직접 라우팅이 가능하다.
💡
이미지 출처 - 구글
notion image
 

Pod 패킷 암호화

WireGuard 터널을 자동으로 생성하고 Pod 트래픽을 암호화하여 Node 사이에서 정보를 전달한다. YAML 파일로 간단하게 네트워크 레벨의 패킷 암호화를 설정할 수 있다. → tunnel 대신 wireg 를 거친다.
 

WireGuard

IPsec 및 OpenVPN 의 대항마로 등장한 오픈소스 VPN 프로젝트이다. Linux 5.6 커널에 WireGuard 1.0.0 이 기본 패키지로 구성되면서 많이 사용하는 도구가 되었다. 모든 동작이 Kernel 에서 이루어지며, 주요 알고리즘에 대해 병렬 처리가 되어 빠른 속도를 자랑한다.

Loading Comments...