AWS ENI

AWS ENI

AWS ENI 할당자는 AWS 클라우드의 Cilium 배포에 특화되어 있으며 AWS EC2 API와 통신해 AWS Elastic Network Interfaces (ENI)의 IP에 기반해 IP 할당을 수행해요. 이 글에서는 아키텍처, 구성, IPv6 사용, 운영 세부 사항을 알아볼게요.

출처: AWS ENI

본문

AWS ENI 할당자는 AWS 클라우드에서 실행되는 Cilium 배포에 특화되어 있으며 AWS EC2 API와 통신해 AWS Elastic Network Interfaces (ENI)의 IP에 기반해 IP 할당을 수행합니다.

아키텍처는 대규모 클러스터에서 속도 제한 문제를 피하기 위해 단일 operator만 EC2 서비스 API와 통신하도록 보장합니다. 사전 할당 워터마크는 클러스터에 새 Pod가 스케줄될 때 EC2 API에 연락할 필요 없이 노드에서 항상 사용 가능한 IP 주소 수를 유지하는 데 사용됩니다.

Note

ENI IPAM 모드는 베타 용량으로 IPv6를 지원합니다. #ipam-eni-ipv6 IPv6 사용을 참고하세요. 이는 GitHub issue 18405에서 추적되고 있습니다.

아키텍처

AWS ENI 할당자는 multi-pool 할당자 위에 구축됩니다. 각 노드는 해당 노드에서 Cilium이 처음 시작될 때 노드 이름과 일치하는 ciliumnodes.cilium.io 사용자 지정 리소스를 만듭니다. EC2 메타데이터 API에 연락해 인스턴스 ID, 인스턴스 유형, VPC 정보를 검색한 다음 이 정보로 사용자 지정 리소스를 채웁니다. ENI 할당 매개변수는 에이전트 구성 옵션으로 제공되고 사용자 지정 리소스에도 전달됩니다.

Cilium operator는 새 ciliumnodes.cilium.io 사용자 지정 리소스를 수신하고 IPAM 측면을 자동으로 관리하기 시작합니다. 연결된 IP가 있는 기존 ENI에 대해 EC2 인스턴스를 스캔하고 이를 status.eni.enis 필드에 ENI별로 발행합니다. 그런 다음 각 에이전트가 spec.ipam.pools.requested 에 보고하는 총 IP 수요를 지속적으로 모니터링하고 IP 사전 할당 워터마크를 충족하기 위해 필요에 따라 자동으로 ENI를 만들고 더 많은 IP를 할당합니다. 이렇게 하면 항상 IP가 사용 가능하도록 보장됩니다.

operator와 agent 간의 책임 분담

operator는 EC2 API와 통신하는 유일한 구성 요소입니다. ENI 수명 주기(생성, 연결, 삭제)와 IP/접두사 할당을 소유하며, 각 CiliumNode 의 status.eni.enis 에 결과 상태를 기록합니다.

각 노드의 Cilium 에이전트는 status.eni.enis 를 소비해 이를 multi-pool 할당자의 관점으로 변환합니다:

  • 각 보조 IP는 호스트 접두사 CIDR(IPv4의 /32 )이 되고, 각 위임된 접두사는 원래 CIDR(IPv4의 /28 , IPv6의 /80 )로 유지됩니다. 이러한 CIDR은 spec.ipam.pools.allocated 의 default 풀 아래에 발행됩니다.
  • 에이전트는 해당 CIDR에서 로컬로 Pod IP를 할당합니다. CRD 할당자와 달리 각 할당에 대해 status.ipam.used 에 per-IP 항목을 쓰지 않아요.
  • 에이전트는 spec.ipam.pools.requested 의 default 풀 아래에서 총 수요를 ipv4-addrs 와 ipv6-addrs 로 나눠 보고하며, operator는 이를 읽어 IP, 접두사, ENI를 얼마나 프로비저닝할지 결정합니다.

표준 multi-pool 모드에서는 operator가 클러스터 전체 CiliumPodIPPool 리소스에서 spec.ipam.pools.allocated 를 쓰지만, ENI 모드에서는 에이전트가 spec.ipam.pools.allocated 의 유일한 작성자이고 이를 operator가 유지하는 status.eni.enis 에서 파생한다는 점에 주의하세요. CiliumPodIPPool 리소스는 관여하지 않으며, 표준 multi-pool 모드에서 풀을 선택하는 데 사용되는 ipam.cilium.io/ip-pool pod 애노테이션도 지원되지 않습니다. 모든 할당은 default 풀에서 나옵니다.

할당에 사용할 서브넷 선택과 새 ENI에 보안 그룹 연결은 각 노드에 대해 개별적으로 제어할 수 있습니다. 이를 통해 개별 노드에 서로 다른 보안 그룹으로 Pod IP를 제공할 수 있어요.

해당 데이터패스는 AWS ENI 섹션에 설명되어 있습니다.

구성

Cilium 에이전트와 operator는 --ipam=eni 옵션으로 실행되거나 ConfigMap에서 ipam: eni 옵션이 설정되어야 합니다. 이렇게 하면 노드 에이전트와 operator 모두에서 ENI 할당이 활성화됩니다. Helm으로 설치할 때는 eni.enabled=true 플래그도 설정해야 해요. 이 플래그는 operator 이미지 선택, 엔드포인트 라우팅 활성화, CiliumNode 관리, IPv4 마스커레이드 기본값 같은 AWS ENI 환경의 모든 요구사항을 구성합니다.

대부분의 시나리오에서 에이전트가 노드에서 처음 시작할 때 ciliumnodes.cilium.io 사용자 지정 리소스를 자동으로 만드는 것이 합리적입니다. 이를 활성화하려면 --auto-create-cilium-node-resource 옵션을 지정하거나 ConfigMap에서 auto-create-cilium-node-resource: "true" 를 설정하세요.

IPv4가 제한되면 --aws-release-excess-ips=true 옵션으로 Operator를 실행하세요. 활성화되면 operator는 IPv4 수를 정기적으로 확인하고 ENI에서 초과된 여유 IPv4를 해제하려고 시도합니다.

Operator에서 --enable-metrics 옵션으로 메트릭을 활성화하는 것도 일반적으로 좋습니다. Prometheus 설치 및 Grafana 대시보드 실행 방법에 대한 추가 정보는 Prometheus & Grafana 실행하기 섹션을 참고하세요.

기본적으로 ENI는 클러스터 이름으로 태그되어, Cilium Operator가 방치된 ENI를 가비지 컬렉션할 수 있게 합니다. 클러스터 이름은 Cilium 자신의 cluster-name 플래그에서 또는 operator의 EC2 인스턴스에 있는 aws:eks:cluster-name 태그에서 추출됩니다. 둘 다 사용할 수 없으면 정적 기본 클러스터 이름이 가정되고 ENI 가비지 컬렉션이 모든 이러한 무명 클러스터에 걸쳐 수행됩니다. 클러스터 특유의 --eni-gc-tags 태그 집합을 설정해 이 동작을 오버라이드할 수 있어요.

사용자 지정 ENI 구성

사용자 지정 ENI 구성은 Helm 또는 사용자 지정 CNI 구성 ConfigMap 으로 정의할 수 있어요.

같은 필드에 대해 Helm과 Custom CNI를 모두 구성하면 Custom CNI가 Helm 구성보다 우선합니다.

Helm

ENI 구성은 --set 플래그 또는 값 파일을 사용해 Helm으로 지정할 수 있어요.

다음 예시는 Cilium을 다음과 같이 구성합니다:

  • foo=bar 태그가 있는 서브넷을 사용해 ENI 생성
  • pod IP 할당을 위한 첫 번째 인터페이스로 인덱스 1 사용
  • 최소 할당 IP 수를 10으로 설정

Helm RepositoryOCI Registry

helm upgrade cilium cilium/cilium --version 1.20.2 \
   --namespace kube-system \
   --reuse-values \
   --set eni.enabled=true \
   --set eni.nodeSpec.subnetTags={foo=bar} \
   --set eni.nodeSpec.firstInterfaceIndex=1 \
   --set ipam.nodeSpec.ipamMinAllocate=10
helm upgrade cilium oci://quay.io/cilium/charts/cilium 1.20.2 \
   --namespace kube-system \
   --reuse-values \
   --set eni.enabled=true \
   --set eni.nodeSpec.subnetTags={foo=bar} \
   --set eni.nodeSpec.firstInterfaceIndex=1 \
   --set ipam.nodeSpec.ipamMinAllocate=10

사용 가능한 옵션의 전체 목록은 Helm Reference 섹션의 eni.nodeSpec 과 ipam.nodeSpec 섹션에서 찾을 수 있어요.

CNI 구성 만들기

아래 템플릿을 기반으로 cni-config.yaml 파일을 만드세요. AWS의 서브넷에 태그가 적용되어 있다고 가정하고 subnet-tags 필드를 채웁니다:

apiVersion: v1
kind: ConfigMap
metadata:
  name: cni-configuration
  namespace: kube-system
data:
  cni-config: |-
    {
      "cniVersion":"0.3.1",
      "name":"cilium",
      "plugins": [
        {
          "cniVersion":"0.3.1",
          "type":"cilium-cni",
          "eni": {
            "subnet-tags":{
              "foo":"true"
            }
          }
        }
      ]
    }

CNI 구성 파일의 eni 또는 ipam 섹션에 추가 매개변수를 구성할 수 있어요. 지원되는 옵션에 대한 참조는 아래 ENI 할당 매개변수 목록을 참고하세요.

ConfigMap 을 배포합니다:

kubectl apply -f cni-config.yaml

subnet-tags-filter로 Cilium 구성

위의 지침으로 Cilium과 CNI 구성을 배포할 때 Helm에 다음 추가 인자를 지정하세요:

--set cni.customConf=true \
--set cni.configMap=cni-configuration

ENI 할당 매개변수

ENI 생성과 IP 할당을 제어하는 다음 매개변수가 있습니다:

  • InstanceType: AWS EC2 인스턴스 유형. –auto-create-cilium-node-resource 를 사용하면 자동으로 채워지는 필드입니다.
  • spec.eni.vpc-id: ENI 생성과 IP 할당을 위한 AWS 서브넷을 선택하는 데 사용되는 VPC 식별자. –auto-create-cilium-node-resource 를 사용하면 자동으로 채워지는 필드입니다.
  • spec.eni.availability-zone: ENI 생성과 IP 할당을 위한 AWS 서브넷을 선택하는 데 사용되는 가용 영역. –auto-create-cilium-node-resource 를 사용하면 자동으로 채워지는 필드입니다.
  • spec.eni.node-subnet-id: 노드의 첫 번째 ENI의 서브넷 ID. 서브넷 ID나 태그가 구성되지 않은 경우 서브넷 선택의 폴백으로 사용됩니다. –auto-create-cilium-node-resource 를 사용하면 자동으로 채워지는 필드입니다.
  • spec.ipam.min-allocate: 노드가 처음 부트스트랩될 때 반드시 할당되어야 하는 최소 IP 수. 사용 가능해야 하는 최소 기본 주소 소켓 수를 정의합니다. 이 워터마크에 도달하면 PreAllocate와 MaxAboveWatermark 로직이 인계받아 IP 할당을 계속합니다. 지정하지 않으면 최소 IP 수가 요구되지 않습니다.
  • spec.ipam.pre-allocate: 항상 할당에 사용 가능해야 하는 IP 주소 수. operator가 개입할 필요 없이 즉시 사용 가능한 주소 버퍼를 정의합니다. 지정하지 않으면 이 값은 기본적으로 8입니다.
  • spec.ipam.static-ip-tags: 노드에 정적 IP를 할당할 IP 풀을 선택하는 태그 맵. 지정하지 않으면 태그가 필요하지 않습니다.
  • spec.eni.first-interface-index: IP 할당에 사용할 첫 번째 ENI의 인덱스. 예를 들어 노드에 eth0 , eth1 , eth2 가 있고 FirstInterfaceIndex가 1이면 IP 할당에 eth1 과 eth2 만 사용되고 eth0 은 PodIP 할당에 무시됩니다. 지정하지 않으면 이 값은 기본적으로 0이며 eth0 이 pod IP에 사용된다는 뜻입니다.
  • spec.eni.security-group-tags: 생성되어 인스턴스에 연결된 ENI에 연결할 보안 그룹을 필터링하는 태그 목록. 지정하지 않으면 spec.eni.security-groups 필드에 전달된 보안 그룹 ID가 사용됩니다.
  • spec.eni.security-groups: 생성되어 인스턴스에 연결된 ENI에 연결할 보안 그룹 ID 목록. 지정하지 않으면 eth0 의 보안 그룹 ID가 사용됩니다.
  • spec.eni.subnet-ids: IP 할당을 위한 AWS 서브넷을 선택하는 데 사용되는 서브넷 ID. 인스턴스의 가용 영역과 VPC 일치 요구사항에 추가되는 요구사항입니다. 이 매개변수는 spec.eni.subnet-tags 와 상호 배타적이며 우선합니다. 지정하지 않으면 operator가 사용 가능한 IP가 가장 많은 AZ의 사용 가능한 서브넷을 선택하게 합니다.
  • spec.eni.subnet-tags: IP 할당을 위한 AWS 서브넷을 선택하는 데 사용되는 태그. 인스턴스의 가용 영역과 VPC 일치 요구사항에 추가되는 요구사항입니다. 지정하지 않으면 태그가 필요하지 않습니다.
  • spec.eni.exclude-interface-tags: IP 할당에서 인터페이스를 제외하는 데 사용되는 태그. 노드에 연결된 이 태그 집합과 일치하는 ENI는 Cilium이 무시하고 다른 용도로 사용할 수 있습니다. 이 매개변수는 subnet-tags 또는 first-interface-index 와 함께 사용해 추가 인터페이스를 제외할 수 있어요. 지정하지 않으면 인터페이스를 제외하는 데 태그가 사용되지 않습니다.
  • spec.eni.use-primary-address: ENI의 기본 주소를 노드에서 할당에 사용할 수 있어야 하는지 여부. 지정하지 않으면 이 옵션은 비활성화됩니다.
  • spec.eni.disable-prefix-delegation: 이 노드에서 ENI 접두사 위임을 비활성화할지 여부 (IPv4만). 지정하지 않으면 이 옵션은 비활성화됩니다.
  • spec.eni.delete-on-termination: 인스턴스가 종료될 때 ENI를 제거합니다. 지정하지 않으면 이 옵션은 활성화됩니다.

IPv6 사용

Note

ENI IPAM 모드의 IPv6 지원은 현재 베타 기능입니다. 문제가 발생하면 피드백을 제공하고 GitHub 이슈를 올려주세요. 진행 상황은 GitHub issue 18405에서 추적됩니다.

ENI IPAM 모드는 IPv4에 더해 IPv6 주소를 할당하고 사용할 수 있습니다. 이중 스택(IPv4와 IPv6)과 IPv6 전용 Cilium 구성이 모두 지원됩니다. Cilium 구성과 무관하게 각 ENI는 여전히 이중 스택 서브넷에서 생성된다는 점에 주의하세요 (아래 #subnet-requirements 서브넷 요구사항 참고). IPv6가 활성화되면 operator는 요청 시 ENI에 위임된 IPv6 접두사( /80 )를 할당하고, 에이전트는 해당 접두사에서 IPv6 pod 주소를 나눠 줍니다. 단일 /80 접두사는 이미 매우 큰 주소 공간을 제공하므로, operator는 노드당 하나의 IPv6 접두사만 할당하고 노드가 삭제될 때까지 절대 해제하지 않습니다.

IPv6를 활성화하려면 ENI IPAM 구성 위에 IPv6를 활성화한 상태로 Cilium을 실행하세요. 예를 들어 Helm으로:

Helm RepositoryOCI Registry

helm install cilium cilium/cilium --version 1.20.2 \
   --namespace kube-system \
   --set ipam.mode=eni \
   --set eni.enabled=true \
   --set ipv6.enabled=true
helm install cilium oci://quay.io/cilium/charts/cilium 1.20.2 \
   --namespace kube-system \
   --set ipam.mode=eni \
   --set eni.enabled=true \
   --set ipv6.enabled=true

IPv6 할당이 IPv4와 다른 방식

IPv6 할당은 #operational-details 운영 세부 사항에 설명된 IPv4 흐름과 의도적으로 다르게 동작합니다:

  • 접두사만, 노드당 하나: operator는 IPv6 접두사를 개별 주소로 확장하지 않습니다. 에이전트가 IPv6 수요( spec.ipam.pools.requested 의 ipv6-addrs )를 보고하고 아직 노드의 어떤 ENI에도 IPv6 접두사가 연결되지 않았으면, operator는 정확히 하나의 /80 접두사를 할당합니다. 접두사는 ENI 생성 시( Ipv6PrefixCount 를 통해) 또는 AssignIpv6Addresses EC2 API 호출로 기존 ENI에 할당됩니다. 단일 /80 이 거대한 주소 공간을 제공하므로 노드에 더 이상 IPv6 접두사가 요청되지 않아요.
  • 워터마크 없음: pre-allocate , min-allocate , max-allocate , max-above-watermark 설정과 부족·초과 계산은 IPv4에만 적용됩니다. IPv6는 간단한 부울 수요를 갖습니다: 에이전트가 IPv6가 필요하고 아무 접두사도 없으면 접두사 하나를 요청합니다.
  • 해제 없음: IPv6 접두사는 --aws-release-excess-ips 로 절대 해제되지 않습니다. 노드의 IPv6 접두사는 CiliumNode (따라서 노드)가 삭제될 때까지 살아있습니다.

할당된 접두사는 status.eni.enis 의 ENI ipv6-prefixes 필드에 기록되며, IPv4 CIDR과 마찬가지로 에이전트가 spec.ipam.pools.allocated 의 default 풀 아래에 발행합니다.

서브넷 요구사항

노드의 IPv4와 IPv6 주소는 같은 ENI에서 가져오고 ENI는 단일 서브넷에서 생성되므로, 해당 서브넷은 이중 스택이어야 합니다(IPv4 CIDR과 IPv6 CIDR이 모두 연결되어 있어야 함). 선택한 서브넷에 IPv6 CIDR이 없으면 IPv6 접두사 할당이 성공하지 않습니다. spec.eni.subnet-ids 또는 spec.eni.subnet-tags 로 선택한 서브넷( #eni-allocation-parameters ENI 할당 매개변수 참고)이 이중 스택으로 구성되어 있는지 확인하세요.

IPv6 전용 서브넷은 지원되지 않습니다. IPv6 전용 Cilium 구성에서도 Cilium은 현재 모든 ENI가 최소한 기본 IPv4 주소를 갖는다고 가정하므로, 각 ENI는 여전히 해당 IPv4 주소가 할당될 수 있는 이중 스택 서브넷에서 생성되어야 해요.

운영 세부 사항

ENIs, Subnets, VPCs 캐시

Operator는 AWS 계정과 연관된 모든 EC2 ENI, VPC, 서브넷 목록을 캐시에 유지합니다. 이를 위해 operator는 다음 EC2 API 작업을 수행합니다:

  • DescribeNetworkInterfaces
  • DescribeSubnets
  • DescribeVpcs
  • DescribeRouteTables

캐시는 분당 한 번 또는 IP 할당이나 ENI 생성이 수행된 후 업데이트됩니다. 할당 또는 생성에 기반해 트리거되면 작업은 최대 초당 한 번 수행됩니다.

사용 가능한 ENI IP 발행

캐시 업데이트 후, 노드를 나타내는 모든 CiliumNode 사용자 지정 리소스가 업데이트되어 사용 가능해진 새로운 IP를 발행합니다.

이 과정에서 spec.eni.first-interface-index 보다 큰 인터페이스 인덱스를 가진 모든 ENI가 모든 사용 가능한 IP와 위임된 접두사에 대해 스캔됩니다. 이 기준을 충족하는 각 ENI는 연결된 주소와 접두사와 함께 status.eni.enis 에 기록됩니다. 그런 다음 에이전트가 status.eni.enis 에서 할당 가능한 CIDR을 파생하고 spec.ipam.pools.allocated 의 default 풀 아래에 발행합니다 (#division-of-responsibilities-between-the-operator-and-the-agent operator와 agent 간의 책임 분담 참고).

이 업데이트로 사용자 지정 리소스가 변경되면, 사용자 지정 리소스는 사용 가능한 경우 Kubernetes API 메서드 Update() 및/또는 UpdateStatus() 를 사용해 업데이트됩니다.

ENI IP 부족 또는 초과 결정

Operator는 모든 노드를 지속적으로 모니터링하고 사용 가능한 ENI IP 주소의 부족을 감지합니다. 부족을 인식하는 검사는 두 경우에 수행됩니다:

  • CiliumNode 사용자 지정 리소스가 업데이트될 때
  • 모든 노드가 정기 간격(분당 한 번)으로 스캔될 때

--aws-release-excess-ips 가 활성화되면 IPv4 초과를 인식하는 검사가 간격 기반 스캔에서 수행됩니다.

노드에 IP 주소 부족이 있는지 결정할 때 다음 계산이 수행됩니다:

// availableIPs is the number of IPs across all CIDRs published in
// spec.ipam.pools.allocated (default pool); usedIPs is the number
// currently assigned to pods.
neededIPs = max(spec.ipam.pre-allocate - (availableIPs - usedIPs), spec.ipam.min-allocate - availableIPs)
if spec.ipam.max-allocate > 0 {
 neededIPs = min(max(spec.ipam.max-allocate - availableIPs, 0), neededIPs)
}

IPv4 초과 계산:

// availableIPs and usedIPs are as defined above.
upperBound := spec.ipam.min-allocate + spec.ipam.max-above-watermark
switch {
case availableIPs <= upperBound:
  excessIPs = 0
case usedIPs <= upperBound && usedIPs + spec.ipam.pre-allocate <= upperBound:
  excessIPs = availableIPs - upperBound
default:
  excessIPs = max(availableIPs - usedIPs - upperBound, 0)
}

부족이 감지되면 노드는 IP 주소 할당이 필요한 노드 목록에 추가됩니다. 간격 기반 스캔으로 부족이 감지되면, 노드의 할당 순서는 부족의 심각도에 따라 결정됩니다. 즉 부족이 가장 큰 노드가 할당 큐의 앞에 옵니다. IPv4를 해제해야 하는 노드는 할당이 필요한 노드 뒤에 옵니다.

할당 큐는 요청 시 처리되지만 최대 초당 한 번입니다.

IP 할당

주소 부족이 있는 노드에 대해 IP 할당을 수행할 때, operator는 먼저 CiliumNode 리소스가 나타내는 인스턴스에 이미 연결된 ENI를 봅니다. spec.eni.first-interface-index 보다 큰 인터페이스 인덱스를 가진 모든 ENI가 사용 대상으로 고려됩니다.

Note

eth0 을 IP 할당에 사용하지 않으려면 spec.eni.first-interface-index 를 1 로 설정해 첫 번째 인터페이스를 건너뛰세요.

그런 다음 operator는 다음 기준을 충족하는 첫 번째 기존 할당된 ENI를 선택합니다:

  • ENI에 아직 사용되지 않은 주소가 연결되어 있거나, ENI에 연결된 주소 수가 인스턴스 유형별 제한보다 적은 경우
  • ENI와 연관된 서브넷에 할당 가능한 IP가 있는 경우

ENI에 할당되는 IP 수를 결정하는 데 다음 공식이 사용됩니다:

// surgeAllocate kicks in if numPendingPods is greater than NeededAddresses
min(AvailableOnSubnet, min(AvailableOnENI, NeededAddresses + spec.ipam.max-above-watermark + surgeAllocate))

Note

사전 할당된 수가 노드의 대기 중인 Pod 수보다 적은 시나리오에서 operator는 다음 할당 주기를 기다리지 않도록 사전 할당된 수보다 더 많은 IP를 사전에 할당합니다.

즉 단일 할당 주기에서 할당되는 IP 수가 spec.ipam.pre-allocate 를 충족하는 데 필요한 것보다 적을 수 있습니다.

IP는 AssignPrivateIpAddresses EC2 API 호출로 할당됩니다. 위 기준을 충족하는 ENI가 더 이상 없으면 새 ENI가 생성됩니다.

IP 해제

IP 해제(IPv4만)는 에이전트가 spec.ipam.pools.allocated 에서 CIDR을 제거함으로써 구동됩니다. multi-pool 에이전트가 CIDR을 완전히 해제하면(모든 IP가 미사용이고 노드가 초과 용량을 가질 때) 해당 CIDR을 spec.ipam.pools.allocated 에서 제거합니다. operator는 이 필드에서 사라지는 CIDR을 추적하고, --excess-ip-release-delay (기본값 180초)로 구성된 지연 후 AWS에서 해당 리소스를 해제합니다:

  • 호스트 접두사 CIDR(단일 보조 IP)은 UnassignPrivateIpAddresses 로 해제됩니다.
  • 위임된 /28 접두사는 UnassignENIPrefixes 로 전체를 해제합니다.

서브넷당 ENI 수에 제한은 없으므로, ENI는 IP가 해제된 후에도 노드에 연결된 상태로 유지됩니다. #eni-deletion-policy ENI 삭제 정책 참고.

Note

IP 해제는 operator가 --aws-release-excess-ips=true 로 실행될 때만 발생합니다.

ENI 생성

인스턴스 유형이 추가 ENI를 할당할 수 있는 한, ENI는 수요에 기반해 자동으로 할당됩니다.

ENI를 할당할 때 서브넷은 다음 기준에 기반해 ENI를 생성할 위치로 선택됩니다:

  • 서브넷의 VPC ID가 spec.eni.vpc-id 와 일치
  • 서브넷의 가용 영역이 spec.eni.availability-zone 과 일치
  • 설정된 경우 spec.eni.subnet-ids 또는 spec.eni.subnet-tags 가 후보 서브넷 집합을 더 좁히는 데 사용됩니다. subnet-ids 의 ID를 가진 서브넷은 모두 후보인 반면, 서브넷은 후보가 되려면 모든 subnet-tags 와 일치해야 합니다. subnet-ids 가 설정되면 subnet-tags 는 무시된다는 점에 주의하세요. 여러 서브넷이 일치하면 사용 가능한 주소가 가장 많은 서브넷이 선택됩니다.
  • subnet-ids 나 subnet-tags 가 모두 설정되지 않으면 operator는 spec.eni.node-subnet-id 를 참조해 인스턴스의 기본 ENI와 같은 서브넷에 ENI를 생성하려고 시도합니다. 이것이 불가능하면(예: 해당 서브넷에 IP가 충분하지 않은 경우) operator는 노드의 서브넷과 같은 라우트 테이블의 서브넷을 찾습니다. 이것도 불가능하면 VPC와 가용 영역이 일치하는 가장 큰 서브넷에 ENI를 생성하는 것으로 폴백합니다.

서브넷을 선택한 후 인터페이스 인덱스가 결정됩니다. 이를 위해 모든 기존 ENI가 스캔되고 spec.eni.first-interface-index 보다 큰 첫 번째 미사용 인덱스가 선택됩니다.

그런 다음 CreateNetworkInterface 및 AttachNetworkInterface API 호출로 ENI가 생성되고 EC2 인스턴스에 연결됩니다.

ENI에 연결된 Security Group ID는 다음 순서로 계산됩니다:

  • spec.eni.security-groups 필드가 먼저 참조됩니다. 설정되면 이것이 새로 생성된 ENI에 연결된 Security Group ID가 됩니다.
  • spec.eni.security-group-tags 필드가 참조됩니다. 설정되면 operator가 계정의 모든 Security Group을 나열하고 전달된 태그 목록과 일치하는 것을 ENI에 연결합니다.
  • 마지막으로 위 필드 중 어느 것도 설정되지 않으면 새로 생성된 ENI가 인스턴스의 eth0 의 보안 그룹 ID를 상속합니다.

설명은 다음 형식이 됩니다:

"Cilium-CNI (<EC2 instance ID>)"

ENI 태깅 기능이 활성화되면 ENI는 제공된 정보로 태그됩니다.

ENI 삭제 정책

ENI가 연결된 EC2 인스턴스가 종료될 때 ENI를 삭제 대상으로 표시할 수 있습니다. 이를 활성화하려면 spec.eni.delete-on-termination 옵션을 활성화할 수 있어요. 활성화되면 생성 후 ModifyNetworkInterfaceAttribute 를 사용해 이 삭제 정책을 지정하도록 ENI가 수정됩니다.

노드 종료

노드 또는 인스턴스가 종료되면 Kubernetes apiserver가 노드 삭제 이벤트를 보냅니다. 이 이벤트는 operator가 받아들이고 operator는 해당 ciliumnodes.cilium.io 사용자 지정 리소스를 삭제합니다.

필요한 권한

Cilium operator가 ENI 생성과 IP 할당을 수행하려면 다음 EC2 권한이 필요합니다:

  • DeleteNetworkInterface
  • DescribeInstanceTypes
  • DescribeNetworkInterfaces
  • DescribeSubnets
  • DescribeVpcs
  • DescribeRouteTables
  • DescribeSecurityGroups
  • CreateNetworkInterface
  • AttachNetworkInterface
  • ModifyNetworkInterfaceAttribute
  • AssignPrivateIpAddresses
  • CreateTags

ENI GC가 활성화(기본값)되고 --cluster-name 과 --eni-gc-tags 가 사용자 지정 값으로 설정되지 않은 경우:

  • DescribeTags

초과 IP 해제가 활성화된 경우:

  • UnassignPrivateIpAddresses

IPv6가 활성화된 경우 (#ipam-eni-ipv6 IPv6 사용 참고):

  • AssignIpv6Addresses

--instance-tags-filter 가 사용되는 경우:

  • DescribeInstances

메트릭

IPAM 메트릭은 IPAM 섹션에 문서화되어 있습니다.

노드 구성

인스턴스에 연결된 ENI의 IP 주소와 경로는 Cilium 에이전트가 관리합니다. 따라서 새로 연결된 네트워크 인터페이스를 관리하려는 시스템 서비스는 Cilium의 구성과 간섭할 것입니다. 일반적인 시나리오는 NetworkManager 또는 systemd-networkd 가 이 인터페이스에서 DHCP를 자동 수행하거나, 캐리어가 일시적으로 끊겼을 때 Cilium의 IP 주소를 제거하는 것입니다. 이 서비스를 비활성화하거나 Linux 배포판이 새로 연결된 ENI 장치를 관리하지 않도록 구성해야 해요. 다음 예시는 eth0 을 제외한 eth* 이름의 모든 Linux 네트워크 장치를 unmanaged로 구성합니다.

Network Managersystemd-networkd

# cat <<EOF >/etc/NetworkManager/conf.d/99-unmanaged-devices.conf
[keyfile]
unmanaged-devices=interface-name:eth*,except:interface-name:eth0
EOF
# systemctl reload NetworkManager
# cat <<EOF >/etc/systemd/network/99-unmanaged-devices.network
[Match]
Name=eth[1-9]*

[Link]
Unmanaged=yes
EOF
# systemctl restart systemd-networkd

더 알아보기 (Learn more)