3주차 [2] - Calico CNI Network mode

  • Calico에서 지원하는 네트워크 통신 모드를 이해한다.

  • Calico나 Cillium 에서는 파드 혹은 namespace 레벨에서 IN/OUT 트래픽 통제할 수 있다.

1. Calico Mode 요약

  • Calico는 4가지의 네트워크 모드가 있습니다.

2. IPIP 모드

IPIP 모드

  • 파드간 통신이 IPIP encapsulation을 이용해서 이루어집니다.

  • ip 헤더에 감싸져서 tunl 인터페이스에서 outer 헤더를 제거하고 내부의 파드와 통신하게 됩니다.

  • Azure에서는 지원하지 않음

  • 오버헤드가 생겨서 성능이 비교적낮음

3. Direct 모드

  • Direct 모드는 NIC에 매칭되지 않는 패킷이 차단될 수 있기 때문에, AWS에서는 따로 설정을 꺼줘야합니다. (Sour/Destination Check)

  • 파드 통신 패킷이 노드의 라우팅 정보를 보고 목적지 노드로 패킷 그대로 전달합니다.

  • 실제로 설정하기 쉽지 않습니다. VPC 라우팅 테이블을 변경해줘야합니다.

크로스 서브넷

  • 크로스 서브넷으로, 노드간 같은 네트워크 대역은 Direct, 다른 네트워크 대역은 IPIP로도 동작을 만들 수 있습니다.

3.1 Direct 모드 설정


# AWS CLI 로 특정 인스턴스의 Source/Destination Check 기능을 Disable 하기
aws ec2 modify-instance-attribute --instance-id <*INSTANCE_ID*> --source-dest-check "{\"Value\": false}"

# Calico 모드 정보 확인
calicoctl get ippool -o wide

# (옵션) 모니터링
watch -d "route -n | egrep '(Destination|UG)'"


# ipip 모드설정 끄기
calicoctl get ippool default-ipv4-ippool -o yaml
calicoctl get ippool default-ipv4-ippool -o yaml | sed -e "s/ipipMode: Always/ipipMode: Never/" | calicoctl apply -f -


# 모드 정보 확인 : IPIPMODE 가 Never 로 변경!
calicoctl get ippool -o wide


# BGP 로 전달 받은 파드 네트워크 대역이 호스트 라우팅 테이블에 적용되었는지 확인 : Iface 가 tunl0 에서 ens5 혹은 enp0s8 로 변경!
route -n | egrep '(Destination|UG)'

-> 변경 이후 값들

-> IPIPMODE 가 NEVER로 변경되고 Iface 가 ens5 로 변경된것을 확인할 수 있습니다.

curl -s -O https://raw.githubusercontent.com/gasida/NDKS/main/5/node3-pod3.yaml
kubectl apply -f node3-pod3.yaml

# 파드 IP 정보 확인
kubectl get pod -o wide
calicoctl get wep
# pod 1 접속해서 ping 날리기
kubectl exec -it pod1 -- zsh
## 파드 Shell 에서 아래 입력
ping 172.16.184.1

# 파드가 동작하는 노드의 eth0(예시)에서 패킷 덤프
tcpdump -i ens5 -nn icmp   

3.3 크로스 서브넷 모드

# CrossSubnet 모드 설정
calicoctl patch ippool default-ipv4-ippool -p '{"spec":{"ipipMode":"CrossSubnet"}}'

# 모드 확인
calicoctl get ippool -o wide

(⎈|HomeLab:default) root@k8s-m:~# calicoctl patch ippool default-ipv4-ippool -p '{"spec":{"ipipMode":"CrossSubnet"}}'
Successfully patched 1 'IPPool' resource
(⎈|HomeLab:default) root@k8s-m:~# calicoctl get ippool -o wide
NAME                  CIDR            NAT    IPIPMODE      VXLANMODE   DISABLED   DISABLEBGPEXPORT   SELECTOR
default-ipv4-ippool   172.16.0.0/16   true   CrossSubnet   Never       false      false              all()


// 
route -n | grep UG

(⎈|HomeLab:default) root@k8s-m:~# route -n | grep UG
0.0.0.0         192.168.10.1    0.0.0.0         UG    100    0        0 ens5
172.16.34.0     192.168.20.100  255.255.255.0   UG    0      0        0 tunl0  ##   다른  네트워크 대역은IP 모드 확인
172.16.158.0    192.168.10.101  255.255.255.0   UG    0      0        0 ens5
172.16.184.0    192.168.10.102  255.255.255.0   UG    0      0        0 ens5
192.168.0.2     192.168.10.1    255.255.255.255 UGH   100    0        0 ens5  

4. VXLAN 모드

  • Pod 간 통신이 노드간 일때, vxlan encapsulation을 사용합니다.

    • 다른 노드간 파드 통신은 vxlan 인터페이스를 통해서 L2 프레임을 UDP로 상대측 노드로 전달

    • OUTER 헤더를 제거하고 내부의 파드와 통신합니다.

6. POD 패킷 암호화(네트워크 레벨)

  • Calico 네트워크 모드 환경 위에서 wireguard 터널을 만들어서 파드 트래픽을 암호화하여 노드간 전달 합니다.

7. 운영

  • 패킷 덤프를 통해서 장애구간을 알기 위한 노력이 필요하다.

  • 카카오나 kt 인프라 장애일때도, 자동화 구성하면서 에러가 많이 나고 해당 사항을 알고 있어야 트러블 슈팅이 가능하다.

  • [실습] Granfana 로 메트릭들을 확인해봅니다.

// 1. CALICO METRIC REPORTING을 생성합니다! 
calicoctl patch felixconfiguration default  --patch '{"spec":{"prometheusMetricsEnabled": true}}'

// 2. 서비스를 Felix 메트릭 서비스에 노출 시킵니다.
calicoctl get kubecontrollersconfiguration default -o yaml

// 3. 클러스터도 namespace 생성해주고, cluster role을 생성해줍니다. 

// 4. 그이후, prometheus를 생성해주고 metric을 수집해줍니다.
 
// 5. metric을 grafana와 연동시켜주고, dashboard를 확인해줍니다.

  • Calico의 접근 통제

    • podSelector를 통해서 pod 기준으로 통제할 수 있다.

    • namespaceSelector로 namespace 기준으로 통제할 수 있다.

    • 마지막으로 특정 CIDR에 따라 통제할 수 있다.

Last updated