観測パイプラインとアイデンティティを整理する
한국어 원문으로 표시합니다.
목표
Hubble 관측 파이프라인을 값 파일로 선언하고, 아이덴티티에 들어가는 라벨과 제외되는 라벨을 명시적으로 정리하며, 실전에서 바로 쓰는 질의·진단표·알림 규칙을 만듭니다.
왜 중요한가
Cilium 운영에서 "관찰 → 정책화 → 감사 → 강제"의 루프가 닫히려면 관찰 축이 먼저 서 있어야 합니다. 그런데 Hubble 을 켜기만 하고 export 를 붙이지 않으면 링버퍼가 회전하는 순간 증거가 사라집니다. 노드당 기본 4095 플로우는 트래픽이 많은 노드에서 몇 초 분량일 수도 있습니다.
아이덴티티 라벨 정리도 실무에서 중요한 이유가 있습니다. pod-template-hash 처럼 롤아웃마다 바뀌는 라벨이 아이덴티티에 포함되면, 배포 한 번에 모든 파드가 새 아이덴티티를 받아 정책 맵이 통째로 다시 계산됩니다. 어떤 라벨이 의미를 갖고 어떤 라벨이 소음인지 팀이 합의해 두어야 합니다.
알림도 마찬가지입니다. 정책 강제 직후에는 임계값을 일부러 낮게 잡아 누락된 허용 규칙을 빨리 찾고, 안정화된 뒤 운영 수준으로 올리는 2단계 운영이 정석입니다.
Hubble 설정과 문서는 /root/cca-hubble/ 아래에 작성하고, Kubernetes 기본 리소스는 실제로 apply 합니다.
단계
- 네임스페이스
cca-obs를 만드세요. /root/cca-hubble/hubble-values.yaml을 만들고hubble.enabled: true,hubble.relay.enabled: true,hubble.ui.enabled: true,hubble.eventBufferCapacity: 16383을 쓰세요.- 같은 파일에
hubble.metrics.enabled목록을 추가하고drop,dns,flow,httpV2네 계열이 모두 들어가게 하세요. 이어서hubble.export아래에 동적 export 설정을 두고, includeFilters 의 verdict 에DROPPED와AUDIT를 함께 담으세요. - 네임스페이스
cca-obs에 디플로이먼트checkout을 2 레플리카로 배포하세요. 파드 템플릿 라벨은app=checkout과team=payments두 개이고 이미지는nginx:1.27-alpine입니다. - 같은 네임스페이스에 컨피그맵
identity-labels를 만드세요. 키included에는app,team,io.kubernetes.pod.namespace를, 키excluded에는pod-template-hash,controller-revision-hash,pod-template-generation을 담습니다. /root/cca-hubble/hubble-queries.txt에hubble observe로 시작하는 질의를 5줄 이상 쓰세요. 그중에--verdict DROPPED,--verdict AUDIT,--namespace cca-obs,--protocol dns, 그리고--from-pod로 특정 파드를 지정하는 질의가 각각 최소 한 번씩 들어가야 합니다. 이어서/root/cca-hubble/drop-reasons.md에 마크다운 표를 만들고POLICY_DENIED,CT_MAP_INSERT_FAILED,UNSUPPORTED_L3_PROTOCOL,STALE_OR_UNROUTABLE_IP네 가지 사유와 각각의 첫 의심 지점을 적으세요./root/cca-hubble/hubble-alerts.yaml에 Prometheus 알림 규칙을 작성하세요.groups[0].name은cilium-policy이고 규칙은 두 개입니다. 첫째는 이름PolicyDropSpike, expr 에hubble_drop_total의rate를 쓰면서POLICY_DENIED사유로 좁히고,for: 10m, severitywarning입니다. 둘째는 이름CiliumAgentDown, severitycritical입니다.
참고
- 컨피그맵은
kubectl create configmap identity-labels -n cca-obs --from-literal=included=... --from-literal=excluded=...로 만들면 빠릅니다. 값은 쉼표로 이어 붙여도 됩니다. - 마크다운 표의 줄은
|로 시작합니다. 헤더 줄과 구분선 줄까지 포함해 6줄 이상이 됩니다. - 흔한 실수 1: 라벨을 디플로이먼트의
metadata.labels에만 붙이는 것. 아이덴티티는 파드 라벨에서 계산되므로spec.template.metadata.labels에 있어야 합니다. - 흔한 실수 2: 알림 expr 에 누적 카운터를 그대로 쓰는 것. 증가율로 봐야 급증이 잡힙니다.
for는 YAML 키이므로 따옴표 없이 그대로 쓰면 됩니다.
관측 실습 네임스페이스 만들기
네임스페이스 cca-obs 를 만드세요.
이름만 정확히 맞추면 되는 첫 단계입니다.
Hubble 활성화 값 쓰기
/root/cca-hubble/hubble-values.yaml 을 만들고 hubble.enabled: true, hubble.relay.enabled: true, hubble.ui.enabled: true, hubble.eventBufferCapacity: 16383 을 쓰세요.
서버, 집계자, 화면 세 가지를 각각 켜야 합니다. 기본 링버퍼는 노드당 4095 플로우라 트래픽이 많으면 금방 회전하므로 확장 값도 함께 지정하세요.
메트릭과 보안 이벤트 내보내기
같은 파일에 hubble.metrics.enabled 목록을 추가하고 drop, dns, flow, httpV2 네 계열이 모두 들어가게 하세요. 이어서 hubble.export 아래에 동적 export 설정을 두고, includeFilters 의 verdict 에 DROPPED 와 AUDIT 를 함께 담으세요.
같은 파일에 이어서 씁니다. 드롭·DNS·플로우·HTTP 네 계열을 켜고, export 필터에는 실제로 차단된 것과 감사 모드에서 차단됐을 것을 모두 담으세요.
라벨이 있는 워크로드 배포
네임스페이스 cca-obs 에 디플로이먼트 checkout 을 2 레플리카로 배포하세요. 파드 템플릿 라벨은 app=checkout 과 team=payments 두 개이고 이미지는 nginx:1.27-alpine 입니다.
아이덴티티는 파드 라벨 집합에서 계산되므로 라벨은 디플로이먼트가 아니라 파드 템플릿에 있어야 합니다. 배포하고 나면 컨트롤러가 라벨 하나를 자동으로 더 붙여 줍니다.
포함 라벨과 제외 라벨 정리하기
같은 네임스페이스에 컨피그맵 identity-labels 를 만드세요. 키 included 에는 app, team, io.kubernetes.pod.namespace 를, 키 excluded 에는 pod-template-hash, controller-revision-hash, pod-template-generation 을 담습니다.
재배포마다 값이 바뀌는 라벨이 아이덴티티에 들어가면 롤아웃 한 번에 정책 맵을 전부 다시 계산해야 합니다. 그런 라벨을 골라 제외 목록에 넣으세요.
자주 쓰는 질의와 드롭 사유표 만들기
/root/cca-hubble/hubble-queries.txt 에 hubble observe 로 시작하는 질의를 5줄 이상 쓰세요. 그중에 --verdict DROPPED, --verdict AUDIT, --namespace cca-obs, --protocol dns, 그리고 --from-pod 로 특정 파드를 지정하는 질의가 각각 최소 한 번씩 들어가야 합니다. 이어서 /root/cca-hubble/drop-reasons.md 에 마크다운 표를 만들고 POLICY_DENIED, CT_MAP_INSERT_FAILED, UNSUPPORTED_L3_PROTOCOL, STALE_OR_UNROUTABLE_IP 네 가지 사유와 각각의 첫 의심 지점을 적으세요.
판정 필터, 네임스페이스 좁히기, DNS 프로토콜, 특정 파드 지정이 모두 들어가야 실전에서 쓸 만합니다. 진단표에는 사유별로 무엇을 먼저 의심할지 적으세요.
드롭 급증과 에이전트 다운 알림 만들기
/root/cca-hubble/hubble-alerts.yaml 에 Prometheus 알림 규칙을 작성하세요. groups[0].name 은 cilium-policy 이고 규칙은 두 개입니다. 첫째는 이름 PolicyDropSpike, expr 에 hubble_drop_total 의 rate 를 쓰면서 POLICY_DENIED 사유로 좁히고, for: 10m, severity warning 입니다. 둘째는 이름 CiliumAgentDown, severity critical 입니다.
누적 카운터를 그대로 쓰면 안 되고 증가율로 봐야 합니다. 드롭 사유를 구분하지 않으면 노이즈가 심해집니다. 순간 튐에 반응하지 않도록 지속 시간도 주세요.