K8s/Calico
Calico 기본통신 이해
식사법
2024. 9. 20. 13:38
Calico 기본 통신 이해
1. Calico CNI 란?
쿠버네티스 워크로드와 비쿠버네티스 및 레가시 환경의 워크로드 간 안전하고 유기적인 통신을 가능케 하는 tigera 사의 네트워크 보안 솔루션
- CNI(Container Network Interface) 표준을 준수하므로, 쿠버네티스의 오버레이 네트워크 플러그인으로 사용가능하며, 다양한 모드(IPIP, VXLAN, Direct)를 지원합니다.
1. Calico의 구성요소
- Tiger Calico official 발췌
구성이 굉장히 복잡해보이나, 잘 이해해야하는 컴포넌트는 다음과 같습니다.
- calicoctl : Calico의 라이프 사이클 제어를 위해 사용하는 커맨드라인으로, kubectl로도 가능하나 모니터링과 상태 확인 및 변경에 용이하므로 설치하는게 좋습니다.
- calico data저장소 : 기본적인 쿠버네티스 api 저장소에 저장됩니다
- calico-node : 개별 노드에 위치하는 데몬셋으로 하부 3개요소 포함
- BIRD : OSS 라우팅 프로그램입니다. 해당 노드의 파드 대역을 BGP(Border Gateway Protocol) 프로토콜을 통해서 광고합니다. BGP 사용시 수기로 다른 AS의 정보를 지정해야하나, 이것이 어느정도 자동화되는것으로 보입니다.
- Felix : BIRD 에서 확인된 k8s 내부 노드들의 네트워크 대역을, 라우팅 테이블에 제어하는 역할을 수행합니다. BIRD에서 게시된 정보를 토대로, Felix가 실제 경로를 만든다 정도로 이해하면 되겠습니다.(iptable 활용)
- confd : 직접적으로 calico의 네트워킹과 관련있는것은 아니지만, 설정이 변경되면 설정 파일을 만들고 반영하는 보조적인 역할을 수행합니다.
calico의 구성 및 구성 요소 확인
1)k3d cluster 생성 (k3d는 기본적으로 CNI가 제공되므로 이를 disable 해줍니다. )
export clustername=gasidaCluster
k3d cluster create "${clustername}" \
--k3s-arg '--flannel-backend=none@server:*' \
--k3s-arg '--disable=traefik@server:*' \
--k3s-arg '--cluster-cidr=10.42.0.0/16@server:*' \
--k3s-arg '--disable=traefik' \
--k3s-arg '--service-cidr=10.43.0.0/16@server:*' \
--agents 3 \
--volume /var/lib/kubelet:/var/lib/kubelet:shared
2)calico 설치 (tigera operator 활용)
kubectl create -f https://docs.projectcalico.org/manifests/tigera-operator.yaml
kubectl create -f https://docs.projectcalico.org/manifests/custom-resources.yaml
상기 그대로 적용해도 동작하나, 구체적인 설정 변경 및 확인을 위해 로컬에 다운로드 합니다.
# tigera operator : calico의 설정과 관리를 위한 CRD의 생성
wget https://docs.projectcalico.org/manifests/tigera-operator.yaml
# operator에 설정을 전달하기 위한 config
wget https://docs.projectcalico.org/manifests/custom-resources.yaml
custom-resources.yaml 확인 ( *tigera-operator는 내용이 길어 생략 )
# This section includes base Calico installation configuration. # For more information, see: https://projectcalico.docs.tigera.io/master/reference/installation/api#operator.tigera.io/v1.Installation apiVersion: operator.tigera.io/v1 kind: Installation metadata: name: default spec: # Configures Calico networking. calicoNetwork: # Note: The ipPools section cannot be modified post-install. ipPools: - blockSize: 26 cidr: 192.168.0.0/16 encapsulation: VXLANCrossSubnet natOutgoing: Enabled nodeSelector: all() --- # This section configures the Calico API server. # For more information, see: https://projectcalico.docs.tigera.io/master/reference/installation/api#operator.tigera.io/v1.APIServer apiVersion: operator.tigera.io/v1 kind: APIServer metadata: name: default spec: {}
3)calico 구성확인
- calicoctl version
- calico node (tiger-operator로 셋업시 namespace는 calico-system으로 기본설정)
- calico controller
- calico ipam 대역 확인
- 개별 노드 대역 확인
- calico node의 bird, felix, confd 기동 확인 (k3d 이므로 노드 역할의 docker 내 접속해서 확인합니다)
- felix (k3d node로 접속해서 확인)
- bird 정보 ( node에 접속하여 birdcl 수행)
- (birdcl)route 정보
- (birdcl)protocol 정보
- (birdcl) 상태 정보
2. Pod 와 Pod간 통신
- 동일 노드내에서 터널링은 발생하지 않으며, pod 간 통신은 직접 수행됨 (상기 참조)
2.1. pod 생성전 기본정보 확인
(tiger operator 사용시 기본이 VXLAN을 따르니, tunl0(IPIP시 활성화)를 확인하려면 mode 변경 필요)
- 노드 내의 네트워크 인터페이스 정보 확인
- 노드 내의 라우팅 경로 확인
*이때 “blackhole”은 정책의 적용을 강제하거나 차단하기 위해 존재한다
- 노드 내 iptables 룰의 갯수 차이 확인
(노드의 수, 파드 위치, 정책 등에 따라 routing rule의 갯수 차이가 발생)
2.2 같은 node에 pod 두개 생성
- yaml
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
nodeName: k3d-gasidacluster-agent-1
containers:
- name: pod1
image: nicolaka/netshoot # 이미지는 네트워크 장애 처리에 유용한 이미지를 사용합니다
command: ["tail"]
args: ["-f", "/dev/null"]
terminationGracePeriodSeconds: 0
---
apiVersion: v1
kind: Pod
metadata:
name: pod2
spec:
nodeName: k3d-gasidacluster-agent-1
containers:
- name: pod2
image: nicolaka/netshoot
command: ["tail"]
args: ["-f", "/dev/null"]
terminationGracePeriodSeconds: 0
- 파드 배포 후 , calico 통한 확인
- 생성된 파드 정보 확인
- 파드 생성 이후 정보 확인
추가된 네트워크 인터페이스 2개의 정보를 확인 가능
- 파드에 접속하여 정보 확인
- 마스터 노드에서의 정보 확인
- 마스터 노드 → 파드2 에서의 정보 확인
- pod 1 → pod2로의 통신(pod2 ip 확인하여 ping 성공)
- 인근 이웃들의 arp 정보
- 기본 forward가 어디로 향해 처리되는지 확인
- 워커 노드 내에서 본 인터페이스들의 맥 주소
2.3 proxy_arp 활성 여부와 pod 통신 확인
(배포한 pod 삭제 후 시도 필요. 현재 잘 되지 않음..)
2.4 파드 → 외부 통신
- calico의 기본 설정은 natOutgoing enable (custom-resourc.yaml 확인)
apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
name: default
spec:
# Configures Calico networking.
calicoNetwork:
# Note: The ipPools section cannot be modified post-install.
ipPools:
- blockSize: 26
cidr: 192.168.0.0/16
encapsulation: IPIP
**natOutgoing: Enabled**
nodeSelector: all()
- calicoctl로 정보 확인
- 파드를 통한 외부 통신 확인(node1-pod1.yaml)
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
nodeName: k3d-gasidaCluster-agent-1
containers:
- name: pod1
image: nicolaka/netshoot
command: ["tail"]
args: ["-f", "/dev/null"]
terminationGracePeriodSeconds: 0
*호스트 네임 필히 변경
정리
- calico는 tiger사에서 개발-배포하는 쿠버네티스와 비쿠버네티스, 혹은 레가시 시스템의 네트워킹과 보안을 강제할수 있는 솔루션이며. CNI를 만족하고 있습니다.
- calico의 구성요소는 사용자를 위한 calicocli, calico data store(내용중 kubenetes의 저장소 공유), BGP 정보 전파를 위한 BIRD, 라우팅 정보 갱신을 위한 Felix, 변경 사항의 퍼시스턴트 저장을 위한 confd가 존재합니다.
- CNI 표준을 만족함으로 쿠버네티스 구성요소 간 그리고 쿠버네티스 클러스터외의 아웃바운드 통신을 지원합니다.
- 본 장중에서 ip와 link, routing 정보 그리고 calicoctl을 활용한 다양한 사항에 대한 검증을 하였습니다.( 캡처 도중 podCIDR과 기본 대역이 겹쳐서 재설치 하였습니다.)