[cilium] VxLAN, Geneve 오버레이 모드 (작성중)

2025.07.31 - [K8S/🔥 network study🔥] - [cilium] native routing 통신 흐름 확인해보기

지난번에 natvie모드를 살펴보긴 했는데 이번에는 오버레이 모드를 살펴볼까 합니다.

 

기본적으로 overlay 모드를 사용하면 VxLAN이 활성화되고 그 이외에는 Geneve가 옵션으로 있습니다.

 

VXLAN(Virtual Extensible LAN)

VXLAN은 이더넷 프레임을 UDP 패킷 안에 캡슐화해 전송합니다.
외부 IP/UDP 헤더 위에 VXLAN 헤더가 붙고, 그 안에 원래의 L2 프레임이 들어갑니다.
이 방식으로 서로 다른 네트워크 구간에서도 마치 같은 L2처럼 통신할 수 있습니다.

구조가 단순하고 호환성이 좋지만, 헤더 구조가 고정이라 새로운 기능을 추가하기는 어렵습니다.

 

GENEVE(Generic Network Virtualization Encapsulation)

GENEVE는 패킷을 UDP 안에 캡슐화한다는 점에서 VXLAN과 비슷합니다.
하지만 GENEVE 헤더는 가변 길이 옵션 필드를 지원해 다양한 메타데이터를 함께 넣을 수 있습니다.
덕분에 동일한 캡슐화 구조 안에서 추가 기능이나 프로토콜 확장이 가능합니다.

VXLAN, NVGRE 등 기존 오버레이 프로토콜들은 헤더 구조가 고정돼 확장성이 떨어지거나, 특정 네트워크 환경에 종속되는 단점이 있었는데, GENEVE는 이를 보완하기 위해 더 나중에 등장한 표준입니다.

 

그림으로 살펴보기

5년전에 그려진 그림이라서 달라진 부분이 있을 수 있지만 그래도 cilium의 흐름을 이해하기엔 적절하지 않을까 싶습니다.

 

출처: https://www.inovex.de/de/blog/kubernetes-networking-2-calico-cilium-weavenet/

 

Kubernetes Networking Teil 2: Vergleich von (CNI) Netzwerk-Plugins - inovex GmbH

Nachdem wir uns im ersten Teil dieser Serie mit den Grundlagen des Container- und Kubernetes Networkings befasst haben, schauen wir uns in diesem Teil die CNI-kompatiblen Plug-Ins Project Calico, Cilium und Weave Net konkret an und vergleichen sie.

www.inovex.de

 

 

직접 덤프 떠보기

vxlan으로 설치하기 

helm install cilium cilium/cilium --version 1.18.0 --namespace kube-system \
  --set k8sServiceHost=auto --set ipam.mode="kubernetes" \
  --set k8s.requireIPv4PodCIDR=true --set ipv4NativeRoutingCIDR=10.244.0.0/16 \
  --set routingMode=tunnel --set tunnelProtocol=vxlan \
  --set autoDirectNodeRoutes=false --set endpointRoutes.enabled=true \
  --set kubeProxyReplacement=true --set bpf.masquerade=true --set installNoConntrackIptablesRules=false \
  --set endpointHealthChecking.enabled=false --set healthChecking=false \
  --set hubble.enabled=true --set hubble.relay.enabled=true --set hubble.ui.enabled=true \
  --set hubble.ui.service.type=NodePort --set hubble.ui.service.nodePort=30003 \
  --set prometheus.enabled=true --set operator.prometheus.enabled=true --set hubble.metrics.enableOpenMetrics=true \
  --set hubble.metrics.enabled="{dns,drop,tcp,flow,port-distribution,icmp,httpV2:exemplars=true;labelsContext=source_ip\,source_namespace\,source_workload\,destination_ip\,destination_namespace\,destination_workload\,traffic_direction}" \
  --set operator.replicas=1 --set debug.enabled=true

 

 

파드간 통신 확인하기

cat << EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: webpod
spec:
  replicas: 3
  selector:
    matchLabels:
      app: webpod
  template:
    metadata:
      labels:
        app: webpod
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - sample-app
            topologyKey: "kubernetes.io/hostname"
      containers:
      - name: webpod
        image: traefik/whoami
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: webpod
  labels:
    app: webpod
spec:
  selector:
    app: webpod
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: ClusterIP
EOF

 

클라이언트 파드 배포하기

# kind-worker 노드에 curl-pod 파드 배포
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: curl-pod
  labels:
    app: curl
spec:
  nodeName: kind-worker
  containers:
  - name: curl
    image: nicolaka/netshoot
    command: ["tail"]
    args: ["-f", "/dev/null"]
  terminationGracePeriodSeconds: 0
EOF

 

외부용으로 컨테이너 생성하기

docker run -d --rm --name client --cap-add=NET_ADMIN --network kind nicolaka/netshoot tail -f /dev/null