K8s/Calico

Calico 기본통신 이해

식사법 2024. 9. 20. 13:38

Calico 기본 통신 이해

1. Calico CNI 란?

image.png

쿠버네티스 워크로드와 비쿠버네티스 및 레가시 환경의 워크로드 간 안전하고 유기적인 통신을 가능케 하는 tigera 사의 네트워크 보안 솔루션

  • CNI(Container Network Interface) 표준을 준수하므로, 쿠버네티스의 오버레이 네트워크 플러그인으로 사용가능하며, 다양한 모드(IPIP, VXLAN, Direct)를 지원합니다.

1. Calico의 구성요소

image.png

  • 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

image.png

  • calico node (tiger-operator로 셋업시 namespace는 calico-system으로 기본설정)

image.png

  • calico controller

image.png

  • calico ipam 대역 확인

image.png

  • 개별 노드 대역 확인

image.png

  • calico node의 bird, felix, confd 기동 확인 (k3d 이므로 노드 역할의 docker 내 접속해서 확인합니다)

image.png

  • felix (k3d node로 접속해서 확인)

image.png

  • bird 정보 ( node에 접속하여 birdcl 수행)
    • (birdcl)route 정보

image.png

  • (birdcl)protocol 정보

image.png

  • (birdcl) 상태 정보

image.png

2. Pod 와 Pod간 통신

  • 동일 노드내에서 터널링은 발생하지 않으며, pod 간 통신은 직접 수행됨 (상기 참조)

2.1. pod 생성전 기본정보 확인

(tiger operator 사용시 기본이 VXLAN을 따르니, tunl0(IPIP시 활성화)를 확인하려면 mode 변경 필요)

  • 노드 내의 네트워크 인터페이스 정보 확인

image.png

  • 노드 내의 라우팅 경로 확인

image.png

*이때 “blackhole”은 정책의 적용을 강제하거나 차단하기 위해 존재한다

  • 노드 내 iptables 룰의 갯수 차이 확인

image.png

(노드의 수, 파드 위치, 정책 등에 따라 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 통한 확인

image.png

  • 생성된 파드 정보 확인

image.png

  • 파드 생성 이후 정보 확인

image.png

image.png

추가된 네트워크 인터페이스 2개의 정보를 확인 가능

  • 파드에 접속하여 정보 확인

image.png

  • 마스터 노드에서의 정보 확인

image.png

  • 마스터 노드 → 파드2 에서의 정보 확인

image.png

  • pod 1 → pod2로의 통신(pod2 ip 확인하여 ping 성공)

image.png

  • 인근 이웃들의 arp 정보

image.png

  • 기본 forward가 어디로 향해 처리되는지 확인

image.png

  • 워커 노드 내에서 본 인터페이스들의 맥 주소

image.png

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로 정보 확인

image.png

  • 파드를 통한 외부 통신 확인(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

*호스트 네임 필히 변경

image.png

정리

  • calico는 tiger사에서 개발-배포하는 쿠버네티스와 비쿠버네티스, 혹은 레가시 시스템의 네트워킹과 보안을 강제할수 있는 솔루션이며. CNI를 만족하고 있습니다.
  • calico의 구성요소는 사용자를 위한 calicocli, calico data store(내용중 kubenetes의 저장소 공유), BGP 정보 전파를 위한 BIRD, 라우팅 정보 갱신을 위한 Felix, 변경 사항의 퍼시스턴트 저장을 위한 confd가 존재합니다.
  • CNI 표준을 만족함으로 쿠버네티스 구성요소 간 그리고 쿠버네티스 클러스터외의 아웃바운드 통신을 지원합니다.
  • 본 장중에서 ip와 link, routing 정보 그리고 calicoctl을 활용한 다양한 사항에 대한 검증을 하였습니다.( 캡처 도중 podCIDR과 기본 대역이 겹쳐서 재설치 하였습니다.)