하이브리드 노드에 대한 CNI 구성 - Amazon EKS

이 페이지 개선에 도움 주기

이 사용자 가이드에 기여하려면 모든 페이지의 오른쪽 창에 있는 GitHub에서 이 페이지 편집 링크를 선택합니다.

하이브리드 노드에 대한 CNI 구성

Cilium은 Amazon EKS Hybrid Nodes용 AWS 지원 CNI(컨테이너 네트워킹 인터페이스)입니다. 워크로드에 대비하려면 하이브리드 노드용 CNI를 설치해야 합니다. 하이브리드 노드는 CNI가 실행될 때까지 Not Ready 상태로 표시됩니다. Helm과 같은 도구를 선택하여 이러한 CNI를 관리할 수 있습니다. 이 페이지의 지침에서는 Cilium 수명 주기 관리(설치, 업그레이드, 삭제)를 설명합니다. Ingress, 로드 밸런싱 운영 모범 사례 및 네트워크 정책에 맞게 Cilium을 구성하는 방법은 Cilium Ingress 및 Cilium Gateway 개요, Service 유형 LoadBalancer하이브리드 노드에 대한 Kubernetes 네트워크 정책 구성 섹션을 참조하세요.

Cilium은 AWS 클라우드의 노드에서 실행할 때 AWS에서 지원되지 않습니다. Amazon VPC CNI는 하이브리드 노드와 호환되지 않으며 VPC CNI는 eks.amazonaws.com/compute-type: hybrid 레이블에 대한 반선호도로 구성됩니다.

이 페이지에 있었던 Calico 문서는 EKS Hybrid 예시 리포지토리로 옮겨졌습니다.

버전 호환성

Amazon EKS에서 지원되는 모든 Kubernetes 버전에 대해 EKS 하이브리드 노드에 대해 Cilium 버전 v1.17.x가 지원됩니다.

Amazon EKS에서 지원되는 Kubernetes 버전 목록은 Kubernetes 버전 지원을 참조하세요. EKS Hybrid Nodes는 클라우드 노드가 있는 Amazon EKS 클러스터와 동일한 Kubernetes 버전 지원을 제공합니다.

지원되는 기능

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

AWS는 EKS Hybrid Nodes에서 사용할 수 있는 Cilium의 다음 기능에 대한 기본 구성의 기술 지원을 제공합니다. AWS 지원 범위 외에 기능을 사용하려는 경우 해당 플러그인에 대한 대체 상용 지원을 받거나 Cilium 프로젝트의 문제를 해결하고 프로젝트 수정에 기여할 수 있는 전문 지식을 내부적으로 보유하는 것이 좋습니다.

Cilium 기능 AWS 지원

Kubernetes 네트워크 적합성

코어 클러스터 연결

IP 패밀리

IPv4

수명 주기 관리

Helm

네트워킹 모드

VXLAN 캡슐화

IP 주소 관리(IPAM)

Cilium IPAM 클러스터 범위

정책 네트워크

Kubernetes 네트워크 정책

Border Gateway Protocol(BGP)

Cilium BGP Control Plane

Kubernetes Ingress

Cilium Ingress, Cilium Gateway

Service LoadBalancer IP 할당

Cilium Load Balancer IPAM

Service LoadBalancer IP 주소 알림

Cilium BGP Control Plane

kube-proxy 대체

Cilium 고려 사항

  • Helm 리포지토리 - AWS는 Amazon EKS Cilium/Cilium의 Amazon Elastic Container Registry Public(Amazon ECR Public)에서 Cilium Helm 차트를 호스팅합니다. helm 명령에서 oci://public.ecr.aws/eks/cilium/cilium:1.17.6-0 URI를 사용하여 이 리포지토리를 사용할 수 있습니다. 이 주제의 명령에서는 이 리포지토리를 사용합니다. Amazon ECR Public의 Helm 리포지토리에는 특정 helm repo 명령이 유효하지 않으므로 로컬 Helm 리포지토리 이름에서 이 리포지토리를 참조할 수 없습니다. 대신 대부분의 명령에서 전체 URI를 사용합니다.

  • 기본적으로 Cilium은 캡슐화 방법으로 VXLAN을 사용하여 오버레이/터널 모드에서 실행되도록 구성됩니다. 이 모드는 기본 물리적 네트워크에 대한 요구 사항이 가장 적습니다.

  • 기본적으로 Cilium은 클러스터를 떠나는 모든 포드 트래픽의 소스 IP 주소를 노드의 IP 주소로 매스커레이딩합니다. 매스커레이딩을 비활성화하면 포드 CIDR은 온프레미스 네트워크에서 라우팅 가능해야 합니다.

  • 하이브리드 노드에서 웹후크를 실행하는 경우 포드 CIDR이 온프레미스 네트워크에서 라우팅 가능해야 합니다. 온프레미스 네트워크에서 포드 CIDR이 라우팅 가능하지 않은 경우 동일한 클러스터의 클라우드 노드에서 웹후크를 실행하는 것이 좋습니다. 자세한 내용은 하이브리드 노드용 웹후크 구성하이브리드 노드용 네트워킹 준비 섹션을 참조하세요.

  • AWS에서는 포드 CIDR이 온프레미스 네트워크에서 라우팅 가능하도록 Cilium의 내장 BGP 기능을 사용할 것을 권장합니다. 하이브리드 노드에서 Cilium BGP를 구성하는 방법에 대한 자세한 내용은 하이브리드 노드에 대한 Cilium BGP 구성 섹션을 참조하세요.

  • Cilium의 기본 IP Address Management(IPAM)를 Cluster Scope라고 하며, 여기서 Cilium 연산자는 사용자가 구성한 포드 CIDR을 기반으로 각 노드에 IP 주소를 할당합니다.

하이브리드 노드에 Cilium 설치

절차

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

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

    • 노드당 필요한 포드를 기반으로 clusterPoolIpv4MaskSize를 구성합니다. 예를 들어, 25로 구성하면 노드당 128개 포드의 세그먼트 크기는 /25가 됩니다.

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

    • kube-proxy 대체 모드에서 Cilium을 실행하는 경우 Helm 값에 kubeProxyReplacement: "true"를 설정하고 Cilium과 동일한 노드에서 실행 중인 기존 kube-proxy 배포가 없는지 확인합니다.

    • 아래 예시에서는 Cilium이 L7 네트워크 정책 및 수신에 사용하는 Envoy L7(계층 7) 프록시를 비활성화합니다. 자세한 내용은 하이브리드 노드에 대한 Kubernetes 네트워크 정책 구성Cilium Ingress 및 Cilium Gateway 개요(을)를 참조하세요.

    • 아래 예시에서는 서비스에 대해 구성한 경우 서비스 트래픽 분산이 올바르게 작동하도록 loadBalancer.serviceTopologytrue로 구성합니다. 자세한 내용은 서비스 트래픽 분산 구성 섹션을 참조하세요.

    • 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"
  2. 클러스터에 Cilium을 설치합니다.

    • CILIUM_VERSION을 Cilium 버전으로 바꿉니다(예: 1.17.5). Cilium 마이너 버전에 대한 최신 패치 버전을 사용하는 것이 좋습니다. helm search repo cilium/cilium --versions 명령을 사용하여 로컬 Helm 리포지토리에서 사용할 수 있는 최신 패치 릴리스를 찾아볼 수 있습니다.

    • 특정 kubeconfig 파일을 사용하는 경우 Helm 설치 명령과 함께 --kubeconfig 플래그를 사용합니다.

      helm install cilium oci://public.ecr.aws/eks/cilium/cilium \ --version CILIUM_VERSION \ --namespace kube-system \ --values cilium-values.yaml
  3. 다음 명령을 사용하여 Cilium 설치가 성공했는지 확인합니다. cilium-operator 배포와 각 하이브리드 노드에서 실행 중인 cilium-agent가 표시됩니다. 또한 하이브리드 노드는 이제 Ready 상태여야 합니다. 온프레미스 네트워크에 포드 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 <none> 19m v1.31.0-eks-a737599

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

Cilium 배포를 업그레이드하기 전에 Cilium 업그레이드 설명서와 업그레이드 정보를 주의 깊게 검토하여 대상 Cilium 버전의 변경 사항을 이해합니다.

  1. 명령줄 환경에 helm CLI를 설치했는지 확인합니다. 설치 지침은 Helm 설명서를 참조하세요.

  2. Cilium 업그레이드 사전 검사를 실행합니다. CILIUM_VERSION을 대상 Cilium 버전으로 바꿉니다. Cilium 마이너 버전에 대한 최신 패치 버전을 실행하는 것이 좋습니다. 지정된 마이너 Cilium 릴리스에 대한 최신 패치 릴리스는 Cilium 설명서의 안정적인 릴리스 섹션에서 확인할 수 있습니다.

    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
  3. cilium-preflight.yaml을 적용한 후 READY 포드 수가 실행 중인 Cilium 포드 수와 동일한지 확인합니다.

    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 <none> 1h20m cilium-pre-flight-check 2 2 2 2 2 <none> 7m15s
  4. READY 포드 수가 같으면 Cilium 사전 배포도 READY 1/1로 표시되어야 합니다. READY 0/1이 표시되면 업그레이드를 계속하기 전에 CNP 검증 섹션을 참조하고 배포 관련 문제를 해결합니다.

    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
  5. 사전 배포 삭제

    helm uninstall cilium-preflight --namespace kube-system
  6. helm upgrade 명령을 실행하기 전에 existing-cilium-values.yaml에서 배포 값을 보존하거나 upgrade 명령을 실행할 때 설정에 --set 명령줄 옵션을 사용합니다. 업그레이드 작업은 Cilium ConfigMap을 덮어쓰므로 업그레이드할 때 구성 값을 전달하는 것이 중요합니다.

    helm get values cilium --namespace kube-system -o yaml > existing-cilium-values.yaml
  7. 정상적인 클러스터 작업 중에는 모든 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
  8. (선택 사항) 문제로 인해 업그레이드를 롤백해야 하는 경우 다음 명령을 실행합니다.

    helm history cilium --namespace kube-system helm rollback cilium [REVISION] --namespace kube-system

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

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

    helm uninstall cilium --namespace kube-system

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

  2. 온디스크 구성 파일 및 리소스를 정리하려면 표준 구성 디렉터리를 사용하는 경우 GitHub의 Cilium 리포지토리에서 cni-uninstall.sh 스크립트에 표시된 대로 파일을 제거할 수 있습니다.

  3. 클러스터에서 Cilium 사용자 지정 리소스 정의(CRD)를 제거하려면 다음 명령을 실행할 수 있습니다.

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