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

flannel/Canal에서 Calico로 Kubernetes 클러스터 마이그레이션

원문 보기 위키 갱신

flannel/Canal로 네트워킹하던 기존 Kubernetes 클러스터를 Calico로 전환하는 방법을 안내해요. 기존 VXLAN 데이터 플레인을 그대로 유지한 채 Calico IPAM과 고급 정책 기능을 얻을 수 있어요. 새 클러스터를 만들어 워크로드를 옮기는 방법과, 서비스 중단 없이 기존 클러스터에서 라이브 마이그레이션하는 방법 두 가지를 소개해요.

출처: 문서

본문

큰 그림

flannel/Canal을 사용하는 기존 Kubernetes 클러스터를 Calico 네트워킹으로 마이그레이션해요.

가치

이미 네트워킹에 flannel을 쓰고 있다면 Calico의 네이티브 VXLAN 네트워킹으로 쉽게 전환할 수 있어요. Calico VXLAN은 flannel vxlan과 완전히 동일하지만, 활발하게 관리되는 커뮤니티가 있는 Calico가 제공하는 훨씬 폭넓은 기능의 이점을 함께 얻을 수 있어요.

개념

flannel의 host-local IPAM 한계

Flannel 네트워킹은 host-local IPAM(IP 주소 관리) CNI 플러그인을 사용해요. 이 플러그인은 클러스터에 단순한 IP 주소 관리를 제공하지만, 단순한 만큼 한계도 있어요:

  • 노드를 만들면 노드에 CIDR이 미리 할당돼요. 노드당 파드 수가 노드별 가용 IP 주소 수를 초과하면 클러스터를 다시 만들어야 해요. 반대로 파드 수가 노드별 가용 주소 수보다 훨씬 적으면 IP 주소 공간이 비효율적으로 쓰이고, 규모를 키우다 IP 주소가 고갈되면 이 비효율이 고통 포인트가 돼요.

  • 노드마다 CIDR이 미리 할당되기 때문에, 파드는 항상 자신이 실행 중인 노드를 기준으로 IP 주소를 할당받아야 해요. 다른 속성(예: 파드의 네임스페이스)을 기준으로 IP 주소를 할당할 수 있다면, 생겨나는 다양한 사용 사례를 유연하게 맞춰갈 수 있어요.

Calico IPAM으로 마이그레이션하면 이런 사용 사례 이상의 문제들이 해결돼요. Calico IPAM의 장점은 블로그: Live Migration from Flannel to Calico에서 확인해 보세요.

Calico 네트워킹으로 마이그레이션하는 방법

클러스터를 Calico 네트워킹으로 전환하는 방법은 두 가지예요. 두 방법 모두 파드 간 VXLAN 네트워킹으로 동작하는 완전한 기능의 Calico 클러스터를 만들어 줘요.

  • Calico로 새 클러스터를 만들고 기존 워크로드를 마이그레이션

    다운타임을 크게 신경 쓰지 않고 워크로드를 한 클러스터에서 다음 클러스터로 옮길 수 있다면 이 방법이 가장 쉬워요: Calico로 새 클러스터 만들기.

  • 기존 클러스터에서 라이브 마이그레이션

    워크로드가 이미 프로덕션에 있거나 다운타임이 허용되지 않는다면, 클러스터의 각 노드를 롤링 업데이트하는 라이브 마이그레이션 도구를 사용해요.

시작하기 전에...

필수 조건

  • VXLAN 백엔드를 사용하는 flannel로 네트워킹하는 클러스터
  • Flannel v0.9.1 이상(Canal은 v3.7.0 이상)
  • Flannel은 Kubernetes 데몬셋으로 설치됐고 다음처럼 구성돼 있어야 해요:
    • (etcd가 아닌) Kubernetes API를 사용해 구성을 저장
    • DirectRouting이 비활성화됨(기본값)
  • 클러스터가 다음을 허용해야 해요:
    • 노드 레이블 추가/삭제/수정
    • flannel 데몬셋 수정 및 삭제. 예를 들어 Kubernetes 애드온 매니저로 설치된 것이면 안 돼요.

방법

flannel 네트워킹에서 Calico 네트워킹으로 마이그레이션(라이브 마이그레이션)

  1. Calico를 설치해요.

    kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.33.0/manifests/flannel-migration/calico.yaml
    
  2. 마이그레이션 컨트롤러를 시작해요.

    kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.33.0/manifests/flannel-migration/migration-job.yaml
    

    노드가 하나씩 업데이트되기 시작하는 걸 볼 수 있어요.

  3. 마이그레이션을 모니터링해요.

    kubectl get jobs -n kube-system flannel-migration
    

    호스트 노드가 업그레이드되는 동안 마이그레이션 컨트롤러는 여러 번 재스케줄될 수 있어요. 위 명령의 출력이 1/1 completions를 보이면 설치가 완료된 거예요. 예를 들어:

    NAME                COMPLETIONS   DURATION   AGE
    flannel-migration   1/1           2m59s      5m9s
    
  4. 마이그레이션 컨트롤러를 삭제해요.

    kubectl delete -f https://raw.githubusercontent.com/projectcalico/calico/v3.33.0/manifests/flannel-migration/migration-job.yaml
    

flannel 구성 수정

마이그레이션 컨트롤러는 flannel 구성을 자동으로 감지하고, 대부분 추가 구성이 필요 없어요. 특별한 구성이 필요하다면 마이그레이션 도구가 다음 옵션을 제공하고, 파드 안에서 환경 변수로 설정할 수 있어요.

구성 옵션 설명 기본값
FLANNEL_NETWORK flannel이 클러스터에 사용하는 IPv4 네트워크 CIDR이에요. 자동 감지
FLANNEL_IPV6_NETWORK flannel이 클러스터에 사용하는 IPv6 네트워크 CIDR이에요. 자동 감지
FLANNEL_DAEMONSET_NAME flannel 데몬셋의 이름이에요. kube-flannel-ds
FLANNEL_DAEMONSET_NAMESPACE flannel 데몬이 들어 있는 네임스페이스예요. kube-flannel
FLANNEL_MTU flannel VXLAN 장치의 MTU예요. 자동 감지
FLANNEL_IP_MASQ 아웃바운드 트래픽에 마스커레이딩을 사용할지 여부예요. 자동 감지
FLANNEL_SUBNET_LEN flannel이 사용하는 노드별 IPv4 서브넷 길이예요. 24
FLANNEL_IPV6_SUBNET_LEN flannel이 사용하는 노드별 IPv6 서브넷 길이예요. 64
FLANNEL_ANNOTATION_PREFIX kube-annotation-prefix 옵션으로 flannel에 전달한 값이에요. flannel.alpha.coreos.com
FLANNEL_VNI flannel 네트워크에 사용하는 VNI예요. 1
FLANNEL_PORT VXLAN에 사용하는 UDP 포트예요. 8472
CALICO_DAEMONSET_NAME kube-system 네임스페이스에 있는 calico 데몬셋의 이름이에요. calico-node
CNI_CONFIG_DIR CNI 구성 파일을 찾을 호스트상의 전체 경로예요. /etc/cni/net.d

마이그레이션 상태 보기

컨트롤러의 현재 상태를 확인해요.

kubectl get pods -n kube-system -l k8s-app=flannel-migration-controller

마이그레이션 로그 보기

마이그레이션 로그를 확인해서 추가로 해야 할 작업이 있는지 살펴봐요.

kubectl logs -n kube-system -l k8s-app=flannel-migration-controller

마이그레이션 되돌리기

클러스터를 Calico에서 다시 flannel로 되돌려야 한다면 다음 단계를 따르세요.

  1. 마이그레이션 컨트롤러와 Calico를 제거해요.

    kubectl delete -f https://raw.githubusercontent.com/projectcalico/calico/v3.33.0/manifests/flannel-migration/migration-job.yaml
    kubectl delete -f https://raw.githubusercontent.com/projectcalico/calico/v3.33.0/manifests/flannel-migration/calico.yaml
    
  2. Calico로 마이그레이션된 노드를 찾아요.

    kubectl get nodes -l projectcalico.org/node-network-during-migration=calico
    

그다음, 위에서 찾은 각 노드에 대해 다음 명령을 실행해서 Calico를 삭제해요.

  1. 노드를 cordon하고 drain해요.

    kubectl drain <node name>
    
  2. 노드에 로그인해서 CNI 구성을 제거해요.

    rm /etc/cni/net.d/10-calico.conflist
    
  3. 노드를 재부팅해요.

  4. 노드에서 flannel을 활성화해요.

    kubectl label node <node name> projectcalico.org/node-network-during-migration=flannel --overwrite
    
  5. 노드를 uncordon해요.

    kubectl uncordon <node name>
    

각 노드에서 위 단계를 마쳤다면 다음 단계를 수행해요.

  1. flannel 데몬셋에서 nodeSelector를 제거해요.

    kubectl patch ds/kube-flannel-ds -n kube-system -p '{"spec": {"template": {"spec": {"nodeSelector": null}}}}'
    
  2. 모든 노드에서 마이그레이션 레이블을 제거해요.

    kubectl label node --all projectcalico.org/node-network-during-migration-
    

다음 단계

Calico IP 주소 관리에 대해 알아보세요.

더 알아보기 (Learn more)

flannel을 쓰는 클러스터도 VXLAN 기반이라면 중단 없이 Calico로 갈아탈 수 있어요. 마이그레이션 전에 flannel 버전과 데몬셋 설치 방식 조건을 꼭 확인하세요. 마이그레이션 후에는 Calico IPAM이 제공하는 유연한 IP 관리를 활용해 보세요.