Calico
개요
CNI 중 하나인데, 아직 깊게 정리는 하지 않는다.
다만 calicoctl에 대해서만 간략하게 정리하고자 남긴다.
원리
아래의 모드에 따라 다르지만, 가장 기본적으로는 BGP를 사용해 파드 간 통신한다.
이를 위해 일단 노드마다 가상 라우터(vRouter)를 만든다.
이러한 컨셉 덕에 외부의 실제 물리 라우터와도 연결해서 사용하는 것이 가능하다.
이 라우터는 데몬셋으로 calico node란 이름으로 실행된다.
컨트롤 플레인에는 calico controller 파드를 둔다.
여기에 추가적으로 패킷을 관리하는 4가지의 모드가 있다.[1]
IPIP
디폴트 모드다.
tunl 인터페이스를 나갈 때 원본 파드 ip 정보를 캡슐화하고, 통신에 사용할 IP로 한번 감싼다.
IP 패킷을 IP로 감싼다 하여 IPIP이다.
Direct
그냥 그대로 보내는 모드.
VXLAN
VXLAN 기술을 사용한다.
2계층을 3계층에서 캡슐화.
4789 UDP 포트로 원본 L2 패킷을 캡슐화시켜서 전송한다.
VLAN을 확장하는 기술이라고만 알고 넘어가겠다.
bgp 프로토콜을 사용하지 않고, felix 컴포넌트가 etcd에서 타 노드의 파드 정보를 가져와 업데이트한다고 한다.
그래서 bird 컴포넌트를 비활성화해야 gksek.
WireGuard
패킷을 암호화한다.
wireg 네트워크 인터페이스가 암호화, 복호화를 한다.
구조
IPAM
칼리코는 또 특이한 것이 자체 IPAM(IP Address Management)을 가진다는 것이다.
그래서 그냥 사용했다간 노드의 ip 대역에 따라 파드가 ip를 받을 알았건만 딴 ip를 받는 것을 보게 될 것이다.
Felix
펠릭스 컴포넌트는 라우팅 테이블과 iptables를 관리한다.
Bird
이 친구가 라우팅 정보를 공유하는 컴포넌트다.
BGP 프로토콜을 사용한다.
인터페이스
이놈은 자체적으로 만드는 네트워크 리소스가 많다.
일단 tunl.
이것은 내부에서 통신할 때만 사용되는 터널 인터페이스로, 호스트 네트워크에서 바로 찾아볼 수 있다.
inet 범위를 보면 ipam에서 설정된 블럭 범위 내에 들어온 게 보인다.
bird 컴포넌트가 만들어낸 라우팅 규칙은 proto가 bird로 써져 있다.
내가 수시로 클러스터를 껐다키다보니 도중에 blackhole을 하나 만든 모양인데, 아무튼 각 노드에 해당하는 파드 주소 범위에 대해서 라우팅이 되는 것이 보인다.
cali 인터페이스
파드가 가상 라우터와 연결되기 위해 생성되는 인터페이스다.
workloadendpoints를 통해 어떤 파드와 연결된 인터페이스 인지 확인할 수도 있다.
통신
같은 노드 내에서는 proxy arp를 해준다.[2]
자신의 대역이 아닌 arp 요청에 대해 응답해주는 라우팅 기능을 말한다..
다른 노드 간 통신에는 tunl 인터페이스를 타고 간다.
calicoctl
칼리코를 조금 더 편하게 다루기 위해 제공하는 툴.
기본적으로는 클러스터 노드에 들어가서 설치를 하는 방식인 듯하다(확실치 않음).
하지만 kubectl에 연결해서 사용하는 것도 가능하다.
별 건 아니고, 그냥 kubectl이 붙은 채로 명령을 할 수 있게 해주는 건데..
그래도 개인적으로는 통일감 있어서 차라리 맘에 든다.
kubectl의 플러그인은 PATH 경로로 kubectl-
이라는 이름이 붙어야 추적이 되니까 참고하자.
curl -L https://github.com/projectcalico/calico/releases/download/v3.29.1/calicoctl-linux-amd64 -o kubectl-calico
chmod +x kubectl-calico
외부에서 사용한다면 노드 관련 상태에 대한 명령어가 잘 동작하지 않는다!
그래서 설치한다면 한 노드 들어가서 설치하는 게 사실 맞다.
관련 문서
이름 | noteType | created |
---|---|---|
Calico | knowledge | 2025-01-08 |