

 **이 페이지 개선에 도움 주기** 

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

# 하이브리드 노드에 대한 CNI 구성
<a name="hybrid-nodes-cni"></a>

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

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

이 페이지에 있었던 Calico 문서는 [EKS Hybrid 예시 리포지토리](https://github.com/aws-samples/eks-hybrid-examples)로 옮겨졌습니다.

## 버전 호환성
<a name="hybrid-nodes-cilium-version-compatibility"></a>

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

**참고**  
 **Cilium v1.18.3 커널 요구 사항**: 커널 요구 사항(Linux 커널 5.10 이상)으로 인해 Cilium v1.18.3은 다음에서 지원되지 않습니다.
+ Ubuntu 20.04
+ Red Hat Enterprise Linux(RHEL) 8

시스템 요구 사항은 [Cilium 시스템 요구 사항](https://docs.cilium.io/en/stable/operations/system_requirements/)을 참조하세요.

Amazon EKS에서 지원되는 Kubernetes 버전 목록은 [Kubernetes 버전 지원](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)을 참조하세요. EKS Hybrid Nodes는 클라우드 노드가 있는 Amazon EKS 클러스터와 동일한 Kubernetes 버전 지원을 제공합니다.

## 지원되는 기능
<a name="hybrid-nodes-cilium-support"></a>

 AWS는 오픈 소스 [Cilium 프로젝트](https://github.com/cilium/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 고려 사항
<a name="hybrid-nodes-cilium-considerations"></a>
+  **Helm 리포지토리** - AWS는 [Amazon EKS Cilium/Cilium](https://gallery.ecr.aws/eks/cilium/cilium)의 Amazon Elastic Container Registry Public(Amazon ECR Public)에서 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` 

    이 주제의 명령에서는 이 리포지토리를 사용합니다. Amazon ECR Public의 Helm 리포지토리에는 특정 `helm repo` 명령이 유효하지 않으므로 로컬 Helm 리포지토리 이름에서 이 리포지토리를 참조할 수 없습니다. 대신 대부분의 명령에서 전체 URI를 사용합니다.
+ 기본적으로 Cilium은 [캡슐화 방법](https://docs.cilium.io/en/stable/network/concepts/routing/#encapsulation)으로 VXLAN을 사용하여 오버레이/터널 모드에서 실행되도록 구성됩니다. 이 모드는 기본 물리적 네트워크에 대한 요구 사항이 가장 적습니다.
+ 기본적으로 Cilium은 클러스터를 떠나는 모든 포드 트래픽의 소스 IP 주소를 노드의 IP 주소로 [매스커레이딩](https://docs.cilium.io/en/stable/network/concepts/masquerading/)합니다. 매스커레이딩을 비활성화하면 포드 CIDR은 온프레미스 네트워크에서 라우팅 가능해야 합니다.
+ 하이브리드 노드에서 웹후크를 실행하는 경우 포드 CIDR이 온프레미스 네트워크에서 라우팅 가능해야 합니다. 온프레미스 네트워크에서 포드 CIDR이 라우팅 가능하지 않은 경우 동일한 클러스터의 클라우드 노드에서 웹후크를 실행하는 것이 좋습니다. 자세한 내용은 [하이브리드 노드용 웹후크 구성](hybrid-nodes-webhooks.md) 및 [하이브리드 노드용 네트워킹 준비](hybrid-nodes-networking.md) 섹션을 참조하세요.
+  AWS에서는 포드 CIDR이 온프레미스 네트워크에서 라우팅 가능하도록 Cilium의 내장 BGP 기능을 사용할 것을 권장합니다. 하이브리드 노드에서 Cilium BGP를 구성하는 방법에 대한 자세한 내용은 [하이브리드 노드에 대한 Cilium BGP 구성](hybrid-nodes-cilium-bgp.md) 섹션을 참조하세요.
+ Cilium의 기본 IP Address Management(IPAM)를 [Cluster Scope](https://docs.cilium.io/en/stable/network/concepts/ipam/cluster-pool/)라고 하며, 여기서 Cilium 연산자는 사용자가 구성한 포드 CIDR을 기반으로 각 노드에 IP 주소를 할당합니다.

## 하이브리드 노드에 Cilium 설치
<a name="hybrid-nodes-cilium-install"></a>

### 절차
<a name="_procedure"></a>

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](https://docs.cilium.io/en/stable/network/concepts/ipam/cluster-pool/#expanding-the-cluster-pool)을 참조하세요.
   + kube-proxy 대체 모드에서 Cilium을 실행하는 경우 Helm 값에 `kubeProxyReplacement: "true"`를 설정하고 Cilium과 동일한 노드에서 실행 중인 기존 kube-proxy 배포가 없는지 확인합니다.
   + 아래 예시에서는 Cilium이 L7 네트워크 정책 및 수신에 사용하는 Envoy L7(계층 7) 프록시를 비활성화합니다. 자세한 내용은 [하이브리드 노드에 대한 Kubernetes 네트워크 정책 구성](hybrid-nodes-network-policies.md) 및 [Cilium Ingress 및 Cilium Gateway 개요](hybrid-nodes-ingress.md#hybrid-nodes-ingress-cilium)(을)를 참조하세요.
   + 아래 예시에서는 서비스에 대해 구성한 경우 서비스 트래픽 분산이 올바르게 작동하도록 `loadBalancer.serviceTopology`를 `true`로 구성합니다. 자세한 내용은 [서비스 트래픽 분산 구성](hybrid-nodes-webhooks.md#hybrid-nodes-mixed-service-traffic-distribution) 섹션을 참조하세요.
   + Cilium의 Helm 값 전체 목록은 Cilium 설명서의 [Helm reference](https://docs.cilium.io/en/stable/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 설치 명령과 함께 `--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` 상태여야 합니다. 온프레미스 네트워크에 포드 CIDR을 알리도록 Cilium BGP를 구성하는 방법에 대한 자세한 내용은 [하이브리드 노드에 대한 Cilium BGP 구성](hybrid-nodes-cilium-bgp.md) 섹션을 참조하세요.

   ```
   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 업그레이드
<a name="hybrid-nodes-cilium-upgrade"></a>

Cilium 배포를 업그레이드하기 전에 [Cilium 업그레이드 설명서](https://docs.cilium.io/en/v1.17/operations/upgrade/)와 업그레이드 정보를 주의 깊게 검토하여 대상 Cilium 버전의 변경 사항을 이해합니다.

1. 명령줄 환경에 `helm` CLI를 설치했는지 확인합니다. 설치 지침은 [Helm 설명서](https://helm.sh/docs/intro/quickstart/)를 참조하세요.

1. Cilium 업그레이드 사전 검사를 실행합니다. `CILIUM_VERSION`을 대상 Cilium 버전으로 바꿉니다. Cilium 마이너 버전에 대한 최신 패치 버전을 실행하는 것이 좋습니다. 지정된 마이너 Cilium 릴리스에 대한 최신 패치 릴리스는 Cilium 설명서의 [안정적인 릴리스 섹션](https://github.com/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` 포드 수가 실행 중인 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
   ```

1. READY 포드 수가 같으면 Cilium 사전 배포도 READY 1/1로 표시되어야 합니다. READY 0/1이 표시되면 업그레이드를 계속하기 전에 [CNP 검증](https://docs.cilium.io/en/v1.17/operations/upgrade/#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`에서 배포 값을 보존하거나 upgrade 명령을 실행할 때 설정에 `--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 삭제
<a name="hybrid-nodes-cilium-delete"></a>

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

   ```
   helm uninstall cilium --namespace kube-system
   ```

   CNI가 클러스터에서 제거되면 Cilium에서 구성한 인터페이스 및 경로가 기본적으로 제거되지 않습니다. 자세한 내용은 [GitHub issue](https://github.com/cilium/cilium/issues/34289)를 참조하세요.

1. 온디스크 구성 파일 및 리소스를 정리하려면 표준 구성 디렉터리를 사용하는 경우 GitHub의 Cilium 리포지토리에서 [`cni-uninstall.sh` 스크립트](https://github.com/cilium/cilium/blob/main/plugins/cilium-cni/cni-uninstall.sh)에 표시된 대로 파일을 제거할 수 있습니다.

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

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