마구잡

Kubernetes Migrating a Calico cluster to Cilium 본문

Kubernetes

Kubernetes Migrating a Calico cluster to Cilium

MAGUJOB 2025. 1. 6. 16:57
728x90

이전 글

 

 

Kubernetes Cilium Cluster Mesh + Hubble UI 실습

Cilium은 무엇인가?Kubernetes 클러스터에서 사용할 수 있는 Container Network Interface 중 하나이며 EBF을 기반으로한 다양한 기능 (Networking, Security, Observability, Tracing)가진 CNCF 프로젝트.공식 사이트 Cilium -

mgujob.tistory.com

 

이전 글에서 언급한 Cilium Migration을 기술한다.

( 공식 사이트에서 발췌한 내용을 기반으로 작성하였으나, 명확하지 않은 부분은 경험을 토대로 작성하였습니다.

이는 정확한 정보가 아닐 수 있음을 알려드립니다. )

공식 사이트

https://docs.cilium.io/en/stable/installation/k8s-install-migration/#cni-migration

728x90

( 광고 클릭은 큰 힘이 됩니다! )


서론

공식문서 번역 - 그렇다고 합니다.
실리움은 다른 CNI로부터 이동하는 데 사용될 수 있다. 실행 중인 클러스터는 마이그레이션 사례의 복잡성에 따라 기존 트래픽을 방해하거나 완전한 클러스터 중단 또는 재구축이 필요하지 않고 노드별로 마이그레이션할 수 있다.

 

즉 클러스터를 불능 상태로 만들지 않고 마이그레이션이 가능하다는 의미인것 같다.

CNI 두개를 같이 사용해도 된다고 하는데, 이번 글에서는 이전 CNI를 지우는 시늉만 하겠다.

중론

사전준비사항 - 공식문서 발췌

 

- helm이 설치되어있어야 합니다.

- 현재 CNI에서 사용중인 다른 CIDR들과 구별되는 새로운 CIDR 정의가 필요하다. ( 그냥 다른 대역대 하나 설정하시면 됩니다. )

- VXLAN 포트가 겹치면 안된다고 한다 VXLAN 포트를 사용중일 경우 제네브나 다른 포트를 사용하라고 한다.

 

1. 예제를 기반으로 values-migration.yaml 파일을 위 항목을 적용시켜 생성한다.

operator:
  unmanagedPodWatcher:
    restart: false # Migration: Don't restart unmigrated pods
routingMode: tunnel # Migration: Optional: default is tunneling, configure as needed
tunnelProtocol: vxlan # Migration: Optional: default is VXLAN, configure as needed
tunnelPort: 8473 # Migration: Optional, change only if both networks use the same port by default
cni:
  customConf: true # Migration: Don't install a CNI configuration file
  uninstall: false # Migration: Don't remove CNI configuration on shutdown
ipam:
  mode: "cluster-pool"
  operator:
    clusterPoolIPv4PodCIDRList: ["10.100.0.0/16"] #<- CIDR 수정
policyEnforcementMode: "never" # Migration: Disable policy enforcement
bpf:
  hostLegacyRouting: true # Migration: Allow for routing between Cilium and the existing overlay

 

CIDR을 임의로 변경했다. 큰 의미는 없다.

 

2. cilium-cli 다운로드

CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)
CLI_ARCH=amd64
if [ "$(uname -m)" = "aarch64" ]; then CLI_ARCH=arm64; fi
curl -L --fail --remote-name-all https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
sha256sum --check cilium-linux-${CLI_ARCH}.tar.gz.sha256sum
sudo tar xzvfC cilium-linux-${CLI_ARCH}.tar.gz /usr/local/bin
rm cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}

 

3. cilium initial value.yaml 생성

cilium install --version 1.16.5 --values values-migration.yaml --dry-run-helm-values > values-initial.yaml
cat values-initial.yaml 
bpf:
  hostLegacyRouting: true
cluster:
  name: kubernetes
cni:
  customConf: true
  uninstall: false
ipam:
  mode: cluster-pool
  operator:
    clusterPoolIPv4PodCIDRList:
    - 10.245.0.0/16
operator:
  replicas: 1
  unmanagedPodWatcher:
    restart: false
policyEnforcementMode: never
routingMode: tunnel
tunnelPort: 8473
tunnelProtocol: vxlan

 

4. cilium install (with helm)

helm repo add cilium https://helm.cilium.io/
helm install cilium cilium/cilium --namespace kube-system --values values-initial.yaml

NAME: cilium
LAST DEPLOYED: Mon Jan  6 13:56:17 2025
NAMESPACE: kube-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
You have successfully installed Cilium with Hubble.

Your release version is 1.16.5.

For any further help, visit https://docs.cilium.io/en/v1.16/gettinghelp
혹시 cilium pod가 지속적으로 CrashLoopBackOff 상태이고 log 확인시 /hostbin/cilium-mount의 권한 문제로 나올 경우 호스트의 /opt/cni/bin 디렉터리의 권한 문제인 경우가 있다. 해당 권한을 올바르게 변경하면 해결된다.

 

5. cilium status

cilium status 
    /¯¯\
 /¯¯\__/¯¯\    Cilium:             OK
 \__/¯¯\__/    Operator:           OK
 /¯¯\__/¯¯\    Envoy DaemonSet:    OK
 \__/¯¯\__/    Hubble Relay:       disabled
    \__/       ClusterMesh:        disabled

DaemonSet              cilium             Desired: 4, Ready: 4/4, Available: 4/4
DaemonSet              cilium-envoy       Desired: 4, Ready: 4/4, Available: 4/4
Deployment             cilium-operator    Desired: 1, Ready: 1/1, Available: 1/1
Containers:            cilium             Running: 4
                       cilium-envoy       Running: 4
                       cilium-operator    Running: 1
Cluster Pods:          0/26 managed by Cilium
Helm chart version:    1.16.5
Image versions         cilium             quay.io/cilium/cilium:v1.16.5@sha256:758ca0793f5995bb938a2fa219dcce63dc0b3fa7fc4ce5cc851125281fb7361d: 4
                       cilium-envoy       quay.io/cilium/cilium-envoy:v1.30.8-1733837904-eaae5aca0fb988583e5617170a65ac5aa51c0aa8@sha256:709c08ade3d17d52da4ca2af33f431360ec26268d288d9a6cd1d98acc9a1dced: 4
                       cilium-operator    quay.io/cilium/operator-generic:v1.16.5@sha256:f7884848483bbcd7b1e0ccfd34ba4546f258b460cb4b7e2f06a1bcc96ef88039: 1

 

6. cilium migration 인수 파일 생성 

cat <<EOF | kubectl apply --server-side -f -
apiVersion: cilium.io/v2
kind: CiliumNodeConfig
metadata:
  namespace: kube-system
  name: cilium-default
spec:
  nodeSelector:
    matchLabels:
      io.cilium.migration/cilium-default: "true"
  defaults:
    write-cni-conf-when-ready: /host/etc/cni/net.d/05-cilium.conflist
    custom-cni-conf: "false"
    cni-chaining-mode: "none"
    cni-exclusive: "true"
EOF

 

7. migration 실행  - 워커 노드 부터 migration하는걸 권장한다고 한다.

공식 문서에선 각 노드를 변수로 지정하여 진행하지만 해당 사항은 필수가 아니며,
Drain 또한 필수는 아니다.
물론 권장 사항이기에 해당 글에선 공식 문서대로 진행한다.
NODE="ubuntu-w2"

kubectl cordon $NODE
kubectl drain --ignore-daemonsets $NODE

 

7-1. cilium label 지정

kubectl label node $NODE --overwrite "io.cilium.migration/cilium-default=true"

node/ubuntu-w2 labeled

 

7-2. cilium pod rollout

kubectl -n kube-system delete pod --field-selector spec.nodeName=$NODE -l k8s-app=cilium
kubectl -n kube-system rollout status ds/cilium -w

pod "cilium-4mstp" deleted
Waiting for daemon set "cilium" rollout to finish: 3 of 4 updated pods are available...
daemon set "cilium" successfully rolled out

 

7-3. 노드 재부팅

재부팅 노드에서

sudo init 6

 

7-4. 재부팅 완료시 노드 uncordon

kubectl uncordon ubuntu-w2
node/ubuntu-w2 uncordoned

 

7-5. cilium status 확인 & 확인 완료시 타 노드 반복

cilium status
    /¯¯\
 /¯¯\__/¯¯\    Cilium:             OK
 \__/¯¯\__/    Operator:           OK
 /¯¯\__/¯¯\    Envoy DaemonSet:    OK
 \__/¯¯\__/    Hubble Relay:       disabled
    \__/       ClusterMesh:        disabled

DaemonSet              cilium             Desired: 4, Ready: 4/4, Available: 4/4
DaemonSet              cilium-envoy       Desired: 4, Ready: 4/4, Available: 4/4
Deployment             cilium-operator    Desired: 1, Ready: 1/1, Available: 1/1
Containers:            cilium             Running: 4
                       cilium-envoy       Running: 4
                       cilium-operator    Running: 1
Cluster Pods:          7/26 managed by Cilium
Helm chart version:    1.16.5
Image versions         cilium             quay.io/cilium/cilium:v1.16.5@sha256:758ca0793f5995bb938a2fa219dcce63dc0b3fa7fc4ce5cc851125281fb7361d: 4
                       cilium-envoy       quay.io/cilium/cilium-envoy:v1.30.8-1733837904-eaae5aca0fb988583e5617170a65ac5aa51c0aa8@sha256:709c08ade3d17d52da4ca2af33f431360ec26268d288d9a6cd1d98acc9a1dced: 4
                       cilium-operator    quay.io/cilium/operator-generic:v1.16.5@sha256:f7884848483bbcd7b1e0ccfd34ba4546f258b460cb4b7e2f06a1bcc96ef88039: 1

 

8. final conifg 진행

하기 final config 진행시 primary CNI 설정, NetworkPolicy 설정, 타 CNI 사용중인 POD, EBPF 설정등을 진행한다.
cilium install --version 1.16.5 --values /home/cilium/values-initial.yaml   --dry-run-helm-values ​​--set operator.unmanagedPodWatcher.restart=true --set cni.customConf=false --set policyEnforcementMode=default --set bpf.hostLegacyRouting=false > values-final.yaml
diff values-initial.yaml values-final.yaml

2c2
<   hostLegacyRouting: true
---
>   hostLegacyRouting: false
6c6
<   customConf: true
---
>   customConf: false
17c17
< policyEnforcementMode: never
---
> policyEnforcementMode: default
위 values.initial.yaml은 절대 경로를 주어 생성하는게 정신 건강에 이롭다.
helm upgrade --namespace kube-system cilium cilium/cilium --values values-final.yaml
kubectl -n kube-system rollout restart daemonset cilium
cilium status --wait

Release "cilium" has been upgraded. Happy Helming!
NAME: cilium
LAST DEPLOYED: Mon Jan  6 15:46:42 2025
NAMESPACE: kube-system
STATUS: deployed
REVISION: 2
TEST SUITE: None
NOTES:
You have successfully installed Cilium with Hubble.

Your release version is 1.16.5.

For any further help, visit https://docs.cilium.io/en/v1.16/gettinghelp
daemonset.apps/cilium restarted
    /¯¯\
 /¯¯\__/¯¯\    Cilium:             OK
 \__/¯¯\__/    Operator:           OK
 /¯¯\__/¯¯\    Envoy DaemonSet:    OK
 \__/¯¯\__/    Hubble Relay:       disabled
    \__/       ClusterMesh:        disabled

DaemonSet              cilium             Desired: 4, Ready: 4/4, Available: 4/4
DaemonSet              cilium-envoy       Desired: 4, Ready: 4/4, Available: 4/4
Deployment             cilium-operator    Desired: 1, Ready: 1/1, Available: 1/1
Containers:            cilium             Running: 4
                       cilium-envoy       Running: 4
                       cilium-operator    Running: 1
Cluster Pods:          22/26 managed by Cilium
Helm chart version:    1.16.5
Image versions         cilium             quay.io/cilium/cilium:v1.16.5@sha256:758ca0793f5995bb938a2fa219dcce63dc0b3fa7fc4ce5cc851125281fb7361d: 4
                       cilium-envoy       quay.io/cilium/cilium-envoy:v1.30.8-1733837904-eaae5aca0fb988583e5617170a65ac5aa51c0aa8@sha256:709c08ade3d17d52da4ca2af33f431360ec26268d288d9a6cd1d98acc9a1dced: 4
                       cilium-operator    quay.io/cilium/operator-generic:v1.16.5@sha256:f7884848483bbcd7b1e0ccfd34ba4546f258b460cb4b7e2f06a1bcc96ef88039: 1
22/26 managed by Cilium 표시를 보게 되면 현재 클러스터 위 존재하는 파드 26개 중 22개가 cilium으로 매니징 되는걸 알 수 있다.
4개가 빠진 이유는 클러스터 노드 하나는 순정 상태를 유지하고 있어 위처럼 빠져있는것

 

 

8-1.  pre conifg 삭제

kubectl delete -n kube-system ciliumnodeconfig cilium-default

 

8-2. 기존 CNI 제거

이후 칼리코 혹은 플란넬과 같은 기존 CNI는 제거를 하면 되지만, 유지하여도 큰 문제가 없기에 삭제하지는 않는다.

이후 이전 cilium 운영 글에서 진행한 hubble ui 및 클러스터 연동을 진행하면 기본적인 운영 준비는 끝난다.

 


중요

잘못된 정보나, 문의등은 댓글로 메일과 함께 적어주시면 감사하겠습니다.

 

 

 

 

 

 

728x90