본문 바로가기
문서 목차
ORKESTRIX설치

CNI 네트워크 설치

Cilium(기본), Calico, Flannel, Multus(선택) 등 컨테이너 간 통신을 위한 CNI 네트워크를 설치합니다.

QUANTUM C&S

Cilium(기본), Calico, Flannel, Multus(선택) 등 컨테이너 간 통신을 위한 CNI 네트워크를 설치합니다.

신규 클러스터 설치 시에는 K8s 클러스터 초기화, 워커 노드 조인, 컨테이너 런타임 설치와 함께 k8s.yaml 실행 안에서 자동으로 처리됩니다. CNI 설정만 다시 적용하고 싶을 때는 아래처럼 plays/qks-cni.yaml만 따로 실행할 수도 있습니다.
검증 현황: Cilium(기본값), Calico, Flannel 옵션은 실제 서버에 설치해 검증했습니다. Multus 옵션은 코드상 지원되는 것은 확인했으나, 아직 실제로 설치 · 검증하지 않았습니다.

기본 CNI 선택 (택 1)

ubuntu.yaml의 kube_cni 값에 따라 아래 3개 중 하나만 골라 설치됩니다(셋을 동시에 설치할 수 없음).

A. Cilium (기본값)
kube_cni: "cilium" — eBPF 기반, Helm 설치. 검증 완료.
B. Calico
kube_cni: "calico" — 매니페스트 설치. 검증 완료.
C. Flannel
kube_cni: "flannel" — 매니페스트 설치. 검증 완료.

ubuntu.yaml에서 하나를 고른 뒤, 아래 A/B/C 중 그 옵션에 해당하는 섹션만 읽고 진행하면 됩니다. 세 섹션을 순서대로 다 하는 게 아닙니다.

+ 추가 옵션(택 1과는 별개): kube_cni_multus_enabled: true로 지정하면, 위에서 고른 A/B/C 위에 Multus가 추가로 얹힙니다(파드에 여러 네트워크 인터페이스 부착용, 상호배타 아님). 아래 "D. Multus" 섹션 참고. 미검증.

플레이북 실행 (A/B/C/D 공통)

신규 설치(다른 3개 항목과 함께):

./install.sh ubuntu k8s.yaml

CNI만 다시 적용:

./install.sh ubuntu plays/qks-cni.yaml

A. Cilium (기본)

eBPF 기반 CNI. kube_cni를 생략해도 기본값으로 설치됩니다. 검증 완료.

설정값

ubuntu.yaml:

kube_cni: "cilium"          # 생략 가능(기본값)
cni_cilium_version: "1.19.4"   # 생략 시 compatible-matrix.yaml의 cni_cilium_matrix[kube_version]에서 자동 결정

세부 배포 옵션(kube-proxy 대체 여부, Hubble, BGP 등)은 roles/qks-kubernetes/cni/cilium/tasks/main.yaml의 Helm set_values 목록과, inventory/qks/group_vars/all/all-k8s.yaml의 cni_cilium_* 변수들(예: cni_cilium_kube_proxy_replaced, cni_cilium_ipam_mode)에서 조정합니다.

설치 흐름

1. NetworkManager가 cilium_*/lxc* 인터페이스를 건드리지 않도록 설정
2. kube-system 네임스페이스 확인(Cilium은 kube-system에 설치됨)
3. (kube_proxy 대체 모드인 경우) kube-proxy DaemonSet 제거
4. Helm 저장소 'cilium' 등록
5. Helm으로 Cilium 배포 (release: cilium, namespace: kube-system)
   - kube-proxy 대체, Hubble(관측성 UI), BGP 컨트롤 플레인 등 다수 옵션 포함
6. 마스터 노드 수만큼 cilium 파드가 Running 될 때까지 대기
7. (멀티클러스터 clustermesh 사용 시) CoreDNS 서비스 NodePort 패치
8. CoreDNS 재시작(드물게 배포 직후 응답이 멈추는 경우 대응)

설치 확인

kubectl get pods -n kube-system | grep cilium
helm list -n kube-system | grep cilium

cilium/cilium-operator/hubble-relay/hubble-ui 파드가 Running, Helm 릴리즈가 deployed 상태인지 확인합니다.

cilium status --wait   # cilium-cli 설치되어 있는 경우

B. Calico

kube_cni: "calico"로 지정. 검증 완료.

설정값

ubuntu.yaml:

kube_cni: "calico"
# cni_calico_version: "3.26.1"   # 생략 시 compatible-matrix.yaml의 cni_calico_matrix[kube_version]에서 자동 결정

버전을 지정하면 그 마이너 버전(예: 3.26.x)에 대응하는 매니페스트 템플릿이 자동 선택됩니다 — 템플릿 파일 목록: roles/qks-kubernetes/cni/calico/templates/calico-3.{17,23,25,26,32}.x.yaml.j2. 해당 마이너 버전용 템플릿이 없으면 새로 추가해야 합니다(기존 파일을 복사해 이미지 태그만 새 버전으로 교체).

설치 흐름

1. NetworkManager가 cali*/tunl*/vxlan.calico 인터페이스를 건드리지 않도록 설정
2. 각 노드의 기본 네트워크 인터페이스 CIDR 자동 감지
3. kube-cni 네임스페이스 생성(Calico는 kube-system이 아니라 별도 네임스페이스에 설치됨)
4. Calico 매니페스트 템플릿 렌더링
   - cni_calico_version의 마이너 버전(예: 3.26)에 맞는 템플릿 파일을 자동 선택
     (roles/qks-kubernetes/cni/calico/templates/calico-3.26.x.yaml.j2 등)
5. 매니페스트 적용(kubectl apply 방식)
6. (선택) 복합 CIDR 자동감지 모드인 경우 추가 매니페스트 적용
7. (오프라인 아니고 dockerio 계정 사용 시) calico-node/calico-kube-controllers에 imagePullSecrets 패치
8. 마스터 노드 수만큼 calico-node 파드가 Running 될 때까지 대기
9. CoreDNS 재시작

설치 확인

kubectl get pods -n kube-cni

calico-node(DaemonSet, 전 노드) / calico-kube-controllers가 Running인지 확인합니다. (Cilium과 달리 kube-system이 아니라 kube-cni 네임스페이스입니다.)

calicoctl node status   # calicoctl 설치되어 있는 경우

C. Flannel

kube_cni: "flannel"로 지정. 검증 완료.

설정값

ubuntu.yaml:

kube_cni: "flannel"
# cni_flannel_version: "0.21.0"   # 생략 시 compatible-matrix.yaml의 cni_flannel_matrix[kube_version]에서 자동 결정

템플릿 파일: roles/qks-kubernetes/cni/flannel/templates/flannel-{마이너버전}.x.yaml.j2.

설치 흐름

1. kube-cni 네임스페이스 생성
2. Flannel 매니페스트 템플릿 렌더링
   - cni_flannel_version의 마이너 버전에 맞는 템플릿 파일을 자동 선택
3. 매니페스트 적용
4. 마스터 노드 수만큼 kube-flannel 파드가 Running 될 때까지 대기
5. CoreDNS 재시작

설치 확인

kubectl get pods -n kube-cni | grep flannel

kube-flannel-ds 파드(DaemonSet, 전 노드)가 전부 Running인지 확인합니다.


D. Multus (추가 옵션, A/B/C 중 하나 위에 얹음)

kube_cni_multus_enabled: true로 위 3개 CNI 중 선택한 것 위에 추가 설치(파드에 여러 네트워크 인터페이스를 부착). 아직 미검증 — 과거 검증 시도에서 동시성 관련 버그로 보류된 이력이 있습니다.

설정값

ubuntu.yaml:

kube_cni_multus_enabled: true

템플릿 파일: roles/qks-kubernetes/cni/multus/templates/{multus-ds,multus-nad,multus-pod,whereabouts}.yaml.j2. DaemonSet 설정(CNI 바이너리 경로 등)을 바꾸려면 multus-ds.yaml.j2를, IPAM 대역을 바꾸려면 multus-nad.yaml.j2/whereabouts.yaml.j2를 수정합니다.

설치 흐름 (코드 기준)

1. Multus 매니페스트 템플릿 렌더링(multus-ds.yaml, multus-nad.yaml, multus-pod.yaml, whereabouts.yaml)
2. multus-ds.yaml(DaemonSet) 적용
3. 마스터 노드 수만큼 multus 파드가 Running 될 때까지 대기
4. whereabouts.yaml(IPAM), multus-nad.yaml(NetworkAttachmentDefinition) 적용

설치 확인

kubectl get pods -n kube-cni | grep multus

설치 후 공통 확인

kubectl get nodes -o wide

전 노드가 Ready인지, CONTAINER-RUNTIME/KERNEL-VERSION 컬럼이 선택한 옵션과 일치하는지 확인합니다(CNI 설치가 끝나면 워커 조인 전이라도 마스터 노드가 Ready로 바뀝니다).

kubectl get pods -A | grep -vE "Running|Completed"

k8s.yaml 전체 실행이 끝난 뒤 클러스터 전역에서 비정상 파드가 없는지 최종 확인합니다. 아무것도 안 나오면(빈 결과) 정상입니다.

다음 단계