CloudNet 가시다님이 진행하는 Kubernetes Advanced Networking Study 3주차 정리입니다.
[ Calico 기본 통신 이해 ]
▶Calico 실습을 위한 k8s 배포
- 2개의 네트워크 대역이 존재 : AWS 환경에서 k8s-rtr은 없고, AWS 내부 라우터가 대신 라우팅 처리
- 기본 설정 확인
- Calico CNI v3.28.1 설치
▶ kube-ops-view
▶ metrics-server
1. Calico CNI 알아보기
Calico is a networing and security solution that enables Kubernetes workloads and non-kubernetes/legacy workloads to communicate seamlessly and securely.
( 칼리코는 쿠버네티스 플랫폼을 포함하여 다양한 플랫폼에서 워크로드의 네트워크 통신과 네트워크 보안 기능을 제공합니다. 쿠버네티스 CNI를 준수하여, 파드를 위한 네트워크 통신 환경을 마련해줍니다.
▶ Calico components
1. kubectl이나 calicoctl를 사용하여 파드를 생성하거나, calico 설정을 변경 시 칼리코 데이터저장소(datastore)에 정보가 반영됩니다.
2. calicoctl은 칼리코 오브젝트(Object)를 CRUD(Create Read Update Delete)를 할 수 있습니다. 즉 칼리코 관련 설정을 생성, 읽기, 업데이트, 삭제 할 수 있습니다.
3. 칼리코 데이터저장소 : 칼리코 동작을 위한 데이터를 저장하는 곳이며, 저장소는 쿠버네티스 API저장소 혹은 ETCD를 선택할 수 있습니다.
칼리코 CNI 설치 시 데몬셋으로 calico-node 파드가 생성됩니다. calico-node 파드에는 3가지(brid, felix, confd) 중요한 프로그램이 동작합니다.
4. 버드(bird)는 오픈 소프트웨어 라우팅 데몬 프로그램입니다. 해당 노드의 파드 네트워크 대역을 BGP 라우팅 프로토콜을 통해서 광고합니다. 이를 통해 각 노드는 다른 모든 노드의 파드 대역과 통신을 할 수 있습니다..
5. 필릭스(felix)는 버드로 학습한 상대방 노드의 파드 네트워크 대역을 호스트의 라우팅 테이블에 최종적으로 업데이트하는 역할을 하며, IPtables 규칙 설정 관리를 합니다.
6. confd는 가벼운 오픈소스 설정 변경 관리 툴입니다. BGP 설정 등으로 칼리코 데이터저장소에 변경이 발생하면 버드의 변경된 설정 파일을 만들고, 변경된 설정 파일을 반영하게 합니다.
7. 칼리코는 자체의 IPAM(IP Address Management) 플러그인을 제공하며 기본값으로 사용합니다. 참고로, 플란넬(Flannel)에서는 기본 IPAM인 host-local IPAM을 사용했습니다.
> 파드 생성 시 칼리코 데이터저장소를 참고해, CNI플러그인과 CNI IPAM플러그인을 통해서 파드의 네트워크 설정을 하게 되며, 해당 파드가 다른 노드의 파드와 통신하는 경우에는 버드로 학습한 네트워크 정보를 필릭스에 의해서 호스트의 라우팅 테이블과 IPtables를 통해서 이루어 지게 됩니다.
- Felix(필릭스) : 인터페이스 관리, 라우팅 정보 관리, ACL 관리, 상태 체크
- Programs routes and ACLs, and anything else required on the host to provide desired connectivity for the endpoints on that host. Runs on each machine that hosts endpoints. Runs as an agent daemon. - BIRD(버드) : BGP Peer에 라우팅 정보 전파 및 수신, BGP RR(Route Reflector)
- Gets routes from Felix and distributes to BGP perrs on the network for inter-host routing. Runs on each node that hosts a Felix agent. Open source, internet routing daemon. - confd : calico global 설정과 BGP 설정 변경 시(트리거) BIRD에 적용해줌
- Monitors Calico datastore for changes to BGP configuration and global defaults such as As number, logging levels, and IPAM information. Open source, lightweight configuration management tool. - Dikasted : Enforces network policy for Istion service mesh. Runs on a cluster as a sidecar proxy to Istio Envoy.
- Calico CNI Plugin : k8s에 calico 네트워킹 환경을 제공
- Provides Calico networking for Kubernetes clusters - Datastore plugin : calico 설정 정보를 저장하는 곳 - k8s API datastore(kdd) 혹은 etcd 중 선택
- Increases scale by reducing each node's impact oon the datastore - Calico IPAM plugin : 클러스터 내에서 파드에 할당할 IP대역
- Uses Calico's IP pool resource to control how IP addresses are allocated to pods within the cluster - caclico-kube-controllers : calico 동작 관련 감시
- Typha : Datastore와 felix, confd 다수간 연결하지 않고 Datastore는 단일 Typha(중계자 역할)로 연결, Typha는 상태 캐시 및 이벤트 중복 제거 등으로 대규모 환경에서 부하를 감소 할 수 있음, 기본적으로 설치는 되지만 설정 구성되어 있지 않음
- Increases scale by reducing each node's impact on the datastore. Runs as a daemon between the datastore and instances of Felix. Installed by default, but not configured. - calicoctl : calico 오브젝트를 CRUD 할 수 있다, 즉 datastore 접근 가능
- Command line interface to create, read, update, and delete Calico objects. calicoctl command line is available on any host with network access to the Calico datastore as either a binary or a container
▶ Calico 구성요소 확인
- 데몬셋으로 각 노드에 calico-node 파드가 동작하여, 해당 파드에 bird, felix, confd 등이 동작 + Calico 컨트롤러 파드는 디플로이먼트로 생성
- felix(필릭스) : Host의 Network Interface, Route Table, iptables을 관리를 합니다.
- bird(버드) : bird는 라우팅 프로토콜 동작을 하는 데몬이며, 각 노드들의 파드 네트워크 대역 정보를 전파 및 전달 받습니다
▶ calico-node 정보 상세 확인
▶ calico-node의 bird 라우팅 정보 확인(birdcl)
- calico-node에 bird데몬에 별도의 cli 입력 툴을 제공합니다 -> birdcl
2. 파드(Pod) <-> 파드간 통신
2.1 최종 통신 흐름
결론 : 동일 노드 내의 파드 간 통신은 내부에서 직접 통신됨
- iptables FORWARD Rule에 정책(허용) 사용
- calice# 인터페이스에 proxy arp 설정으로 파드에서 바라보는 게이트웨이의 MAC 정보를 파드가 전달 받음
- 동일 노드 내에 파드 간 통신에서는 tunnel 인터페이스는 미 관여
2.2 파드 배포 전 기본 상태 확인
▶ 파드 생성 전 노드(k8s-w1) shell에서 기본 정보 확인
2.3 파드 배포 후 상태 확인
▶ 노드(k8s-w1)에 파드 2개 생성
- 파드 생성 된 이후 다시 정보 확인
▶ 파드에 Shell 접속 후 확인
- 파드1 Shell 접속
- 파드 2 Shell 접속
2.4 파드간 통신 실행 및 확
▶ 파드1 -> 파드 2 ping 통신 및 확인
3. 파드 -> 외부(인터넷) 통신
3.1 최종 통신 흐름
결론 : 파드에서 외부(인터넷) 통신 시에는 해당 노드의 네트워크 인터페이스 IP 주소로 MASQUERADE(출발지 IP가 변경) 되어서 외부 연결됨
- calico 기본 설정은 natOutgoing:true 이다. 즉, iptables에 MASQUERADE Rule에 의해서 외부에 연결됨
- calice# 인터페이스에 proxy arp 설정
- 파드와 외부간 직접 통신에서는 tunnel 인터페이스는 미 관여
3.2 파드 배포 전 기본 상태 확인
▶ calico 설정 정보 확인 & 노드에 iptables 확인
3.3 파드 배포 및 외부 통신 확인
▶ 노드(k8s-w1)에 파드 1개 생성
4. 다른 노드에서 파드 <-> 파드간 통신
4.1 최종 통신 흐름
결론 : 다른 노드 환경에서 파드 간 통신 시에는 IPIP 터널(기본값) 모드를 통해 이루어 집니다
- 각 노드에 파드 네트워크 대역은 Bird에 의해서 BGP로 광고 전파/전달 되며, Felix에 의해서 호스트의 라우팅 테이블에 자동으로 추가 및 삭제 됩니다
- 다른 노드 간의 파드 통신은 tunl0 인터페이스를 통해 IP 헤더에 감싸져서 상대측 노드로 도달 후 tunl0 인터페이스에서 Outer 헤더를 제거하고 내부의 파드와 통신됩니다.
4.2 파드 배포 전 기본 상태 확인
▶ 노드간 BGP로 Pod 대역 정보 전파 확인
- 노드에서 BGP에 의해서 전달 받은 정보가 호스트 라우팅 테이블에 존재하는지 확인
: 나머지 노드들의 파드 대역을 자신의 호스트 라우팅 테이블에 가지고 있고, 해당 경로는 tunl0 인터페이스로 보낸다
▶ 노드의 tunl0 정보 확인
4.3 파드 배포
▶ 노드1과 노드2에 각각 파드 1개씩 생성
4.4 파드간 통신 실행 및 확
▶ 파드간 통신 실행 이해를 위한 준비 => IPIP(IP Protocol 4 허용이 필요, Azure는 불가능)
Calico in VXLAN mode is supported on Azure. However, IPIP packets are blocked by the Azure network fabric.
'스터디 > Kubernetes' 카테고리의 다른 글
[Kubernetes Advanced Network Study] Service : ClusterIP, NodePort_1 (0) | 2024.09.27 |
---|---|
[Kubernetes Advanced Networking Study] Calico CNI & Mode_2 (0) | 2024.09.12 |
[Kubernetes Advanced Networking Study] K8S Flannel CNI & PAUSE_2 (0) | 2024.09.03 |
[Kubernetes Advanced Networking Study] K8S Flannel CNI & PAUSE (0) | 2024.09.01 |
[Kubernetes Advanced Networking Study] 컨테이너 격리 & 네트워크 및 보안_2 (1) | 2024.08.29 |