키-값 저장소

키-값 저장소 (Key-Value Store)

Cilium은 여러 Cilium 인스턴스 사이에서 정보를 주고받기 위해 외부 키-값 저장소를 사용해요. 이번 글에서는 키-값 저장소의 레이아웃, 노드·서비스·아이덴티티·엔드포인트 정보가 어떻게 저장되는지, 그리고 임대(lease)와 주의사항을 알아볼게요.

출처: Key-Value Store

본문

Cilium은 여러 Cilium 인스턴스 사이에서 정보를 교환하기 위해 외부 키-값 저장소를 사용합니다.

레이아웃

모든 데이터는 공통 키 접두사 아래에 저장됩니다.

Prefix Description
cilium/ 모든 키가 공유하는 공통 접두사.
cilium/state/ 에이전트가 저장하는 상태. 데이터가 제거되거나 손상되면 자동으로 다시 생성됨.

클러스터 노드

모든 에이전트는 키-값 저장소에 자신을 노드로 등록하고, 다른 에이전트가 사용할 수 있도록 다음 정보를 제공합니다:

  • 노드 이름
  • 노드의 IP 주소
  • 헬스 체크 IP 주소
  • 노드의 엔드포인트 할당 범위
Key Value
cilium/state/nodes/v1// node.Node

모든 노드 키는 각 노드의 에이전트가 소유한 임대(lease)에 연결됩니다.

서비스

모든 Kubernetes 서비스는 Cilium operator에 의해 키-값 저장소에 미러링됩니다. 이는 멀티 클러스터 서비스 디스커버리를 구현하는 데 필요해요.

Key Value
cilium/state/services/v1/// serviceStore.ClusterService

아이덴티티

Cilium 노드에서 새 엔드포인트가 시작될 때마다, 에이전트는 그 엔드포인트의 라벨이 고유한지 판단하고 그 라벨 집합에 대한 아이덴티티를 할당해요. 이 아이덴티티는 로컬 클러스터 안에서만 의미가 있습니다.

Key Value
cilium/state/identities/v1/id/ labels.LabelArray
cilium/state/identities/v1/value// identity.NumericIdentity

엔드포인트

모든 엔드포인트 IP와 해당 아이덴티티는 엔드포인트가 시작된 노드의 에이전트에 의해 키-값 저장소로 미러링됩니다. 이는 피어 노드가 이 IP들이 백업하는 엔드포인트에 대한 egress 정책을 구성할 수 있게 하기 위해서예요.

Key Value
cilium/state/ip/v1// identity.IPIdentityPair

CiliumNetworkPolicyNodeStatus

Kubernetes로의 핸드오버가 활성화되면 각 cilium-agent 는 특정 CNP(NetworkPolicy)를 실현했는지 여부를 kube-apiserver 에 직접 쓰는 대신 키-값 저장소에 전파합니다. cilium-operator 는 키-값 저장소에서 이 접두사의 갱신을 수신하고, 클러스터 안에서 CNP의 상태를 업데이트하는 유일한 주체가 돼요.

Key Value
cilium/state/cnpstatuses/v2//// k8s.CNPNSWithMeta

하트비트

하트비트 키는 operator가 현재 시간과 날짜를 담아 주기적으로 갱신합니다. 에이전트는 이를 사용해 키-값 저장소 갱신을 받을 수 있는지 검증해요.

Key Value
cilium/.heartbeat 현재 시간과 날짜

임대 (Lease)

몇 가지 예외를 빼면, 키-값 저장소의 모든 키는 노드에서 실행되는 특정 에이전트가 소유합니다. 이런 키에는 모두 임대가 붙어 있어요. 임대는 자동으로 갱신되고, 임대가 만료되면 키는 키-값 저장소에서 제거됩니다. 이는 에이전트가 특정 노드에서 죽어 다시 나타나지 않아도 키가 키-값 저장소에서 제거되도록 보장해 줘요.

임대 수명은 15분으로 설정됩니다. 정확한 만료 동작은 kvstore 구현에 따라 다르지만, 만료는 보통 임대 수명의 두 배 후에 발생해요.

일반 항목 임대 외에도, 키-값 저장소의 모든 잠금(lock)은 노드에서 실행되는 특정 에이전트가 소유하며 별도의 "잠금 임대"가 붙습니다. 잠금 임대의 기본 수명은 25초예요.

Key Lease Timeout Default expiry
cilium/.initlock// LockLeaseTTL 25 seconds
cilium/.heartbeat KVstoreLeaseTTL 15 minutes
cilium/state/cnpstatuses/v2//// KVstoreLeaseTTL 15 minutes
cilium/state/identities/v1/id/ None cilium-operator 가 가비지 컬렉션
cilium/state/identities/v1/value// KVstoreLeaseTTL 15 minutes
cilium/state/ip/v1// KVstoreLeaseTTL 15 minutes
cilium/state/nodes/v1// KVstoreLeaseTTL 15 minutes
cilium/state/services/v1/// KVstoreLeaseTTL 15 minutes

주의사항과 한계

IPSec 투명 암호화가 활성화된 상태에서 kvstore 상태를 수동으로 제거하고 다시 만들면, Cilium이 관리하는 Pod에 영구적인 연결 장애가 발생할 수 있어요. 자세한 내용은 Cilium의 XFRM 상태 고착화 문서를 참고하세요.

디버깅

kvstore에 저장된 내용은 cilium kvstore 명령으로 조회하고 조작할 수 있습니다. 자세한 내용은 명령 레퍼런스를 참고하세요.

예시:

$ cilium kvstore get --recursive cilium/state/nodes/
cilium/state/nodes/v1/default/runtime1 => {"Name":"runtime1","IPAddresses":[{"AddressType":"InternalIP","IP":"10.0.2.15"}],"IPv4AllocCIDR":{"IP":"10.11.0.0","Mask":"//8AAA=="},"IPv6AllocCIDR":{"IP":"f00d::a0f:0:0:0","Mask":"//////////////////8AAA=="},"IPv4HealthIP":"","IPv6HealthIP":""}

더 알아보기 (Learn more)