반응형

📋 개요

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

📝 마이그레이션 과정 요약

  1. 기존 네트워크 상태 확인
  2. Flannel 완전 제거 (Helm + kubectl)
  3. 네트워크 인터페이스 정리
  4. kube-proxy 제거
  5. iptables 규칙 정리
  6. Cilium 설치 및 구성
  7. 마이그레이션 검증

🚀 세부 마이그레이션 단계

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 중복 확인
  • 노드 리소스 상태 확인

 

반응형

+ Recent posts