Search

Calico 구조

Tags
k8s
cni
calico
Created
2024/09/13 18:26
Created time
2024/09/13 09:26
category
kubernetes

개요

기존 글에서 설치한 Calico를 기반으로 Calico 내부 구조가 어떠한지 탐색

기본 구조

# calicoctl의 버전 확인 # 출력 구문에서 kdd가 보인다면 이는 ETCD가 아닌 k8s API DataStore를 이용하는 것 calicoctl version # 각 노드 별 calico-node Pod를 확인 kubectl get daemonset -n kube-system kubectl get po -n kube-system -l k8s-app=calico-node -owide # Controller를 확인 kubectl get deploy -n kube-system calico-kube-controllers kubectl get po -n kube-system -l k8s-app=calico-kube-controllers -owide
Shell
복사
Calico는 데몬셋으로 기동되어 각 노드에 calico-node라는 이름의 Pod를 두는 식으로 동작
Calico 자체를 조작하는 Controller Pod는 Deployment로 동작
** calico-node라는 Pod 내부에는 bird, felix, confd가 동작

내부 구조

Calico의 내부 구조는 위 그림과 같은데 Flannel은 기본 IPAM인 host-local IPAM을 이용하지만, Calico는 자체적으로 지원하는 IPAM 플러그인을 이용
calicoctl을 이용하여 Calico 관련 설정을 CRUD 수행 가능
calico-kube-controllers는 Calico의 동작을 감시하는 역할을 담당

이용 흐름

일반적으로 Pod를 생성하면 DataStore를 참고하여 CNI 플러그인과 CNI IPAM 플러그인으로 Pod의 네트워크를 설정
bird로 학습한 네트워크 정보를 felix에 의해 호스트의 라우팅 테이블을 업데이트 하고 IPTABLES 규칙을 설정하는데 Pod 간 통신에서 다른 노드를 경유할 때 해당 정보를 사용

DataStore

Calico가 동작할 수 있도록 데이터가 저장되는 곳인데, ETCD 혹은 k8s API DataStore 등을 선택하여 이용 가능 (기본 값은 k8s API DataStore)

bird

오픈 소스 라우팅 데몬 프로그램으로 BGP 프로토콜을 통해 노드에서 사용하는 Pod IP 주소 대역을 광고하고, 이를 통해 각 노드들은 다른 모든 노드들의 Pod IP 주소 대역을 알게 되어 통신을 가능하게 만듦

felix

bird로 학습한 네트워크 대역을 호스트의 라우팅 테이블에 최종적으로 갱신하는 역할을 담당하고, IPTABLES 규칙을 설정 및 관리 (인터페이스, 라우팅, ACL 등 관리)

confd

오픈 소스 경량 설정 변경 관리 프로그램으로 BGP 설정 등으로 DataStore에 변경 발생 시, bird에서 사용할 변경된 설정 파일을 만들고 이를 적용하는 역할을 담당

Typha

Typha가 없는 경우 DataStore는 각 노드에 구성된 felix,confd 등과 다수의 연결이 필요한데, Typha 적용 시 DataStore는 단일로 Typha만 연결하여 관리 포인트가 줄고 상태 캐시 이벤트 중복 제거 등으로 대규모 환경에서 부하를 감소 (기본적으로 설치는 되지만 이용하도록 설정되어 있지는 않음)

IPAM

IP 주소 할당 방식이 아래와 같이 여러 방법으로 정의될 수 있는데, 기재된 순서대로 적용 우선 순위를 가짐
1.
Kubernetes Annotations
2.
CNI Configuration
3.
IP Pool Node Selectors
Calico IPAM은 Workload에 이미 할당된 IP 주소를 재할당하지는 않음
새로 구성된 설정으로 IP 주소를 재할당하려면 새로 Workload를 생성 필요
** 이와 같읕 과정은 프로덕션 배포 이전에 하는 것을 권장

Kubernetes Annotations

# 노드 별 Pod IP 주소 대역 echo $(kubectl get no -o jsonpath='{.items[*].spec.podCIDR}') # 마스터 노드의 Pod IP 주소 대역 kubectl get no k8s-m -o json | jq '.spec.podCIDR'
Shell
복사

CNI Configuration (Calico IPAM)

# Calico IPAM 정보 확인으로 Pod IP 주소 할당 대역 확인 calicoctl ipam show # Block는 각 노드 별로 할당된 podCIDR 정보 calicoctl ipam show --show-blocks calicoctl ipam show --show-borrowed calicoctl ipam show --show-configuration
Shell
복사
# Calico 설정 파일 조회 tree /etc/cni/net.d/ cat /etc/cni/net.d/10-calico.conflist | jq # Calico의 DataStore는 쿠버네티스 API를 사용 # "datastore_type": "kubernetes", # "ipam": { # IPAM은 Calico 자체 IPAM을 사용 # "type": "calico-ipam" # },
Shell
복사

IP Pool Node Selectors

# calicoctl을 이용하여 node 정보 확인 calicoctl node status calicoctl node checksystem # ippool 정보 확인 # 클러스터가 사용하는 IP 대역 정보와 Calico 모드 정보 확인 calicoctl get ippool -o wide # Pod와 서비스 사용 네트워크 대역 정보 확인 kubectl cluster-info dump | grep -m 2 -E "cluster-cidr|service-cluster-ip-range" kubectl get cm -n kube-system kubeadm-config -oyaml | grep -i subnet # Pod의 endpoint 정보 확인 # workload는 Pod 이름 # 어떤 노드에 배포되었고 IP 와 cali 인터페이스와 연결되었는지 확인 calicoctl get workloadEndpoint calicoctl get workloadEndpoint -A calicoctl get workloadEndpoint -o wide -A
Shell
복사