Search

Calico 네트워크 모드와 정책

Tags
k8s
cni
calico
Created
2024/09/14 12:00
Created time
2024/09/14 02:59
category
kubernetes

개요

Calico는 Flannel과 달리 보다 다양한 기능을 제공하고, 이에 따라 여러 네트워크 통신 방법을 지원
** Calico와 Cilium은 Pod 단위 및 네임스페이스 단위에서 IN/OUT 트래픽 제어가 가능
Calico에서의 네트워크 모드와 정책에 대한 개념을 학습

네트워크 모드

IPIP

노드에서 노드로 통신 시 tunl0 인터페이스를 통해 IP 헤더에 IPIP 캡슐화하여 패킷을 전달하는 방식

Direct

출발지 노드의 라우팅 정보를 확인하여, 목적지 노드로 원본 패킷을 그대로 전달하는 방식
** ippool의 ipipMode: Never로 설정하여 이용

BGP 연동

IDC에서 사용하는 내부망 네트워크 대역과 k8s에서 사용하는 클러스터 네트워크 대역 간 BGP로 네트워크 대역을 전파할 수 있도록 직접 통신을 지원하는 방식
** 기존 네트워크로 직접 통신을 위해 NAT를 사용하지 않도록 ippool의 natOutgoing: false로 설정
** Calico에 BGPPeer 리소스 생성하여 IDC 라우터와 BGP 연동되도록 설정
** 별도 ippool을 생성하고 이를 기본으로 이용하는 네임스페이스를 추가 구성하면, 편리하게 IP 주소 대역을 관리 가능

VXLAN

BGP를 사용하지 않으며, vxlan 인터페이스를 거치면서 IPIP와 같이 캡슐화를 거치는 방식
** VXLAN 모드 이용을 위해선 ippool의 ipipMode: Never 및 vxlanMode: Always 설정이 필요

패킷 암호화

Calico는 오픈 소스 VPN 프로젝트인 WireGuard를 이용한 터널을 자동 생성하여 Pod 간 통신에서의 트래픽을 암호화된 전달 방식을 지원
** WireGuard는 간결한 코드와 빠른 성능이 특징으로, 모든 기능이 커널에서 동작하고 주요 암호화 알고리즘이 병렬처리
** WireGuard 설정을 위해선 패키지 설치가 필요하고, felixconfiguration의 wireguardEnabled: true로 설정 필요

네트워크 정책

네트워크 정책은 쿠버네티스 클러스터 내부에서 통신 시 트래픽 규칙을 규정
기본적으로 클러스터 내부의 모든 Pod들은 통신이 가능하지만, 트래픽 규칙을 정하면 네임스페이스 단위의 통신 제어 가능
예를 들어 모든 Pod 간 통신을 차단하고 화이트리스트만 허용하는 식이 가능한데, CNI에서 이를 지원하도록 설정이 필요
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: sample-networkpolicy # 보안 정책을 생성할 네임스페이스 지정 namespace: default spec: podSelector: # 설정할 대상 Pod를 여기에 기입 # labelSelector이므로 복수의 Pod 지정 가능 policyTypes: - Ingress # 인그레이스 룰을 생성하는 경우 명시 - Egress # 이그레스 룰을 생성할 경우 명시 ingress: - from: # 인그레스 규칙을 정의 ports: # 인그레스에서 허가할 수신 포트 번호와 프로토콜 기입 egress: - to: # 이그레스 규칙을 정의 ports: # 이그레스에서 허가할 송신 포트 번호와 프로토콜 기입
YAML
복사
설정 범위는 podSelector를 이용하고, 정책은 네임스페이스 별로 생성 필요
정책 단위는 Ingress / Egress로 나뉘고, 각각 인바운드와 아웃바운드의 규칙을 설정
Ingress / Egress의 정책 지정 방식은 3가지로 podSelector, namespaceSelector, ipBlock으로 나뉨
podSelector → 특정 Pod의 통신을 제어
namespaceSelector → 특정 네임스페이스에 속한 Pod의 통신을 제어
ipBlock → CIDR을 이용한 통신 제어
** 클러스터 내부 통신 제어는 podSelector, namespaceSelector를 이용하고, 외부 통신 제어는 ipBlock을 이용

모두 차단

apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: deny-all-networkpolicy spec: podSelector: {} policyTypes: - Ingress - Egress
YAML
복사

모두 허용

apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-all-networkpolicy spec: podSelector: {} egress: - {} ingress: - {} policyTypes: - Ingress - Egress
YAML
복사

둘 중 하나만 허용

apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: cloud-networkpolicy spec: podSelector: {} egress: - {} policyTypes: - Ingress - Egress
YAML
복사

참고

네트워크 모드의 실습은 여기에서 구체적으로 정리되어 있음