본문으로 바로가기 본문 바로가기
WIKI 기술 지식 베이스

VPP 네트워킹 시작하기

원문 보기 위키 갱신

이 문서는 Kubernetes 클러스터에 VPP 사용자 영역 데이터 플레인으로 Calico를 설치하는 방법을 안내해요. EKS 관리형 클러스터 설치, DPDK 드라이버를 곁들인 EKS 설치, 그리고 일반 Kubernetes 클러스터 설치 세 가지 경로를 모두 다루죠. 명령어와 매니페스트 내용은 원문 그대로 유지했으니 그대로 따라 치면 돼요.

출처: 문서

본문

큰 그림

Calico를 설치하고 VPP 데이터 플레인을 활성화해요.

가치

VPP 데이터 플레인 모드는 표준 Linux 네트워킹 파이프라인 모드에 비해 여러 가지 장점이 있어요:

  • 특히 WireGuard 암호화를 켰을 때 더 높은 처리량까지 확장돼요

  • IPsec으로 암호화 성능을 한층 더 끌어올려요

  • kube-proxy 없이 Kubernetes 서비스를 기본 지원하는데, 이 덕분에:

    • 서비스로 향하는 패킷의 첫 패킷 지연 시간이 줄어요
    • 외부 클라이언트의 소스 IP 주소가 파드까지 그대로 보존돼요

VPP 데이터 플레인은 다른 Calico 데이터 플레인과 완전히 호환돼요. 즉 VPP를 활성화한 노드와 일반 노드가 섞인 클러스터를 운영할 수 있어요. 덕분에 클러스터를 Linux 또는 eBPF 네트워킹에서 VPP 네트워킹으로 점진적으로 이전할 수도 있어요.

또한 VPP 데이터 플레인은 네트워크 집약적인 애플리케이션을 위한 몇 가지 전용 기능도 제공해요. 파드에 일반 Linux 네트워크 디바이스 대신 memif 사용자 영역 패킷 인터페이스를 제공하거나, VPP Host Stack을 노출해 파드에서 최적화된 L4+ 애플리케이션을 구동하는 식이에요.

SECONDARY: VPP 데이터 플레인은 다른 Calico 데이터 플레인과 비교해 몇 가지 사소한 동작 차이가 있고, 일부 기능은 지원되지 않아요. 자세한 내용은 Known issues & unsupported features를 참고하세요. 버그는 Calico Users slack이나 GitHub에 보고해 주세요).

개념

VPP

VPP(Vector Packet Processor)는 fd.io 산하에서 개발된 C로 작성된 고성능 오픈소스 사용자 영역 네트워크 데이터 플레인이에요. L2 스위칭, L3 라우팅, NAT, 캡슐화 같은 표준 네트워킹 기능을 폭넓게 지원하고, 플러그인으로 쉽게 확장할 수도 있어요. VPP 데이터 플레인은 플러그인을 사용해 Kubernetes 서비스 로드 밸런싱과 Calico 정책을 효율적으로 구현해요.

오퍼레이터 기반 설치

이 가이드는 Tigera Operator로 Calico를 설치해요. 오퍼레이터는 커스텀 리소스 정의(CRD)로 정의된 Kubernetes API를 통해 노출되는 Calico의 라이프사이클 관리를 제공하죠. 매니페스트를 직접 사용해 Calico를 설치하고 VPP용으로 구성하는 것도 기술적으로는 가능하지만, 현재 단계에서는 오퍼레이터 기반 설치만 지원해요.

방법

이 가이드는 VPP 데이터 플레인과 함께 Calico를 설치하는 방법을 소개해요:

  • 관리형 EKS 클러스터에 설치하기. 가장 설정이 적게 필요한 옵션이에요.
  • DPDK 인터페이스 드라이버를 사용하는 관리형 EKS 클러스터에 설치하기. 이 옵션은 설정이 더 복잡하지만 더 나은 성능을 제공해요.
  • 아무 Kubernetes 클러스터에나 설치하기.

어떤 경로든 결과물의 세부 사항은 다음과 같아요:

정책 IPAM CNI 오버레이 라우팅 데이터스토어
Calico Calico Calico IPIP BGP Kubernetes

?

탭: EKS에 설치

EKS 클러스터에 VPP 데이터 플레인으로 Calico 설치하기

요구 사항

이 안내에서는 eksctl로 클러스터를 프로비저닝해요. 하지만 Amazon EKS 시작하기에 있는 어떤 방법을 써도 돼요.

시작하기 전에 필요한 사전 준비물을 다운로드하고 구성했는지 확인하세요.

클러스터 프로비저닝

  1. 먼저 노드 없이 Amazon EKS 클러스터를 만들어요.

    eksctl create cluster --name my-calico-cluster --without-nodegroup
    
  2. 이 클러스터는 네트워킹에 Calico를 사용하므로, 파드의 기본 AWS VPC 네트워킹을 비활성화하려면 aws-node DaemonSet을 삭제해야 해요.

    kubectl delete daemonset -n kube-system aws-node
    

VPP 데이터 플레인으로 Calico 설치 및 구성

  1. 빈 클러스터 구성이 끝났으니 이제 Calico 커스텀 리소스 정의를 설치할 수 있어요.

    클러스터가 Kubernetes 1.36 이상 기반이라면:

    kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.33.0/manifests/v3_projectcalico_org.yaml
    

    클러스터가 Kubernetes 1.34 또는 1.35 기반이라면:

    kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.33.0/manifests/v3_projectcalico_org-v1beta1.yaml
    
  2. Tigera Operator를 설치해요.

    kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.33.0/manifests/tigera-operator.yaml
    
  3. 그다음 Calico 설치를 VPP 데이터 플레인에 맞게 구성해야 해요. 아래 링크의 yaml에는 EKS용 최소 동작 구성이 들어 있어요. 이 매니페스트에서 사용할 수 있는 구성 옵션에 대한 자세한 내용은 Tigera Operator API 레퍼런스를 참고하세요.

    SECONDARY: 이 매니페스트를 적용하기 전에 내용을 읽어 보고 설정이 여러분의 환경에 맞는지 확인하세요. 예를 들어 원하는 파드 네트워크 CIDR에 맞추려면 기본 IP 풀 CIDR을 지정해야 할 수도 있어요.

    kubectl create -f https://raw.githubusercontent.com/projectcalico/vpp-dataplane/v3.32.0/yaml/calico/installation-eks.yaml
    
  4. 이제 VPP 데이터 플레인 컴포넌트를 설치할 차례예요.

    kubectl create -f https://raw.githubusercontent.com/projectcalico/vpp-dataplane/v3.32.0/yaml/generated/calico-vpp-eks.yaml
    
  5. 마지막으로 클러스터에 노드를 추가해요.

    eksctl create nodegroup --cluster my-calico-cluster --node-type t3.medium --node-ami auto --max-pods-per-node 50
    

    SUCCESS: 위의 --max-pods-per-node 옵션은 EKS가 노드 타입 기준으로 파드 수를 제한하지 않도록 해줘요. 노드 그룹 옵션 전체 목록은 eksctl create nodegroup --help를 참고하세요.

탭: DPDK로 EKS에 설치

DPDK 드라이버로 EKS 클러스터에 VPP 데이터 플레인 Calico 설치하기

요구 사항

DPDK는 표준 설치보다 나은 성능을 제공하지만 EKS 워커 인스턴스에 추가 커스터마이징(예: hugepages)이 필요해요. 필요한 커스터마이징을 적용해 주는 bash 스크립트 init_eks.sh가 있고, 우리는 eksctl 구성 파일의 preBootstrapCommands 속성을 활용해 워커 노드 생성 중에 이 스크립트를 실행해요. 이 안내는 최신 버전의 eksctl이 필요해요.

클러스터 프로비저닝

  1. 먼저 노드 없이 Amazon EKS 클러스터를 만들어요.

    eksctl create cluster --name my-calico-cluster --without-nodegroup
    
  2. 이 클러스터는 네트워킹에 Calico를 사용하므로, 파드의 기본 AWS VPC 네트워킹을 비활성화하려면 aws-node DaemonSet을 삭제해야 해요.

    kubectl delete daemonset -n kube-system aws-node
    

VPP 데이터 플레인으로 Calico 설치 및 구성

  1. 빈 클러스터 구성이 끝났으니 이제 Calico 커스텀 리소스 정의를 설치할 수 있어요.

    클러스터가 Kubernetes 1.36 이상 기반이라면:

    kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.33.0/manifests/v3_projectcalico_org.yaml
    

    클러스터가 Kubernetes 1.34 또는 1.35 기반이라면:

    kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.33.0/manifests/v3_projectcalico_org-v1beta1.yaml
    
  2. Tigera Operator를 설치해요.

    kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.33.0/manifests/tigera-operator.yaml
    
  3. 그다음 Calico 설치를 VPP 데이터 플레인에 맞게 구성해야 해요. 아래 링크의 yaml에는 EKS용 최소 동작 구성이 들어 있어요. 이 매니페스트에서 사용할 수 있는 구성 옵션에 대한 자세한 내용은 Tigera Operator API 레퍼런스를 참고하세요.

    SECONDARY: 이 매니페스트를 적용하기 전에 내용을 읽어 보고 설정이 여러분의 환경에 맞는지 확인하세요. 예를 들어 원하는 파드 네트워크 CIDR에 맞추려면 기본 IP 풀 CIDR을 지정해야 할 수도 있어요.

    kubectl create -f https://raw.githubusercontent.com/projectcalico/vpp-dataplane/v3.32.0/yaml/calico/installation-eks.yaml
    
  4. 이제 VPP 데이터 플레인 컴포넌트를 설치할 차례예요.

    kubectl create -f https://raw.githubusercontent.com/projectcalico/vpp-dataplane/v3.32.0/yaml/generated/calico-vpp-eks-dpdk.yaml
    
  5. 마지막으로 클러스터에 노드를 추가할 차례예요. DPDK를 위해 노드를 커스터마이징해야 하므로, preBootstrapCommands 속성이 들어 있는 eksctl 구성 파일로 워커 노드를 만들 거예요. 다음 명령은 클러스터에 t3.large 워커 노드 2개로 관리형 노드 그룹을 만들어요:

    cat <<EOF | eksctl create nodegroup -f -
    apiVersion: eksctl.io/v1alpha5
    kind: ClusterConfig
    metadata:
      name: my-calico-cluster
      region: us-east-2
    managedNodeGroups:
    - name: my-calico-cluster-ng
      desiredCapacity: 2
      instanceType: t3.large
      labels: {role: worker}
      preBootstrapCommands:
        - sudo curl -o /tmp/init_eks.sh "https://raw.githubusercontent.com/projectcalico/vpp-dataplane/v3.32.0/scripts/init_eks.sh"
        - sudo chmod +x /tmp/init_eks.sh
        - sudo /tmp/init_eks.sh
    EOF
    

    클러스터 이름, 리전, 다른 필드들은 여러분의 클러스터에 맞게 수정하세요. EKS 워커 인스턴스에 ssh 접근을 활성화하고 싶다면 위 구성 파일에 다음을 추가해요:

    ssh:
      publicKeyPath: <path to public key>
    

    ssh 접근에 대한 자세한 내용은 Amazon EC2 키 페어와 Linux 인스턴스를 참고하세요.

탭: 아무 클러스터에나 설치

아무 Kubernetes 클러스터에나 VPP 데이터 플레인 Calico 설치하기

요구 사항

VPP 데이터 플레인에는 다음 요구 사항이 있어요:

필수

  • CNI가 한 번도 구성되지 않은 빈 Kubernetes 클러스터

  • cali*, tunl*, vxlan.calico 인터페이스 관리 관련 항목을 제외한 기본 요구 사항

    SECONDARY: kubeadm으로 클러스터를 만든다면 --pod-network-cidr 커맨드라인 인자로 파드 네트워크 CIDR을 지정하세요. 즉 sudo kubeadm init --pod-network-cidr=192.168.0.0/16처럼요. 192.168.0.0/16이 이미 네트워크에서 사용 중이라면 다른 파드 네트워크 CIDR을 골라야 해요.

선택

하드웨어에 따라 다음 hugepages 구성을 적용하면 VPP가 더 효율적인 드라이버를 쓸 수 있어요:

  • 최소 512 x 2MB hugepage가 사용 가능해요 (grep HugePages_Free /proc/meminfo)

  • vfio-pci(centos에서는 vfio_pci) 또는 uio_pci_generic 커널 모듈이 로드되어 있어요. 예를 들면:

    echo "vfio-pci" > /etc/modules-load.d/95-vpp.conf
    modprobe vfio-pci
    echo "vm.nr_hugepages = 512" >> /etc/sysctl.conf
    sysctl -p
     # restart kubelet to take the changes into account
     # you may need to use a different command depending on how kubelet was installed
    systemctl restart kubelet
    

Calico 설치 후 VPP용으로 구성하기

  1. Calico 커스텀 리소스 정의를 설치해요.

    클러스터가 Kubernetes 1.36 이상 기반이라면:

    kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.33.0/manifests/v3_projectcalico_org.yaml
    

    클러스터가 Kubernetes 1.34 또는 1.35 기반이라면:

    kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.33.0/manifests/v3_projectcalico_org-v1beta1.yaml
    
  2. Tigera Operator를 설치해요.

    kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.33.0/manifests/tigera-operator.yaml
    
  3. 그다음 Calico 설치를 VPP 데이터 플레인에 맞게 구성해야 해요. 아래 링크의 yaml에는 VPP용 최소 동작 구성이 들어 있어요. 이 매니페스트에서 사용할 수 있는 구성 옵션에 대한 자세한 내용은 Tigera Operator API 레퍼런스를 참고하세요.

    SECONDARY: 이 매니페스트를 적용하기 전에 내용을 읽어 보고 설정이 여러분의 환경에 맞는지 확인하세요. 예를 들어 원하는 파드 네트워크 CIDR에 맞추려면 기본 IP 풀 CIDR을 지정해야 할 수도 있어요.

    kubectl create -f https://raw.githubusercontent.com/projectcalico/vpp-dataplane/v3.32.0/yaml/calico/installation-default.yaml
    

VPP 데이터 플레인 컴포넌트 설치

먼저 VPP 데이터 플레인 리소스에 맞는 yaml 매니페스트 파일을 가져오세요:

# If you have configured hugepages on your machines
curl -o calico-vpp.yaml https://raw.githubusercontent.com/projectcalico/vpp-dataplane/v3.32.0/yaml/generated/calico-vpp.yaml
# If not, or if you're unsure
curl -o calico-vpp.yaml https://raw.githubusercontent.com/projectcalico/vpp-dataplane/v3.32.0/yaml/generated/calico-vpp-nohuge.yaml

그다음 이 yaml 매니페스트 파일에서 calico-vpp-config ConfigMap을 찾아 다음과 같이 구성하세요.

필수 구성

  • SERVICE_PREFIX는 Kubernetes 서비스 CIDR이에요. 다음 명령으로 확인할 수 있어요:

    kubectl cluster-info dump | grep -m 1 service-cluster-ip-range
    

    이 명령이 아무것도 반환하지 않으면 기본값 10.96.0.0/12를 그대로 두어도 돼요.

  • CALICOVPP_INTERFACES에는 VPP의 인터페이스에 특화된 파라미터를 담은 딕셔너리가 들어가요. uplinkInterfaces 필드는 업링크 인터페이스 목록과 그 구성을 담고, 목록의 첫 번째 요소가 기본/메인 업링크 인터페이스, 나머지(있다면)는 보조 호스트 인터페이스예요. 최소한 기본/메인 업링크 인터페이스 이름은 반드시 지정해야 해요. 예를 들면:

    CALICOVPP_INTERFACES: |-
    {
        "uplinkInterfaces": [ { "interfaceName": "eth0" } ]
    }
    

    인터페이스 이름이 유효한 Linux 인터페이스 이름인지, 그리고 그 인터페이스가 up 상태로 주소가 구성되어 있는지 꼭 확인하세요. 또한 이 인터페이스에 구성된 주소는 Kubernetes의 노드 주소(kubectl get nodes -o wide)와 반드시 일치해야 해요.

    CALICOVPP_INTERFACES spec
    필드 설명 타입
    maxPodIfSpec 파드 인터페이스 구성의 최대값을 담은 spec InterfaceSpec
    defaultPodIfSpec 파드 인터페이스 구성의 기본값을 담은 spec InterfaceSpec
    vppHostTapSpec vpp에서 호스트 tap 인터페이스 구성을 담은 spec InterfaceSpec
    uplinkInterfaces vpp의 호스트 인터페이스 목록 UplinkInterfaceSpec 목록
    InterfaceSpec
    필드 설명 타입 기본값
    rx RX 큐 수 int 1
    tx TX 큐 수 int 1
    rxqsz RX 큐 크기 int 1024
    txqsz TX 큐 크기 int 1024
    isl3 인터페이스 모드(L2/L3)를 정의해요 boolean tuntap이면 true ; memif이면 false
    rxMode RX 모드 "interrupt", "adaptive", "polling" 중 문자열 adaptive
    UplinkInterfaceSpec
    필드 설명 타입 기본값
    rx RX 큐 수 int 1
    tx TX 큐 수 int 1
    rxqsz RX 큐 크기 int 1024
    txqsz TX 큐 크기 int 1024
    isl3 지원하는 드라이버의 인터페이스 모드(L2/L3)를 정의해요 boolean true
    rxMode RX 모드 "interrupt", "adaptive", "polling" 중 문자열 adaptive
    InterfaceName 인터페이스 이름 string unset
    vppDriver vpp에서 사용할 드라이버 string unset
    newDriver 인터페이스를 VPP로 넘기기 전에 사용할 Linux 드라이버 string unset
    mtu 인터페이스의 mtu int Linux의 기존 MTU 사용

선택 구성

VPP가 업링크 인터페이스를 구동하는 방식을 구성하려면 CALICOVPP_INTERFACES의 uplinkInterfaces에서 vppDriver 필드를 사용하세요.

지원 값은 인터페이스 타입에 따라 달라져요. 사용 가능한 값은 다음과 같아요:

  • "" : 인터페이스 타입과 사용 가능한 리소스를 기준으로 드라이버를 자동으로 선택하고 시도해요. 가장 빠른 것부터 시작해요
  • af_xdp : AF_XDP 소켓으로 인터페이스를 구동해요 (커널 5.4 이상 필요)
  • af_packet : AF_PACKET 소켓으로 인터페이스를 구동해요 (최적화되지 않았지만 어디서든 동작해요)
  • avf : Intel 700-시리즈와 800-시리즈 인터페이스용 VPP 네이티브 드라이버를 사용해요 (hugepages 필요)
  • vmxnet3 : VMware 가상 인터페이스용 VPP 네이티브 드라이버를 사용해요 (hugepages 필요)
  • virtio : Virtio 가상 인터페이스용 VPP 네이티브 드라이버를 사용해요 (hugepages 필요)
  • rdma : Mellanox CX-4와 CX-5 인터페이스용 VPP 네이티브 드라이버를 사용해요 (hugepages 필요)
  • dpdk : VPP에서 DPDK 인터페이스 드라이버를 사용해요 (hugepages 필요, 대부분의 인터페이스에서 동작)
  • none : 연결성을 자동으로 구성하지 않아요. 인터페이스를 수동으로 구성할 때 사용할 수 있어요

예를 들면:

  CALICOVPP_INTERFACES: |-
    {
      ...
      "uplinkInterfaces": [
        {
          "interfaceName": "eth0",
          "vppDriver": "af_packet"
        }
      ]
      ...
    }

레거시 옵션

CALICOVPP_INTERFACE와 CALICOVPP_NATIVE_DRIVER 환경 변수는 여전히 레거시로 지원돼요. CALICOVPP_INTERFACES를 지정하지 않으면 CALICOVPP_INTERFACE가 사용할 기본 인터페이스, CALICOVPP_NATIVE_DRIVER가 VPP가 사용할 업링크 드라이버예요.

CALICOVPP_INTERFACE --> uplinkInterfaces[0].interfaceName

CALICOVPP_NATIVE_DRIVER --> uplinkInterfaces[0].vppDriver

예시

kind: ConfigMap
apiVersion: v1
metadata:
  name: calico-vpp-config
  namespace: calico-vpp-dataplane
data:
  ...
  CALICOVPP_INTERFACE: eth1
  CALICOVPP_NATIVE_DRIVER: "af_packet"
  ...

WARNING: CALICOVPP_INTERFACE와 CALICOVPP_NATIVE_DRIVER는 deprecated로 표시되었으며 향후 릴리스에서는 지원되지 않아요. 대신 CALICOVPP_INTERFACES를 사용해 주세요.

구성 적용하기

구성을 적용하려면 다음을 실행해요:

kubectl create -f calico-vpp.yaml

이렇게 하면 VPP 데이터 플레인에 필요한 모든 리소스가 클러스터에 설치돼요.

다음 단계

VPP 데이터 플레인으로 Calico를 설치했다면 빠른 IPsec이나 WireGuard 암호화 같은 VPP 데이터 플레인의 기능을 활용할 수 있어요.

도구

보안

더 알아보기 (Learn more)

VPP 데이터 플레인은 설치만으로는 기본 iptables 모드와 결과가 비슷해 보여도, kube-proxy 없는 서비스 로드 밸런싱이 핵심 차별점이에요. EKS에서 hugepages와 DPDK를 쓴다면 노드 부트스트랩 스크립트를 잊지 마세요. 설치 후엔 IPsec이나 WireGuard 암호화를 이어서 구성해 보세요.