하이브리드 노드용 CNI 구성

하이브리드 노드용 CNI 구성

하이브리드 노드용 AWS 지원 CNI인 Cilium을 설치, 업그레이드, 삭제하는 방법을 설명합니다.

출처: 문서

본문

Cilium은 Amazon EKS Hybrid Nodes용 AWS 지원 CNI(Container Networking Interface)입니다. 하이브리드 노드가 워크로드를 제공할 준비가 되려면 CNI를 설치해야 합니다. 하이브리드 노드는 CNI가 실행될 때까지 Not Ready 상태로 표시됩니다. Helm 같은 선택한 도구로 CNI를 관리할 수 있습니다. 이 페이지의 지침은 Cilium 수명 주기 관리(설치, 업그레이드, 삭제)를 다룹니다. Ingress, 로드 밸런싱, 네트워크 정책용 Cilium 구성은 Cilium Ingress 및 Cilium Gateway Overview, LoadBalancer 유형 서비스, 하이브리드 노드용 Kubernetes 네트워크 정책 구성을 참조하세요.

Cilium은 AWS 클라우드의 노드에서 실행될 때 AWS에서 지원되지 않습니다. Amazon VPC CNI는 하이브리드 노드와 호환되지 않으며 VPC CNI는 eks.amazonaws.com/compute-type: hybrid 라벨에 대해 반-친화성(anti-affinity)으로 구성됩니다.

이전에 이 페이지에 있던 Calico 문서는 EKS Hybrid Examples Repository로 이동되었습니다.

버전 호환성

Cilium 버전 v1.17.x와 v1.18.x는 Amazon EKS에서 지원되는 모든 Kubernetes 버전에 대해 EKS Hybrid Nodes에서 지원됩니다.

참고

Cilium v1.18.3 커널 요구 사항 — 커널 요구 사항(Linux 커널 >= 5.10) 때문에 Cilium v1.18.3은 다음에서 지원되지 않습니다.

  • Ubuntu 20.04
  • Red Hat Enterprise Linux(RHEL) 8

시스템 요구 사항은 Cilium system requirements를 참조하세요.

Amazon EKS가 지원하는 Kubernetes 버전에 대해서는 Kubernetes 버전 지원을 참조하세요. EKS Hybrid Nodes는 클라우드 노드가 있는 Amazon EKS 클러스터와 동일한 Kubernetes 버전 지원을 갖습니다.

지원되는 기능

AWS는 오픈 소스 Cilium 프로젝트를 기반으로 하는 EKS Hybrid Nodes용 Cilium 빌드를 유지 관리합니다. Cilium에 대해 AWS에서 지원을 받으려면 AWS 유지 관리 Cilium 빌드와 지원되는 Cilium 버전을 사용해야 합니다.

AWS는 EKS Hybrid Nodes와 함께 사용하기 위한 다음 Cilium 기능의 기본 구성에 대해 기술 지원을 제공합니다. AWS 지원 범위를 벗어나는 기능을 사용할 계획이라면 Cilium에 대한 대체 상용 지원을 받거나 Cilium 프로젝트에 문제를 해결하고 수정을 기여할 사내 전문성을 확보할 것을 권장합니다.

Cilium 기능 AWS 지원
Kubernetes 네트워크 표준 준수(Kubernetes network conformance) 예
핵심 클러스터 연결성(Core cluster connectivity) 예
IP 주소 패밀리 IPv4
수명 주기 관리 Helm
네트워킹 모드 VXLAN 캡슐화
IP 주소 관리(IPAM) Cilium IPAM Cluster Scope
네트워크 정책 Kubernetes Network Policy
BGP(Border Gateway Protocol) Cilium BGP Control Plane
Kubernetes Ingress Cilium Ingress, Cilium Gateway
서비스 LoadBalancer IP 할당 Cilium Load Balancer IPAM
서비스 LoadBalancer IP 주소 광고 Cilium BGP Control Plane
kube-proxy 대체 예

Cilium 고려 사항

  • Helm 저장소 — AWS는 Amazon Elastic Container Registry Public(Amazon ECR Public)의 Amazon EKS Cilium/Cilium에 Cilium Helm 차트를 호스팅합니다. 사용 가능한 버전은 다음과 같습니다.
    • Cilium v1.17.9: oci://public.ecr.aws/eks/cilium/cilium:1.17.9-0
    • Cilium v1.18.3: oci://public.ecr.aws/eks/cilium/cilium:1.18.3-0
    • 이 주제의 명령은 이 저장소를 사용합니다. 특정 helm repo 명령은 Amazon ECR Public의 Helm 저장소에 유효하지 않으므로 로컬 Helm 저장소 이름으로 이 저장소를 참조할 수 없습니다. 대신 대부분의 명령에서 전체 URI를 사용하세요.
  • 기본적으로 Cilium은 VXLAN을 캡슐화 방법으로 오버레이/터널 모드에서 실행되도록 구성됩니다. 이 모드는 기본 물리적 네트워크에 대한 요구 사항이 가장 적습니다.
  • 기본적으로 Cilium은 클러스터를 떠나는 모든 Pod 트래픽의 소스 IP 주소를 노드의 IP 주소로 마스커레이드합니다. 마스커레이드를 비활성화하면 Pod CIDR이 온프레미스 네트워크에서 라우팅 가능해야 합니다.
  • 하이브리드 노드에서 웹훅을 실행한다면 Pod CIDR이 온프레미스 네트워크에서 라우팅 가능해야 합니다. Pod CIDR이 온프레미스 네트워크에서 라우팅 가능하지 않다면 같은 클러스터의 클라우드 노드에서 웹훅을 실행할 것을 권장합니다. 자세한 내용은 하이브리드 노드용 웹훅 구성 및 하이브리드 노드용 네트워킹 준비를 참조하세요.
  • Pod CIDR을 온프레미스 네트워크에서 라우팅 가능하게 만들기 위해 Cilium의 내장 BGP 기능을 사용할 것을 AWS는 권장합니다. 하이브리드 노드와 함께 Cilium BGP를 구성하는 방법은 하이브리드 노드용 Cilium BGP 구성을 참조하세요.
  • Cilium의 기본 IPAM(IP Address Management)은 Cluster Scope라고 하며, Cilium 운영자가 사용자 구성 Pod CIDR을 기반으로 각 노드에 IP 주소를 할당합니다.

하이브리드 노드에 Cilium 설치

절차

  1. cilium-values.yaml이라는 YAML 파일을 만듭니다. 다음 예시는 Cilium 에이전트와 운영자에게 eks.amazonaws.com/compute-type: hybrid 라벨에 대한 친화성을 설정하여 Cilium이 하이브리드 노드에서만 실행되도록 구성합니다.

  2. EKS 클러스터의 원격 Pod 네트워크에 대해 구성한 것과 동일한 Pod CIDR로 clusterPoolIpv4PodCIDRList를 구성합니다. 예: 10.100.0.0/24. Cilium 운영자는 구성된 clusterPoolIpv4PodCIDRList IP 공간 내에서 IP 주소 슬라이스를 할당합니다. Pod CIDR은 온프레미스 노드 CIDR, VPC CIDR, Kubernetes 서비스 CIDR과 겹치면 안 됩니다.

  3. 필요한 노드당 Pod 수에 따라 clusterPoolIpv4MaskSize를 구성합니다. 예를 들어 노드당 128 Pod의 /25 세그먼트 크기에는 25를 사용합니다.

  4. 클러스터에 Cilium을 배포한 후에는 clusterPoolIpv4PodCIDRList 또는 clusterPoolIpv4MaskSize를 변경하지 마세요. 자세한 내용은 클러스터 풀 확장(Expanding the cluster pool)을 참조하세요.

  5. kube-proxy 대체 모드에서 Cilium을 실행한다면 Helm 값에 kubeProxyReplacement: "true"를 설정하고 Cilium과 같은 노드에서 실행 중인 기존 kube-proxy 배포가 없는지 확인하세요.

  6. 아래 예시는 Cilium이 L7 네트워크 정책과 Ingress에 사용하는 Envoy Layer 7(L7) 프록시를 비활성화합니다. 자세한 내용은 하이브리드 노드용 Kubernetes 네트워크 정책 구성 및 Cilium Ingress and Cilium Gateway Overview를 참조하세요.

  7. 아래 예시는 서비스에 대해 구성하는 경우 Service Traffic Distribution이 올바르게 작동하도록 loadBalancer.serviceTopology: true를 구성합니다. 자세한 내용은 Service Traffic Distribution 구성을 참조하세요.

  8. Cilium의 전체 Helm 값 목록은 Cilium 문서의 Helm reference를 참조하세요.

affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: eks.amazonaws.com/compute-type
          operator: In
          values:
          - hybrid
ipam:
  mode: cluster-pool
  operator:
    clusterPoolIPv4MaskSize: 25
    clusterPoolIPv4PodCIDRList:
    - POD_CIDR
loadBalancer:
  serviceTopology: true
operator:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: eks.amazonaws.com/compute-type
            operator: In
            values:
            - hybrid
  unmanagedPodWatcher:
    restart: false
loadBalancer:
  serviceTopology: true
envoy:
  enabled: false
kubeProxyReplacement: "false"
  1. 클러스터에 Cilium을 설치합니다.
    • CILIUM_VERSION을 Cilium 버전(예: 1.17.9-0 또는 1.18.3-0)으로 바꾸세요. Cilium 마이너 버전에 최신 패치 버전을 사용할 것을 권장합니다.
    • 선택한 버전에 대해 노드가 커널 요구 사항을 충족하는지 확인하세요. Cilium v1.18.3은 Linux 커널 >= 5.10을 요구합니다.
    • 특정 kubeconfig 파일을 사용한다면 Helm install 명령과 함께 --kubeconfig 플래그를 사용하세요.
helm install cilium oci://public.ecr.aws/eks/cilium/cilium \
    --version CILIUM_VERSION \
    --namespace kube-system \
    --values cilium-values.yaml
  1. 다음 명령으로 Cilium 설치가 성공했는지 확인합니다. cilium-operator 배포와 각 하이브리드 노드에서 실행되는 cilium-agent가 보여야 합니다. 또한 하이브리드 노드가 이제 Ready 상태여야 합니다. Pod CIDR을 온프레미스 네트워크에 광고하도록 Cilium BGP를 구성하는 방법은 하이브리드 노드용 Cilium BGP 구성을 진행하세요.
kubectl get pods -n kube-system
NAME                              READY   STATUS    RESTARTS   AGE
cilium-jjjn8                      1/1     Running   0          11m
cilium-operator-d4f4d7fcb-sc5xn   1/1     Running   0          11m
kubectl get nodes
NAME                   STATUS   ROLES    AGE   VERSION
mi-04a2cf999b7112233   Ready       19m   v1.31.0-eks-a737599

하이브리드 노드에서 Cilium 업그레이드

Cilium 배포를 업그레이드하기 전에 대상 Cilium 버전의 변경 사항을 이해하기 위해 Cilium 업그레이드 문서와 업그레이드 노트를 신중히 검토하세요.

명령줄 환경에 helm CLI가 설치되어 있는지 확인하세요. 설치 지침은 Helm 문서를 참조하세요.

  1. Cilium 업그레이드 사전 점검을 실행합니다. CILIUM_VERSION을 대상 Cilium 버전으로 바꾸세요. Cilium 마이너 버전에 최신 패치 버전을 실행할 것을 권장합니다. 특정 마이너 Cilium 릴리스의 최신 패치 릴리스는 Cilium 문서의 Stable Releases 섹션에서 찾을 수 있습니다.
helm install cilium-preflight oci://public.ecr.aws/eks/cilium/cilium --version CILIUM_VERSION \
  --namespace=kube-system \
  --set preflight.enabled=true \
  --set agent=false \
  --set operator.enabled=false
  1. cilium-preflight.yaml을 적용한 후 READY Pod 수가 실행 중인 Cilium Pod 수와 같은지 확인합니다.
kubectl get ds -n kube-system | sed -n '1p;/cilium/p'
NAME                      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
cilium                    2         2         2       2            2                     1h20m
cilium-pre-flight-check   2         2         2       2            2                     7m15s
  1. READY Pod 수가 같아지면 Cilium 사전 점검 배포도 READY 1/1로 표시되는지 확인합니다. READY 0/1이면 CNP Validation 섹션을 참고하여 업그레이드 계속 전에 배포의 문제를 해결하세요.
kubectl get deployment -n kube-system cilium-pre-flight-check -w
NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
cilium-pre-flight-check   1/1     1            0           12s
  1. 사전 점검을 삭제합니다.
helm uninstall cilium-preflight --namespace kube-system
  1. helm upgrade 명령을 실행하기 전에 배포 값을 existing-cilium-values.yaml에 보존하거나 업그레이드 명령을 실행할 때 --set 명령줄 옵션으로 설정을 사용하세요. 업그레이드 작업은 Cilium ConfigMap을 덮어쓰므로 업그레이드할 때 구성 값을 전달하는 것이 중요합니다.
helm get values cilium --namespace kube-system -o yaml > existing-cilium-values.yaml
  1. 정상적인 클러스터 운영 중 모든 Cilium 구성 요소는 같은 버전을 실행해야 합니다. 다음 단계는 모든 구성 요소를 한 안정 릴리스에서 이후 안정 릴리스로 업그레이드하는 방법을 설명합니다. 한 마이너 릴리스에서 다른 마이너 릴리스로 업그레이드할 때는 기존 Cilium 마이너 버전의 최신 패치 릴리스로 먼저 업그레이드할 것을 권장합니다. 중단을 최소화하려면 upgradeCompatibility 옵션을 이 클러스터에 처음 설치한 초기 Cilium 버전으로 설정하세요.
helm upgrade cilium oci://public.ecr.aws/eks/cilium/cilium --version CILIUM_VERSION \
  --namespace kube-system \
  --set upgradeCompatibility=1.X \
  -f existing-cilium-values.yaml
  1. (선택 사항) 문제로 인해 업그레이드를 롤백해야 한다면 다음 명령을 실행하세요.
helm history cilium --namespace kube-system
helm rollback cilium [REVISION] --namespace kube-system

하이브리드 노드에서 Cilium 삭제

다음 명령을 실행하여 클러스터에서 모든 Cilium 구성 요소를 제거합니다. 참고: CNI 제거는 노드와 Pod의 상태에 영향을 줄 수 있으며 프로덕션 클러스터에서는 수행해서는 안 됩니다.

helm uninstall cilium --namespace kube-system

Cilium이 구성한 인터페이스와 경로는 CNI가 클러스터에서 제거될 때 기본적으로 제거되지 않습니다. 자세한 내용은 GitHub issue를 참조하세요.

표준 구성 디렉터리를 사용한다면 GitHub의 Cilium 저장소에 있는 cni-uninstall.sh 스크립트가 보여주듯이 디스크의 구성 파일과 자원을 정리할 수 있습니다.

클러스터에서 Cilium CRD(Custom Resource Definitions)를 제거하려면 다음 명령을 실행할 수 있습니다.

kubectl get crds -oname | grep "cilium" | xargs kubectl delete

더 알아보기 (Learn more)