개요
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 설정이 필요
패킷 암호화
** 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
복사