개요
기존 글에서 설치한 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
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
복사