반응형
📋 개요
flannel CNI 를 아래와 같이 helm 으로 설치하였을 때, flannel CNI 를 Cilium CNI 로 마이그레이션하는 가이드입니다.
kubectl create ns kube-flannel
kubectl label --overwrite ns kube-flannel pod-security.kubernetes.io/enforce=privileged
helm repo add flannel https://flannel-io.github.io/flannel/
helm repo list
helm search repo flannel
helm show values flannel/flannel
# k8s 관련 트래픽 통신 동작하는 nic 지정
cat << EOF > flannel-values.yaml
podCidr: "10.244.0.0/16"
flannel:
args:
- "--ip-masq"
- "--kube-subnet-mgr"
- "--iface=eth1"
EOF
# helm 설치
helm install flannel --namespace kube-flannel flannel/flannel -f flannel-values.yaml
🎯 마이그레이션 목표
- Flannel CNI 완전 제거: Helm으로 설치된 Flannel을 안전하게 제거
- kube-proxy 대체: Cilium의 kube-proxy replacement 기능 활용
🔧 환경 정보
- 노드 구성: k8s-ctr (컨트롤 플레인), k8s-w1, k8s-w2 (워커 노드)
- 기존 CNI: Flannel (Helm으로 설치)
- 목표 CNI: Cilium 1.17.5
- 네트워크 대역: 172.20.0.0/16
📝 마이그레이션 과정 요약
- 기존 네트워크 상태 확인
- Flannel 완전 제거 (Helm + kubectl)
- 네트워크 인터페이스 정리
- kube-proxy 제거
- iptables 규칙 정리
- Cilium 설치 및 구성
- 마이그레이션 검증
🚀 세부 마이그레이션 단계
1️⃣ 기존 네트워크 상태 확인
마이그레이션을 시작하기 전에 현재 네트워크 상태를 확인합니다.
# 네트워크 인터페이스 확인
ip -c link
for i in w1 w2; do
echo ">> node : k8s-$i <<";
sshpass -p 'vagrant' ssh -o StrictHostKeyChecking=no vagrant@k8s-$i ip -c link;
echo;
done
# 브리지 상태 확인
brctl show
for i in w1 w2; do
echo ">> node : k8s-$i <<";
sshpass -p 'vagrant' ssh -o StrictHostKeyChecking=no vagrant@k8s-$i brctl show;
echo;
done
# 라우팅 테이블 확인
ip -c route
for i in w1 w2; do
echo ">> node : k8s-$i <<";
sshpass -p 'vagrant' ssh -o StrictHostKeyChecking=no vagrant@k8s-$i ip -c route;
echo;
done
2️⃣ Flannel 완전 제거
2-1. Helm으로 Flannel 제거
# Flannel Helm 차트 제거
helm uninstall -n kube-flannel flannel
# Helm 차트 목록 확인
helm list -A
# kube-flannel 네임스페이스 내 리소스 확인
kubectl get all -n kube-flannel
# kube-flannel 네임스페이스 삭제
kubectl delete ns kube-flannel
2-2. 네트워크 인터페이스 정리
Flannel이 생성한 가상 네트워크 인터페이스를 모든 노드에서 제거합니다.
# 컨트롤 플레인 노드에서 인터페이스 제거
ip link del flannel.1
ip link del cni0
# 워커 노드에서 인터페이스 제거
for i in w1 w2; do
echo ">> node : k8s-$i <<";
sshpass -p 'vagrant' ssh -o StrictHostKeyChecking=no vagrant@k8s-$i sudo ip link del flannel.1;
echo;
done
for i in w1 w2; do
echo ">> node : k8s-$i <<";
sshpass -p 'vagrant' ssh -o StrictHostKeyChecking=no vagrant@k8s-$i sudo ip link del cni0;
echo;
done
2-3. 제거 확인
# 네트워크 인터페이스 제거 확인
ip -c link
for i in w1 w2; do
echo ">> node : k8s-$i <<";
sshpass -p 'vagrant' ssh -o StrictHostKeyChecking=no vagrant@k8s-$i ip -c link;
echo;
done
# 브리지 제거 확인
brctl show
for i in w1 w2; do
echo ">> node : k8s-$i <<";
sshpass -p 'vagrant' ssh -o StrictHostKeyChecking=no vagrant@k8s-$i brctl show;
echo;
done
# 라우팅 테이블 정리 확인
ip -c route
for i in w1 w2; do
echo ">> node : k8s-$i <<";
sshpass -p 'vagrant' ssh -o StrictHostKeyChecking=no vagrant@k8s-$i ip -c route;
echo;
done
3️⃣ kube-proxy 제거
Cilium이 kube-proxy를 완전히 대체하므로 기존 kube-proxy를 제거합니다.
# kube-proxy DaemonSet 제거
kubectl -n kube-system delete ds kube-proxy
# kube-proxy ConfigMap 제거
kubectl -n kube-system delete cm kube-proxy
# 파드 상태 확인 (기존 파드 IP는 유지됨)
kubectl get pod -A -owide
# 네트워크 연결 테스트
kubectl exec -it curl-pod -- curl webpod
4️⃣ iptables 규칙 정리
모든 노드에서 기존 Kubernetes 및 Flannel 관련 iptables 규칙을 정리합니다.
# 현재 iptables 규칙 확인
iptables-save
# 모든 노드에서 KUBE 및 FLANNEL 규칙 제거
iptables-save | grep -v KUBE | grep -v FLANNEL | iptables-restore
iptables-save
# 워커 노드 w1에서 iptables 정리
sshpass -p 'vagrant' ssh vagrant@k8s-w1 "sudo iptables-save | grep -v KUBE | grep -v FLANNEL | sudo iptables-restore"
sshpass -p 'vagrant' ssh vagrant@k8s-w1 sudo iptables-save
# 워커 노드 w2에서 iptables 정리
sshpass -p 'vagrant' ssh vagrant@k8s-w2 "sudo iptables-save | grep -v KUBE | grep -v FLANNEL | sudo iptables-restore"
sshpass -p 'vagrant' ssh vagrant@k8s-w2 sudo iptables-save
5️⃣ Cilium 설치 및 구성
5-1. Helm 리포지토리 추가
# Cilium Helm 리포지토리 추가
helm repo add cilium https://helm.cilium.io/
5-2. Cilium 설치
고급 네트워킹 기능을 활성화하여 Cilium을 설치합니다.
helm install cilium cilium/cilium --version 1.17.5 --namespace kube-system \
--set k8sServiceHost=192.168.10.100 \
--set k8sServicePort=6443 \
--set kubeProxyReplacement=true \
--set routingMode=native \
--set autoDirectNodeRoutes=true \
--set ipam.mode="cluster-pool" \
--set ipam.operator.clusterPoolIPv4PodCIDRList={"172.20.0.0/16"} \
--set ipv4NativeRoutingCIDR=172.20.0.0/16 \
--set endpointRoutes.enabled=true \
--set installNoConntrackIptablesRules=true \
--set bpf.masquerade=true \
--set ipv6.enabled=false
5-3. 설치 옵션 설명
옵션 설명
| kubeProxyReplacement=true | kube-proxy 완전 대체 |
| routingMode=native | 네이티브 라우팅 모드 사용 |
| autoDirectNodeRoutes=true | 노드 간 직접 라우팅 활성화 |
| bpf.masquerade=true | eBPF 기반 마스커레이딩 |
| installNoConntrackIptablesRules=true | iptables 규칙 최소화 |
6️⃣ 마이그레이션 검증
6-1. 설치 상태 확인
# Helm 차트 설정 확인
helm get values cilium -n kube-system
# Helm 차트 목록 확인
helm list -A
# CRD 확인
kubectl get crd
# 파드 상태 모니터링
watch -d kubectl get pod -A
6-2. Cilium 상태 확인
# Cilium 에이전트 상태 확인
kubectl exec -it -n kube-system ds/cilium -c cilium-agent -- cilium-dbg status --verbose
예상 출력:
KubeProxyReplacement: True [eth0 10.0.2.15, eth1 192.168.10.102 (Direct Routing)]
Routing: Network: Native Host: BPF
Masquerading: BPF [eth0, eth1] 172.20.0.0/16 [IPv4: Enabled, IPv6: Disabled]
6-3. 네트워크 규칙 확인
# 컨트롤 플레인 노드 iptables 확인
iptables -t nat -S
# 모든 워커 노드 iptables 확인
for i in w1 w2; do
echo ">> node : k8s-$i <<";
sshpass -p 'vagrant' ssh vagrant@k8s-$i sudo iptables -t nat -S;
echo;
done
# 전체 iptables 규칙 확인
iptables-save
for i in w1 w2; do
echo ">> node : k8s-$i <<";
sshpass -p 'vagrant' ssh vagrant@k8s-$i sudo iptables-save;
echo;
done
✅ 마이그레이션 완료 체크리스트
- [ O ] Flannel Helm 차트 제거 완료
- [ O ] kube-flannel 네임스페이스 삭제 완료
- [ O ] 모든 노드에서 flannel.1, cni0 인터페이스 제거 완료
- [ O ] kube-proxy DaemonSet 및 ConfigMap 제거 완료
- [ O ] 모든 노드에서 iptables 규칙 정리 완료
- [ O ] Cilium 설치 및 구성 완료
- [ O ] Cilium 에이전트 정상 동작 확인
- [ O ] 네트워크 연결 테스트 통과
🔧 트러블슈팅
파드 네트워크 연결 실패
- Cilium 에이전트 로그 확인: kubectl logs -n kube-system ds/cilium -c cilium-agent
- 네트워크 정책 확인: kubectl get networkpolicies -A
iptables 규칙 충돌
- 기존 규칙 재정리: iptables-save | grep -v KUBE | grep -v FLANNEL | iptables-restore
- 노드 재부팅 후 재시도
Cilium 설치 실패
- Helm 차트 버전 확인
- 네트워크 CIDR 중복 확인
- 노드 리소스 상태 확인
반응형
'인프라 > 쿠버네티스' 카테고리의 다른 글
| [cilium] Cilium Network Policy (0) | 2025.07.21 |
|---|---|
| [cilium] Flannel 에서 Cilium 으로 무중단 마이그레이션 (3) | 2025.07.18 |
| [cilium] cilium 네트워크 패킷 흐름 (with ebpf) (1) | 2025.07.15 |
| /etc/kubernetes/pki/ vs /var/lib/kubelet/pki/ 차이점 (0) | 2025.07.02 |
| helm 명령어 정리 (0) | 2025.07.01 |