Cilium Operator

Cilium Operator

Cilium Operator에 대한 기술적 개요와 Operator가 담당하는 클러스터 전체 작업을 설명해요.

출처: Cilium Operator

본문

이 문서는 Cilium Operator의 기술적 개요를 제공하고, Operator가 담당하는 클러스터 전체 작업들을 설명해요.

고가용성(HA) Cilium Operator

Cilium Operator는 Kubernetes 리더 선출(leader election) 라이브러리와 lease lock을 함께 사용해 HA 기능을 제공해요. 이 기능은 Kubernetes 1.14 이상에서 지원되며, 1.9 릴리스부터 Cilium의 기본 동작이에요.

HA 배포의 레플리카 수는 Helm 옵션 operator.replicas로 구성할 수 있어요.

helm install cilium cilium/cilium --version 1.20.2 \
   --namespace kube-system \
   --set operator.replicas=3
helm install cilium oci://quay.io/cilium/charts/cilium 1.20.2 \
   --namespace kube-system \
   --set operator.replicas=3
$ kubectl get deployment cilium-operator -n kube-system
NAME              READY   UP-TO-DATE   AVAILABLE   AGE
cilium-operator   3/3     3            3           46s

Operator는 Kubernetes 환경의 Cilium 설치에서 필수적인 부분이며 다음 작업을 수행해요.

CRD 등록

Cilium Operator의 기본 동작은 Cilium이 사용하는 CRD를 등록하는 거예요. Cilium Operator가 등록하는 커스텀 리소스는 다음과 같아요.

IPAM

Cilium Operator는 다음 모드로 실행될 때 IP 주소 관리를 담당해요.

Kubernetes Host Scope IPAM 모드로 실행될 때 cilium-agent가 사용하는 할당 CIDR은 Kubernetes가 Node 리소스에 채운 podCIDR와 podCIDRs 필드에서 파생돼요.

CRD-Backed IPAM 할당 모드에서는 Cloud별 operator가 CiliumNode 리소스에 필요한 CIDR 정보를 채우는 것이 담당이에요.

Cilium은 현재 CRD IPAM 모드에서 다음 Cloud 제공자를 네이티브로 지원해요.

  • Azure - cilium-operator-azure
  • AWS - cilium-operator-aws

IPAM에 대한 자세한 내용은 IP Address Management (IPAM)를 방문하세요.

Load Balancer IP 주소 관리

LoadBalancer IP Address Management (LB IPAM)을 사용하면 Cilium Operator가 type: LoadBalancer 서비스의 IP 주소를 관리해요.

KVStore 작업

이 작업은 Cilium Operator에 KVStore가 활성화된 경우에만 수행돼요. 또한 KVStore 작업은 cilium-operator가 아래 옵션 중 하나로 실행될 때만 필요해요.

  • --synchronize-k8s-services
  • --synchronize-k8s-nodes
  • --identity-allocation-mode=kvstore

K8s Services 동기화

Cilium Operator는 --synchronize-k8s-services 플래그로 실행되면 Kubernetes 서비스를 Cilium Operator용으로 구성된 외부 KVStore에 동기화하는 작업을 수행해요.

Cilium Operator는 공유 서비스(service.cilium.io/shared 어노테이션이 true로 설정된 서비스)에 대해서만 이 작업을 수행해요. 이는 Cilium으로 ClusterMesh를 구성할 때 의미가 있어요.

K8s Nodes 동기화

K8s 서비스와 유사하게 Cilium Operator도 Kubernetes 노드 정보를 공유 KVStore에 동기화해요.

Node 객체가 삭제되면 에이전트 자체에서 해당 CiliumNode 객체를 안정적으로 정리하는 것은 불가능해요. Cilium Operator는 고아(orphaned) CiliumNode를 가비지 컬렉션할 책임을 가져요.

Heartbeat 업데이트

Cilium Operator는 Cilium의 heartbeat 경로 키를 현재 시간으로 주기적으로 업데이트해요. KVStore에서 이 heartbeat의 기본 키는 cilium/.heartbeat예요. Cilium Agent는 이를 사용해 KVStore 업데이트를 수신할 수 있는지 검증해요.

Identity 가비지 컬렉션

Kubernetes의 각 워크로드에는 정책 결정에 사용되는 보안 identity가 할당돼요. 이 identity는 라벨 같은 공통 워크로드 마커를 기반으로 해요. Cilium은 두 가지 identity 할당 메커니즘을 지원해요.

  • CRD Identity 할당
  • KVStore Identity 할당

두 identity 할당 메커니즘 모두 Cilium Operator가 스테일(stale) identity의 가비지 컬렉션을 수행해야 해요. 보안 identity가 16비트 부호 없는 정수로 표현되므로 클러스터에 최대 65536개의 identity만 가질 수 있기 때문에 이 가비지 컬렉션이 필요해요.

CRD Identity 가비지 컬렉션

CRD identity 할당은 Kubernetes 커스텀 리소스 CiliumIdentity를 사용해 보안 identity를 나타내요. 이는 Cilium의 기본 동작이며, 외부 의존성 없이 어떤 K8s 환경에서도 즉시 동작해요.

Cilium Operator는 CiliumIdentity의 로컬 캐시를 마지막으로 활성 상태였던 시간과 함께 유지해요. 백그라운드에서 주기적으로 실행되는 컨트롤러가 이 로컬 캐시를 스캔해 identity-heartbeat-timeout 이후 heartbeat 생존 신호가 업데이트되지 않은 identity를 삭제해요.

여기서 주의할 점은 endpoint가 연결된 Identity는 항상 살아있는 것으로 간주된다는 거예요.

KVStore Identity 가비지 컬렉션

CRD 할당 모드가 더 일반적이지만 확장성 측면에서 제한이 있어요. 매우 큰 환경에서 실행할 때는 KVStore 할당 모드를 사용하는 것이 더 합리적인 선택이에요. 이 모드는 identity를 etcd 같은 외부 저장소에 저장해요.

Cilium의 확장성에 대한 자세한 내용은 Scalability report를 방문하세요.

가비지 컬렉션 메커니즘은 KVStore의 모든 identity를 스캔하는 작업을 포함해요. 각 identity에 대해 Cilium Operator는 KVStore에서 그 identity의 활성 사용자가 있는지 검색해요. 활성 사용자가 없으면 KVStore에서 항목을 삭제해요.

CiliumEndpoint 가비지 컬렉션

CiliumEndpoint 객체는 클러스터의 각 Pod에 대해 cilium-agent가 생성해요. Cilium Operator는 고아 CiliumEndpoint 객체의 가비지 컬렉션을 처리하는 컨트롤러를 관리해요. 고아 CiliumEndpoint 객체는 endpoint 객체의 소유자가 클러스터에서 더 이상 활성 상태가 아니라는 뜻이에요. CiliumEndpoint는 소유자가 PodFailed 또는 PodSucceeded 상태의 기존 Pod인 경우에도 고아로 간주돼요. 이 컨트롤러는 endpoint-gc-interval 옵션이 지정되면 주기적으로 실행되고, 옵션이 지정되지 않으면 시작 시 한 번만 실행돼요.

파생(derivative) 네트워크 정책 생성

네트워크 정책 스펙에서 toGroups 같은 Cloud 제공자 특정 구성을 사용할 때, Cilium Operator는 이 구성을 해당 필드가 없는 파생 CNP/CCNP 객체로 변환하는 작업을 수행해요.

자세한 내용은 Cilium 네트워크 정책이 toGroups를 사용해 AWS 보안 그룹으로 외부 접근을 잠그는 방법을 참고하세요.

Ingress 및 Gateway API 지원

Ingress 또는 Gateway API 지원이 활성화되면 Cilium Operator는 Ingress 또는 Gateway API 객체를 파싱해 노드별 Envoy 프록시를 구성하는 데 사용되는 CiliumEnvoyConfig 객체로 변환하는 작업을 수행해요.

또한 Ingress 또는 Gateway API 객체가 사용하는 Secrets은 Cilium이 관리하는 네임스페이스로 동기화되고, Cilium Agent는 그 네임스페이스에 대한 접근 권한을 부여받아요. 이렇게 하면 Cilium Agent에 필요한 권한이 줄어들어요.

상호 인증 지원

Cilium의 상호 인증(Mutual Authentication) 지원이 활성화되면 Cilium Operator는 각 Cilium Identity가 인증서 관리 시스템에 연결된 identity를 갖도록 보장하는 책임이 있어요. 구성된 인증서 관리 섹션에 필요한 대로 identity 등록을 생성하고 삭제해요. 다만 Cilium Operator는 identity의 키 자료(key material)에는 접근하지 않아요.

그 정보는 다른 채널을 통해서만 Cilium Agent와 공유돼요.

더 알아보기 (Learn more)