cilium 소개 (for k8s)

JopopScript·2022년 12월 26일
1

인프라

목록 보기
3/3
post-custom-banner

지난 포스트에서 k8s설치시 CNI는 cilium을 사용하였으나 이게 어떻게 동작하는지는 알아보지 않았다.
무지성으로 설치했던 업보 청산을 위해서 공식문서에서 개념부분만 간단하게 읽어봤다.
아래 내용은 전부 cilium 공식문서에서 가져온 내용으로 자세한, 정확한 내용은 공식문서를 참고해주시면 감사하겠다.

Cilium 소개

  • linux kernel에서 작동하는 eBPF 사용. 그렇기 때문에 네트워크 보안정책을 application container에 변경 없이 커널에서 적용

  • iptables을 사용한 방식: IP주소, 포트를 사용하여 필터링해왔음

    1. MSA환경에서 서버의 재기동이 자주 발생 / CICD로 인하여 지속접 업데이트
    2. 재기동시 IP 변경 → iptable 수정이 빈번하게 발생
  • Cilium의 eBPF는 service / pod / container identity 기반으로 필터링

  • layer 3 network에서 컨테이너 네트워킹 해주며 멀티노드에서 overlay, native routing 2가지형태를 지원함

    https://docs.cilium.io/en/stable/intro/#what-is-cilium

  • 같은 Labels을 가지고 있다면 다른 노드에 배포되어도 같은 container identity를 가짐

https://docs.cilium.io/en/stable/concepts/terminology/#identity-management-in-the-cluster

Cilium 구성요소

Cilium

  • cilium-agent가 각 노드에 실행됨
    • 네트워킹, 서비스 로드밸런싱, 네트워크 정책, 모니터링을 수행함
    • eBPF가 리눅스 커널이 컨테이너로 들어오고 나가는 네트워크를 제어하는것을 cilium-agent가 관리함.
  • client(cli)
    • 명령도구, REST API를 사용, agent의 상태확인
  • Cilium Operator
    • 클러스터 전체에서 한번만 처리되어야 하는 작업을 담당
  • CNI plugin(cilium-cni)
    - pod 생성, 삭제시 쿠버네티스에 의해서 호출
    - datapath configuration to networking, load-balancing and network policies for the pod.

    https://docs.cilium.io/en/stable/concepts/overview/#cilium

eBPF

  • 리눅스 커널에서 네트워크 패킷을 필터링 하기위한 바이트코드 인터프리터
  • JIT컴파일러가 CPU 아키텍쳐에 맞게 바이트코드 변환을 수행함
  • 네트워크 패킷이 들어오고 나가는 여러지점에 동작함(hook으로 끼워넣을수 있음)

    https://docs.cilium.io/en/stable/concepts/overview/#ebpf

data store

라우팅

  • Encapsulation, Native-Routing 두가지 형태를 지원한다.

Encapsulation

장점

  • 클러스터 노드가 PodCIDRs를 인식하지 않아도됨
  • 네트워크 제한에 의존하지 않기 떄문에 PodCIDR가 적절하게 큰경우 노드에 파드를 얼마든지 생성가능함.

단점

  • encapsulation헤더가 추가되어 Native-Routing보다 전송하는 데이터양이 적어진다.
    • 50 bytes per network packet for VXLAN

Native-Routing

  • cilium 네트워크를 사용하여 해결함
  • 클러스터 노드가 연결된 네트워크는 PodCIDR를 라우팅 할 수 있어야함.

필수사항

  • 모든 노드의 리눅스 커널은에서 다른곳으로 전달하는 방법을 알고 있어야 한다.
    1. 노드에서는 전달방법을 모르지만, 모든 포드에 도달하는 방법을 알고 있는 라우터가 네트워크를 존재해야함.
    2. 노드는 다른노드에 있는 파드 IP를 리눅스 커널 커널 라우팅 테이블에 제공되어야함.

      https://docs.cilium.io/en/stable/concepts/networking/routing/#native-routing

IPAM(ip주소 할당)

  • 주소항당 방법으로 여러 가지 방법을 지원하고 있지만 기본값인 Cluster Scope만 확인해 본다.

Cluster Scope(기본값)

  • 각 노드에 PodCIDR를 분배한 다음, 노드 내에서 할당받은 범위안에서 아이피를 부여함.
  • Cilium operator가 ip를 관리함

https://docs.cilium.io/en/stable/concepts/networking/ipam/cluster-pool/

ps. 음 점점 글이 안읽힌다... eBPF Datapath, Kubernetes Integration 부분은 다음에 읽어보겠다..

https://docs.cilium.io/en/stable/concepts/ebpf/
https://docs.cilium.io/en/stable/concepts/kubernetes/

profile
tutorialMaster
post-custom-banner

0개의 댓글