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 네트워킹으로 마이그레이션(라이브 마이그레이션)
-
Calico를 설치해요.
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.33.0/manifests/flannel-migration/calico.yaml -
마이그레이션 컨트롤러를 시작해요.
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.33.0/manifests/flannel-migration/migration-job.yaml노드가 하나씩 업데이트되기 시작하는 걸 볼 수 있어요.
-
마이그레이션을 모니터링해요.
kubectl get jobs -n kube-system flannel-migration호스트 노드가 업그레이드되는 동안 마이그레이션 컨트롤러는 여러 번 재스케줄될 수 있어요. 위 명령의 출력이 1/1 completions를 보이면 설치가 완료된 거예요. 예를 들어:
NAME COMPLETIONS DURATION AGE flannel-migration 1/1 2m59s 5m9s -
마이그레이션 컨트롤러를 삭제해요.
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로 되돌려야 한다면 다음 단계를 따르세요.
-
마이그레이션 컨트롤러와 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 -
Calico로 마이그레이션된 노드를 찾아요.
kubectl get nodes -l projectcalico.org/node-network-during-migration=calico
그다음, 위에서 찾은 각 노드에 대해 다음 명령을 실행해서 Calico를 삭제해요.
-
노드를 cordon하고 drain해요.
kubectl drain <node name> -
노드에 로그인해서 CNI 구성을 제거해요.
rm /etc/cni/net.d/10-calico.conflist -
노드를 재부팅해요.
-
노드에서 flannel을 활성화해요.
kubectl label node <node name> projectcalico.org/node-network-during-migration=flannel --overwrite -
노드를 uncordon해요.
kubectl uncordon <node name>
각 노드에서 위 단계를 마쳤다면 다음 단계를 수행해요.
-
flannel 데몬셋에서
nodeSelector를 제거해요.kubectl patch ds/kube-flannel-ds -n kube-system -p '{"spec": {"template": {"spec": {"nodeSelector": null}}}}' -
모든 노드에서 마이그레이션 레이블을 제거해요.
kubectl label node --all projectcalico.org/node-network-during-migration-
다음 단계
Calico IP 주소 관리에 대해 알아보세요.
더 알아보기 (Learn more)
flannel을 쓰는 클러스터도 VXLAN 기반이라면 중단 없이 Calico로 갈아탈 수 있어요. 마이그레이션 전에 flannel 버전과 데몬셋 설치 방식 조건을 꼭 확인하세요. 마이그레이션 후에는 Calico IPAM이 제공하는 유연한 IP 관리를 활용해 보세요.