키-값 저장소
키-값 저장소 (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)
- 보안 아이덴티티 (Security Identities) — 아이덴티티가 어떤 범위로 나뉘는지
- ClusterMesh 소개 — 멀티 클러스터 서비스 디스커버리