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

KubeVirt 네트워킹

원문 보기 위키 갱신

KubeVirt 가상 머신(VM)에 Calico 네트워킹을 제공하는 방법을 다뤄요. VM 라이프사이클 이벤트 전반에서 IP 주소를 유지하고, 라이브 마이그레이션을 지원하는 게 핵심이에요. 브리지 모드 네트워킹 설정부터 라이브 마이그레이션을 위한 정책 프로그래밍 타임아웃 구성까지 알아봐요.

출처: 문서

본문

전체 그림

Calico는 Kubernetes 클러스터에서 실행되는 KubeVirt 가상 머신(VM)에 네트워킹을 제공해요. VM 라이프사이클 이벤트 전반에서 IP 주소를 유지하고, 라이브 마이그레이션도 지원하죠.

가치

KubeVirt는 Kubernetes 파드 안에서 VM을 실행해요. VM이 재부팅되거나, 축출(eviction)되거나, 다른 호스트로 라이브 마이그레이션되면 그 밑에 있는 파드는 파괴된 뒤 다시 만들어져요. IP 유지 기능이 없으면 새 파드마다 새 IP를 받게 되고, 기존 연결이 끊기고 VM의 네트워크 신원도 바뀌어 버려요.

Calico의 KubeVirt 지원은 다음을 보장해요:

  • VM이 재부팅, 파드 축출, 라이브 마이그레이션을 거쳐도 같은 IP 주소를 유지해요.
  • 라이브 마이그레이션이 TCP 연결을 끊지 않고, VM 네트워크 신원을 바꾸지 않고 완료돼요.
  • 마이그레이션 트래픽이 전환되기 전에 목적지 호스트에서 네트워크 정책이 올바르게 적용돼요.

개념

지원되는 네트워킹 모드: bridge

Calico는 bridge 바인딩 모드를 사용하는 KubeVirt 라이브 마이그레이션을 지원해요. 브리지 모드에서는 VM이 리눅스 브리지를 통해 파드 네트워크에 연결되고, VM은 Calico가 파드에 할당한 것과 같은 IP 주소를 사용해요. 이런 이유 때문에 필요해요:

  • IP 주소 유지는 VM IP가 파드 IP와 일치하는 데 달려 있어요. 브리지 모드는 VM이 파드 IP를 직접 보고 사용하도록 보장해요.
  • KubeVirt 브리지 모드의 네트워크 정책은 파드의 veth 인터페이스에 적용되므로, VM 트래픽에도 정책 강제가 올바르게 동작해요.
  • KubeVirt 브리지 모드의 라이브 마이그레이션은 VM이 대상 호스트에서 활성화된 시점을 알아내려고, 파드의 veth 인터페이스에서 VM이 보내는 gratuitous ARP(GARP) 패킷 감지에 의존해요.

다른 KubeVirt 네트워킹 모드(예: masquerade)는 라이브 마이그레이션에 지원되지 않아요. VM이 파드 IP와 다른 IP를 사용하게 되어 IP 유지와 정책 강제가 깨지기 때문이에요.

BGP 네트워킹 필요

라이브 마이그레이션은 현재 오버레이가 없는 BGP 네트워킹을 필요로 해요. 오버레이 네트워킹(VXLAN, IP-in-IP) 지원은 향후 릴리스에 계획되어 있어요.

KubeVirt VM IP 주소 유지

Calico는 IPAM 할당 핸들로 파드의 신원이 아니라 VM의 신원을 사용해요. VM의 파드가 다시 만들어지면, 새 파드는 원본과 같은 IP 주소를 할당받아요. IPAMConfiguration 리소스로 제어되는 클러스터 전역 설정이에요.

라이브 마이그레이션

KubeVirt VM이 한 호스트에서 다른 호스트로 라이브 마이그레이션될 때, Calico가 네트워크 전환을 조율해요:

  1. 대상 파드가 목적지 호스트에 만들어지고 소스 파드와 같은 IP를 할당받아요.
  2. VM이 활성화되기 전에 목적지 호스트에 네트워크 정책이 프로그래밍돼요.
  3. VM이 대상 호스트에서 활성화되면, Calico가 라우트 우선순위를 조정해 트래픽이 새 호스트로 향하도록 해요.
  4. 설정 가능한 수렴 기간(기본 30초)이 지나면 라우트 우선순위가 원래대로 돌아가요.

정책 설정 타임아웃

라이브 마이그레이션 동안 KubeVirt는 목적지 호스트가 VM을 받을 준비가 됐는지 알아야 해요. policy_setup_timeout_seconds CNI 구성 파라미터가 라이브 마이그레이션 진행과 정책 프로그래밍을 맞물려(interlock) 주어요. CNI 플러그인은 목적지에 네트워크 정책이 갖춰질 때까지, 또는 타임아웃이 만료될 때까지 성공 보고를 늦춰요.

제한 사항

  • WireGuard는 라이브 마이그레이션과 함께 지원되지 않아요.

시작하기 전에

  • KubeVirt가 설치된 동작하는 Kubernetes 클러스터.
  • 오버레이 없는 BGP 네트워킹으로 설치된 Calico.
  • projectcalico.org/v3 리소스 접근. Calico API 서버를 설치하거나 calicoctl을 사용하세요.

방법

bridge 모드 VM에서 라이브 마이그레이션 활성화

기본값으로 KubeVirt는 파드 네트워크에 bridge 바인딩을 사용하는 VM의 라이브 마이그레이션을 허용하지 않아요. 활성화하려면 VirtualMachine 템플릿에 kubevirt.io/allow-pod-bridge-network-live-migration 어노테이션을 붙이세요:

apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
  name: my-vm
spec:
  template:
    metadata:
      annotations:
        kubevirt.io/allow-pod-bridge-network-live-migration: ""
    spec:
      domain:
        devices:
          interfaces:
            - name: default
              bridge: {}
      networks:
        - name: default
          pod: {}

어노테이션은 반드시 spec.template.metadata.annotations(VM 자체가 아니라 VMI 템플릿)에 넣어야 해요. 이 어노테이션이 없으면 KubeVirt는 bridge 바인딩을 쓰는 VM의 라이브 마이그레이션 시도를 cannot migrate VMI which does not use masquerade to connect to the pod network 같은 에러로 거부해요.

KubeVirt 설치 후 Typha 재시작

Calico가 KubeVirt CRD가 생기기 전에 설치됐다면(새 클러스터의 흔한 부트스트랩 순서예요), 라이브 마이그레이션 지원에 필요한 KubeVirt CRD(예: VirtualMachineInstanceMigration)를 Typha가 발견할 수 있도록 재시작해야 해요.

설치 환경에 맞게 네임스페이스를 조정하세요(보통 calico-system 또는 kube-system):

kubectl rollout restart deployment calico-typha -n <namespace>
kubectl rollout status deployment calico-typha -n <namespace> --timeout=60s

KubeVirt가 Calico보다 먼저 설치됐다면 이 단계는 필요 없어요.

KubeVirt VM IP 주소 유지 활성화

IP 주소 유지는 기본으로 활성화돼요. 이전에 비활성화했다면 IPAMConfiguration 리소스에서 kubeVirtVMAddressPersistence를 Enabled로 설정해 다시 켜세요:

kubectl patch ipamconfigurations default --type='merge' -p '{"spec": {"kubeVirtVMAddressPersistence": "Enabled"}}'

calicoctl을 사용할 수도 있어요:

calicoctl ipam configure --kubevirt-ip-persistence=Enabled

참고: 라이브 마이그레이션이 동작하려면 IP 주소 유지가 반드시 활성화되어 있어야 해요. 유지 기능이 비활성화되면 CNI 플러그인이 마이그레이션 대상 파드를 거부해요.

VM IP 풀의 NAT outgoing 비활성화

마이그레이션 중인 VM에서 임의 목적지로 지속적인 연결을 유지하려면, VM과 목적지 사이 경로 어디에서도 VM의 IP 주소가 SNAT되면 안 돼요. 라이브 마이그레이션이 될 KubeVirt VM이 사용하는 모든 IP 풀에서 natOutgoing을 비활성화해야 해요.

라이브 마이그레이션은 정의상 VM이 한 노드에서 다른 노드로 이동해요. VM에 natOutgoing이 설정되어 있고, VM과 클러스터 밖 서버 사이에 진행 중인 연결이 있다면, 그 서버는 연결의 발신 IP가 옛 노드 IP에서 새 노드 IP로 바뀌는 걸 보게 되고 — 아쉽지만 연결이 끊긴다는 뜻이에요.

오퍼레이터로 Calico를 설치했다면 Installation 리소스를 통해 natOutgoing을 비활성화해요:

kubectl patch installation default --type=json \
  -p '[{"op":"replace","path":"/spec/calicoNetwork/ipPools/0/natOutgoing","value":"Disabled"}]'

경로 /spec/calicoNetwork/ipPools/0은 첫 번째 IP 풀을 가리켜요. 클러스터에 풀이 여러 개라면, KubeVirt VM이 쓰는 풀의 올바른 인덱스를 찾아 경로를 맞춰 조정하세요.

경고: 오퍼레이터를 사용할 때 IPPool 리소스를 직접 패치하지 마세요 — 오퍼레이터는 Installation 리소스에서 IPPool 리소스를 조정(reconcile)하고, 직접 변경을 조용히 되돌려 놓아요.

매니페스트 기반 설치라면 IPPool 리소스에 natOutgoing: false를 직접 설정하세요.

host 엔드포인트 정책으로 라이브 마이그레이션 포트 허용

host 엔드포인트 정책을 사용한다면, 호스트 사이에서 KubeVirt 라이브 마이그레이션 포트(TCP 49152와 49153)를 허용해야 해요. 이 포트들은 libvirt/QEMU가 라이브 마이그레이션 동안 소스·목적지 노드 사이에서 VM 메모리와 블록 스토리지를 직접 전송하는 데 사용해요.

Felix의 FailsafeInboundHostPorts와 FailsafeOutboundHostPorts 구성에 추가하거나, 이 트래픽을 허용하는 적절한 host 엔드포인트 정책을 만드세요. 자세한 내용은 Failsafe 규칙을 참고하세요.

라이브 마이그레이션을 위한 정책 설정 타임아웃 구성

VM이 트래픽을 받기 시작하기 전에 목적지 호스트에 네트워크 정책이 프로그래밍되도록, 정책 설정 타임아웃을 구성하세요. 이 값은 CNI 플러그인이 성공을 보고하기 전에 정책이 프로그래밍되기를 기다리는 시간(초)을 지정해요.

오퍼레이터로 Calico를 설치했다면 Installation 리소스의 calicoNetwork 설정에 linuxPolicySetupTimeoutSeconds 필드를 구성해요:

kind: Installation
apiVersion: operator.tigera.io/v1
metadata:
  name: default
spec:
  calicoNetwork:
    linuxPolicySetupTimeoutSeconds: 10

매니페스트 기반 설치라면 CNI 네트워크 구성(보통 /etc/cni/net.d/10-calico.conflist)에 policy_setup_timeout_seconds를 직접 설정해요:

{
  "name": "k8s-pod-network",
  "cniVersion": "0.3.1",
  "plugins": [
    {
      "type": "calico",
      "policy_setup_timeout_seconds": 10,
      ...
    }
  ]
}

보안 고려 사항

VM 신원 검증

Calico의 CNI 플러그인은 Kubernetes ownerReferences로 VM 파드의 신원을 검증해요. 파드가 KubeVirt VM(영속 IP를 받으려면)이라고 주장하면, CNI 플러그인은 파드의 ownerReferences가 유효한 VirtualMachineInstance 리소스를 가리키는지 확인해요. 이렇게 임의 파드가 VM IP 주소를 주장하는 걸 막아요.

RBAC 권장 사항

파드를 만들고 VirtualMachineInstance 리소스를 읽을 수 있는 사용자는 ownerReferences를 위조해 VM의 IP 주소를 주장할 가능성이 있어요. 완화하려면:

  • KubeVirt VM이 실행되는 네임스페이스에서 파드 생성 권한을 제한하세요.
  • VirtualMachineInstance 리소스에 대한 get/list 접근을 신뢰하는 사용자와 서비스 계정으로 제한하세요.

어드미션 컨트롤러

프로덕션 배포라면 Kyverno나 OPA/Gatekeeper 같은 어드미션 컨트롤러를 사용해, KubeVirt 컨트롤러만 파드에 VirtualMachineInstance 리소스를 가리키는 ownerReferences를 설정할 수 있도록 강제하는 걸 고려하세요.

Calico 컴포넌트 권한

Calico 컴포넌트(Felix, confd, CNI 플러그인)는 KubeVirt 리소스(VirtualMachineInstance, VirtualMachineInstanceMigration 등)에 읽기 권한만 필요해요. KubeVirt 리소스를 만들거나, 수정하거나, 삭제하지 않아요.

추가 리소스

더 알아보기 (Learn more)

라이브 마이그레이션을 본격적으로 도입하기 전에 BGP 라우팅 관련 문서를 먼저 점검해 보세요. IP 유지 기능의 동작 원리가 궁금하면 IPAMConfiguration 참조 문서가 좋은 다음 읽기거예요.