- 가시다님 주관 Kubernetes network 스터디를 진행하고 있었지만, 개인 사유로 인해 스터디를 진행하지 못하게 되어 이번이 마지막 쿠버네티스 네트워크 글이 될 것 같습니다.
(물론 스터디 수행하면서 관련 내용 정리 얘기이며, 다른 글은 꾸준히 올릴 예정입니다.)
- 이번 글은 실습 내용이 없으며, Caclico CNI 개념만 정리할 예정입니다.
1. 개요
Calico가 무엇이며 어떤 역할을 하고 어떻게 동작하는지 확인해본다.
Calico CNI가 파드 to 파드 통신, 외부 통신, 다른 노드 간 파드 to 파드 통신에서 어떻게 동작하는지 확인해본다.
Calico의 네트워크 모드로는 IPIP 모드, Direct 모드, BGP 모드, VXLAN 모드가 있는데 각각 어떻게 설정이 되어 있으며 어떻게 통신 되는지 확인해본다.
Pod 간 통신할 떄 Pod 패킷을 암호화할 수 있는 방법을 확인해본다. (네트워크 레벨)
Calico의 네트워크 접근 통제하는 방법을 확인해본다. (Network Policy)
2. 선수 지식 및 키워드 간단히 알아보기
Calico : 가상머신이나 컨테이너를 위한 네트워킹, IP 관리, 접근 제어, 모니터링 등 다양한 네트워크 관련 기능을 제공하는 오픈소스 프로젝트이다.
(k8s에서 각 Node에 설치되어 각 Pod 간 네트워크 통신이 가능하도록 도와주는 역할을 한다.)
Bird : 오픈소스 소프트웨어 BGP 관련 컴포넌트
Felix : 인터페이스 관리, 라우팅 정보 관리, ACL 관리, 상태 체크 등 다양한 역할을 담당
IPAM(IP Adress Management) : IP 주소 및 도메인 네임 관리, 네트워크 관리 등을 관리하기 위해 컴퓨터 소프트웨어에서 구현된 방법이다.
BGP(Border Gateway Protocol) : AS 끼리 서로 라우팅 경로를 주고 받으며 통신을 가능하게 하는 라우팅 프로토콜 (Inter-Domain Routing Protocol)
proxy ARP : ARP를 대신 해준다는 뜻
=> 라우터 자신이 가지고 있는 ARP 테이블을 이용하여 호스트가 ARP를 요구할 시 대신 라우터 자신의 MAC 주소를 알려주는 기술
3. Calico란?
- Calico 컴포넌트 아키텍처 : https://projectcalico.docs.tigera.io/reference/architecture/overview
[1] Felix : 인터페이스 관리, 라우팅 정보 관리, ACL 관리, 상태 검사
[2] Bird : BGP 프로토콜로 Peer에 라우팅 정보 전파 및 수신 역할
[3] Confd : Calico Global 설정과 BGP 설정 변경 시 Bird에 적용해주는 역할
[4] Datastore Plugin : Calico 설정 정보를 저장하는 곳 (K8S API Datastore 혹은 ETCD 중 선택)
[5] Calico IPAM Plugin : 클러스터 내에서 Pod에 할당할 IP 대역 사용
[6] Calicoctl : Calico 오브젝트를 관리하는 명령어 (Datastore에 접근하여 CRUD 수행)
4. Calico CNI를 사용한 Pod 통신
[1] 동일 노드 간 Pod 통신
동일 노드 간 Pod < - > Pod 통신 ⇒ 내부에서 직접 통신 된다.
[요약]
- iptables에 FORWARD Rule에 Allow 정책이 설정되어 있다.
- calice# 인터페이스에 proxy arp 설정으로 파드에서 바라보는 GW의 MAC 정보를 파드가 전달 받음
- 동일 노드 내에 Pod 간 통신에서는 Tunnel 인터페이스는 관여하지 않는다.
[2] Pod → 외부(인터넷) 통신
Pod에서 외부(인터넷)으로 통신하기 위해서는 해당 노드의 NIC IP 주소로 마스커레이딩이 되어서 외부에 연결이 된다.
[요약]
- calico 기본 설정은 natOutgoing: true
⇒ iptables을 조작하여 MASQUERADE 규칙을 설정함
- calice# 인터페이스에 proxy arp 설정
- 파드와 외부간 직접 통신에서는 tunnel 인터페이스는 관여하지 않는다.
[3] 다른 노드끼리 파드 간 통신
다른 노드끼리 Pod 간 통신에서는 기본값인 IPIP 모드를 통해서 이루어진다.
[요약]
- 각 노드에 Pod 네트워크 대역은 Bird에 의해 BGP로 광고 및 전파가 된다.
- Bird에 의해 광고 및 전파가 되면 Felix에 의해 호스트의 라우팅 테이블에 자동으로 추가, 삭제된다.
- 다른 노드 간의 파드 통신을 tunl0 인터페이스를 통해 IP 헤더에 감싸진다.
- IP 헤더에 감싸진 뒤 상대 노드 tunl0 인터페이스에 도달하면 Outer 헤더를 제거하고 내부 파드와 통신하게 된다.
참고 문서 : https://en.wikipedia.org/wiki/IP_in_IP
5. Calico 네트워크 모드
Calico는 다양한 네트워크 모드를 제공한다.
모드로는 IPIP 모드(기본값), Direct 모드, VXLAN 모드 등이 있다.
Pod 패킷 암호화를 하기 위해서는 Wireg를 사용할 수 있다.
[1] IPIP 모드
노드와 노드 구간에서는 IPIP Encapsulation을 통해 이루어진다.
⇒ 다른 노드 간의 파드 통신은 tunl0 인터페이스를 통해 IP 헤더에 감싸져서 상대측 노드로 도달 후 tunl0 인터페이스에서 Outer 헤더를 제거하고 내부의 파드와 통신
⇒ 다른 노드의 파드 대역은 BGP로 전달 받아 호스트의 라우팅 테이블에 업데이트 된다. (Felix)
[2] Direct 모드
파드 통신 패킷이 출발지 노드의 라우팅 정보를 보고 목적지 노드로 원본 패킷을 그대로 전달
[2 - 1] CrossSubnet 모드
: 노드 간 같은 네트워크 대역은 Direct 모드로, 노드 간 다른 네트워크 대역은 IPIP 모드로 동작한다.
[3] VXLAN 모드
파드 간 통신이 노드 구간에서 VXLAN Encapsulation을 통해서 이루어진다.
⇒ 다른 노드 간 파드 통신이 VXLAN Interface를 통해 L2 Frame이 UDP - VXLAN에 감싸져서 상대측 노드로 도달 후 VXLAN 인터페이스에서 Outer 헤더를 제거하고 내부의 파드와 통신
⇒ BGP 미사용 (VXLAN L3 라우팅을 통해서 동작)
'OS,Network,Container' 카테고리의 다른 글
[Kubernetes] Istio 개념, 아키텍쳐 정리 (0) | 2022.03.28 |
---|---|
[Security] SSO 개념 (SAML, OAuth, OIDC) (2) | 2022.03.25 |
[운영 체제] Segmentation Falut란? 페이징과 세그멘테이션 얕게 이해하기 (0) | 2022.01.28 |
[Kubernetes] Flannel CNI & PAUSE 컨테이너 알아보기 (0) | 2022.01.22 |
[Linux] iptables 정리 (2) | 2022.01.12 |