본문 바로가기

컨테이너/쿠버네티스 네트워크

[Cilium] (4) 실리움 네트워킹 _ Hubble

Hubble 소개

 

✅ Hubble: Cilium 기반 eBPF 네트워크 및 보안 관측 가능성 플랫폼

클라우드 네이티브 환경에서 네트워크 및 보안에 대한 가시성(Observability) 확보는 점점 더 중요해지고 있습니다. Hubble은 이러한 요구를 충족시키기 위해 설계된 완전히 분산된 네트워킹 및 보안 관측 가능성 플랫폼입니다. 이 글에서는 Hubble의 핵심 구성 요소와 기능, 활용 방안에 대해 살펴보겠습니다.


✅ Hubble이란?

Hubble은 CiliumeBPF를 기반으로 구축되어 있으며, 다음과 같은 특징을 지닙니다:

  • 서비스 간의 통신 및 행동에 대한 깊이 있는 가시성 제공
  • 네트워킹 인프라의 동작을 완전히 투명하게 관찰
  • eBPF를 활용한 동적 가시성 확보로, 오버헤드를 최소화하면서도 풍부한 정보를 제공
  • 다중 클러스터 환경에서도 클러스터 간 트래픽을 시각화하고 분석 가능

 

📌 Hubble API & CLI

  • 기본적으로 Hubble API는 각 노드에서 실행되는 Cilium 에이전트 범위 내에서 작동합니다.
  • API는 로컬 유닉스 도메인 소켓을 통해 접근되며, Hubble CLI는 이를 쿼리하여 데이터를 조회합니다.
  • Hubble CLI는 일반적으로 Cilium 에이전트 포드 내에 설치됩니다.

📌 Hubble Relay & UI

  • Hubble Relay를 배포하면 클러스터 전체 또는 여러 클러스터에 대한 통합 가시성을 제공합니다.
  • 이 경우, Hubble CLI는 Relay를 통해 데이터를 조회하거나, Hubble UI를 통해 시각적으로 확인할 수 있습니다.
  • Hubble UI는 웹 기반으로, L3~L7 계층의 서비스 종속성 그래프를 자동으로 탐지하고 시각화할 수 있습니다.

✅ 주요 기능

🔗 Service Dependencies & Communication Map

  • 어떤 서비스들이 서로 통신하고 있는가?
  • 얼마나 자주 통신하는가?
  • 서비스 간 종속성 그래프는 어떤 모습인가?
  • HTTP 호출, Kafka topic 소비 및 생산 내역 등을 확인 가능

📡 Network Monitoring & Alerting

  • 네트워크 통신 실패가 발생했는가? 그 원인은?
    • DNS 문제인가?
    • 애플리케이션 또는 네트워크 레벨 문제인가?
    • L4(TCP) 또는 L7(HTTP) 계층에서의 문제인가?
  • 최근 5분 간 DNS 해석 실패한 서비스는?
  • TCP 연결 중단, 타임아웃, 미응답 SYN 요청 비율 등 분석 가능

📊 Application Monitoring

  • 특정 서비스 또는 전체 클러스터에서의 HTTP 4xx/5xx 응답률
  • 95/99 퍼센타일 지연 시간 분석
  • 어떤 서비스가 성능 병목을 유발하고 있는가?
  • 서비스 간 요청-응답 레이턴시 분석

🔒 Security Observability

  • 네트워크 정책에 의해 차단된 서비스는?
  • 외부에서 접근된 서비스는 무엇인가?
  • 어떤 서비스가 특정 DNS 이름을 해석했는가?

✅ 결론

Hubble은 Cilium의 강력한 네트워크 정책 기능eBPF 기반의 저오버헤드 추적 기능을 바탕으로, 클라우드 네이티브 환경에서의 네트워크 및 보안 가시성을 극대화합니다. 특히 멀티 클러스터 환경에서도 뛰어난 확장성과 시각화 기능을 제공하여, DevOps 및 SRE 팀의 문제 해결 능력을 크게 향상시킬 수 있습니다.

Cilium 기반 클러스터를 운영 중이라면, Hubble을 꼭 도입해보세요. 복잡한 네트워크 트래픽을 시각적으로 이해하고, 빠르게 문제를 진단하는 데 큰 도움이 될 것입니다.


🔗 참고 링크

 

Hubble 설치

✅ helm 설치 , 4244, 4245 메트릭 포트에 대해서  

# 설치방안 1 : hubble 활성화, 메트릭 설정 등등
helm upgrade cilium cilium/cilium --namespace kube-system --reuse-values \
--set hubble.enabled=true \
--set hubble.relay.enabled=true \
--set hubble.ui.enabled=true \
--set hubble.ui.service.type=NodePort \
--set hubble.ui.service.nodePort=31234 \
--set hubble.export.static.enabled=true \
--set hubble.export.static.filePath=/var/run/cilium/hubble/events.log \
--set prometheus.enabled=true \
--set operator.prometheus.enabled=true \
--set hubble.metrics.enableOpenMetrics=true \
--set hubble.metrics.enabled="{dns,drop,tcp,flow,port-distribution,icmp,httpV2:exemplars=true;labelsContext=source_ip\,source_namespace\,source_workload\,destination_ip\,destination_namespace\,destination_workload\,traffic_direction}"

# 설치방안 2 : hubble 활성화
cilium hubble enable
cilium hubble enable --ui


# This is required for Relay to operate correctly.
cilium status
Hubble Relay:       OK

#
cilium config view | grep -i hubble
kubectl get cm -n kube-system cilium-config -o json | grep -i hubble

#
kubectl get secret -n kube-system | grep -iE 'cilium-ca|hubble'

# # Enabling Hubble requires the TCP port 4244 to be open on all nodes running Cilium.
ss -tnlp | grep -iE 'cilium|hubble' | tee after.txt
vi -d before.txt after.txt
for i in w1 w2 ; do echo ">> node : k8s-$i <<"; sshpass -p 'vagrant' ssh vagrant@k8s-$i sudo ss -tnlp |grep 4244 ; echo; done

#
kubectl get pod -n kube-system -l k8s-app=hubble-relay
kc describe pod -n kube-system -l k8s-app=hubble-relay

kc get svc,ep -n kube-system hubble-relay
...
NAME                     ENDPOINTS           AGE
endpoints/hubble-relay   172.20.1.202:4245   7m54s


# hubble-relay 는 hubble-peer 의 서비스(ClusterIP :443)을 통해 모든 노드의 :4244에 요청 가져올 수 있음
kubectl get cm -n kube-system
kubectl describe cm -n kube-system hubble-relay-config
...
cluster-name: default
peer-service: "hubble-peer.kube-system.svc.cluster.local.:443"
listen-address: :4245
...

#
kubectl get svc,ep -n kube-system hubble-peer
NAME                  TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
service/hubble-peer   ClusterIP   10.96.145.0   <none>        443/TCP   5h55m

NAME                    ENDPOINTS                                                     AGE
endpoints/hubble-peer   192.168.10.100:4244,192.168.10.101:4244,192.168.10.102:4244   5h55m

#
kc describe pod -n kube-system -l k8s-app=hubble-ui
...
Containers:
  frontend:
  ...
  backend:
...

kc describe cm -n kube-system hubble-ui-nginx
...

#
kubectl get svc,ep -n kube-system hubble-ui
NAME                TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
service/hubble-ui   NodePort   10.96.66.67   <none>        80:31234/TCP   17m

NAME                  ENDPOINTS          AGE
endpoints/hubble-ui   172.20.2.70:8081   17m

# hubble ui 웹 접속 주소 확인
NODEIP=$(ip -4 addr show eth1 | grep -oP '(?<=inet\s)\d+(\.\d+){3}')
echo -e "http://$NODEIP:31234"

📌 Helm 옵션 설명

🔧 기본 구성 옵션

옵션 설명
--set hubble.enabled=true Hubble 기능을 활성화하여 네트워크 및 보안 가시성 기능을 켭니다.
--set hubble.relay.enabled=true Hubble Relay를 활성화하여 멀티 노드 및 멀티 클러스터 환경에서 중앙화된 가시성 제공
--set hubble.ui.enabled=true 웹 기반 Hubble UI를 활성화하여 시각적으로 네트워크 흐름을 탐색할 수 있습니다.

🌐 UI 접근 설정

옵션 설명
--set hubble.ui.service.type=NodePort Hubble UI를 외부에서 접근 가능하도록 NodePort로 서비스 타입 설정
--set hubble.ui.service.nodePort=31234 NodePort로 사용할 포트를 31234번으로 지정 (브라우저에서 <노드IP>:31234 로 접근 가능)

📄 이벤트 로그 내보내기 설정

옵션 설명
--set hubble.export.static.enabled=true Hubble에서 수집한 이벤트를 파일로 저장하도록 로그 내보내기 기능 활성화
--set hubble.export.static.filePath=/var/run/cilium/hubble/events.log 이벤트 로그를 저장할 파일 경로 지정

📈 Prometheus 메트릭 설정

옵션 설명
--set prometheus.enabled=true Cilium 자체 메트릭을 Prometheus로 노출
--set operator.prometheus.enabled=true Cilium Operator 메트릭도 함께 Prometheus에 노출

📊 Hubble 메트릭 수집 설정

옵션 설명
--set hubble.metrics.enableOpenMetrics=true OpenMetrics 포맷 지원을 통해 Prometheus와 호환되는 메트릭 포맷 활성화
--set hubble.metrics.enabled="{...}" 수집할 메트릭 종류 및 라벨 정보 지정 (아래 상세 설명 참조)

📊 hubble.metrics.enabled  세부 구성 예시:

--set hubble.metrics.enabled="{dns,drop,tcp,flow,port-distribution,icmp,httpV2:exemplars=true;labelsContext=source_ip\,source_namespace\,source_workload\,destination_ip\,destination_namespace\,destination_workload\,traffic_direction}"

 

  • dns: DNS 요청/응답 메트릭
  • drop: 드롭된 패킷 통계
  • tcp: TCP 연결 상태
  • flow: 트래픽 흐름 기반 메트릭
  • port-distribution: 포트 분포 정보
  • icmp: ping 등 ICMP 패킷
  • httpV2: HTTP 요청/응답 메트릭
    • exemplars=true: tracing 연동 활성화
    • labelsContext=...: 풍부한 라벨 지정 (IP, 네임스페이스, 워크로드 등)
(⎈|HomeLab:N/A) root@k8s-ctr:~# cilium config view | grep -i hubble
..중략
hubble-metrics                                    dns drop tcp flow port-distribution icmp httpV2:exemplars=true;labelsContext=source_ip,source_namespace,source_workload,destination_ip,destination_namespace,destination_workload,traffic_direction
..중략

 

 

## Enabling Hubble requires the TCP port 4244 to be open on all nodes running Cilium.

 🎀 4244 port 

 Hubble Relay는 여러 Cilium 에이전트(Hubble API) 에서 수집한 네트워크 흐름 데이터를 중앙에서 모아주는 역할을 하는 컴포넌트입니다.

 hubble-relay 는 hubble-peer 의 서비스(ClusterIP :443)을 통해 모든 노드의 :4244에 요청 가져올 수 있음

각 노드에 4244 포트가 열림 

(⎈|HomeLab:N/A) root@k8s-ctr:~# ss -tnlp | grep -iE 'cilium|hubble' | tee after.txt
LISTEN 0      4096          0.0.0.0:9964       0.0.0.0:*    users:(("cilium-envoy",pid=5861,fd=25))
LISTEN 0      4096          0.0.0.0:9964       0.0.0.0:*    users:(("cilium-envoy",pid=5861,fd=24))
LISTEN 0      4096        127.0.0.1:37567      0.0.0.0:*    users:(("cilium-agent",pid=7640,fd=53))
LISTEN 0      4096        127.0.0.1:9890       0.0.0.0:*    users:(("cilium-agent",pid=7640,fd=6))
LISTEN 0      4096        127.0.0.1:9891       0.0.0.0:*    users:(("cilium-operator",pid=5014,fd=6))
LISTEN 0      4096        127.0.0.1:9878       0.0.0.0:*    users:(("cilium-envoy",pid=5861,fd=27))
LISTEN 0      4096        127.0.0.1:9878       0.0.0.0:*    users:(("cilium-envoy",pid=5861,fd=26))
LISTEN 0      4096        127.0.0.1:9879       0.0.0.0:*    users:(("cilium-agent",pid=7640,fd=62))
LISTEN 0      4096        127.0.0.1:9234       0.0.0.0:*    users:(("cilium-operator",pid=5014,fd=9))
LISTEN 0      4096                *:9963             *:*    users:(("cilium-operator",pid=5014,fd=7))
LISTEN 0      4096                *:9962             *:*    users:(("cilium-agent",pid=7640,fd=7))
LISTEN 0      4096                *:9965             *:*    users:(("cilium-agent",pid=7640,fd=32))
LISTEN 0      4096                *:4244             *:*    users:(("cilium-agent",pid=7640,fd=48))



(⎈|HomeLab:N/A) root@k8s-ctr:~# kubectl get svc,ep -n kube-system hubble-peer
Warning: v1 Endpoints is deprecated in v1.33+; use discovery.k8s.io/v1 EndpointSlice
NAME                  TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
service/hubble-peer   ClusterIP   10.96.16.110   <none>        443/TCP   30m

NAME                    ENDPOINTS                                                     AGE
endpoints/hubble-peer   192.168.10.100:4244,192.168.10.101:4244,192.168.10.102:4244   30m

 

 🎀 4245 port 

Prometheus가 Hubble Relay의 메트릭을 스크랩할 수 있도록 노출하는 HTTP 포트

 

  • Hubble Relay는 내부적으로 Prometheus와 연동 가능한 메트릭을 제공합니다.
  • 이 메트릭은 /metrics HTTP 엔드포인트에서 노출되며, 기본적으로 4245 포트를 통해 접근 가능합니다.
  • Prometheus 설정 시 targetPort: 4245를 바라보게 하면, Hubble Relay의 성능이나 데이터 흐름 관련 메트릭을 수집할 수 있습니다.

 

✅ Hubble Client 설치 

HUBBLE_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/hubble/master/stable.txt)
HUBBLE_ARCH=amd64
if [ "$(uname -m)" = "aarch64" ]; then HUBBLE_ARCH=arm64; fi
curl -L --fail --remote-name-all https://github.com/cilium/hubble/releases/download/$HUBBLE_VERSION/hubble-linux-${HUBBLE_ARCH}.tar.gz{,.sha256sum}
sudo tar xzvfC hubble-linux-${HUBBLE_ARCH}.tar.gz /usr/local/bin
which hubble
hubble status

 

failed getting status: rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing: dial tcp 127.0.0.1:4245: connect: connection refused"

 

✅ Hubble Client connection 이슈 발생 이유 - 4245 포트 포워딩 필요!!

#
cilium hubble port-forward&
Hubble Relay is available at 127.0.0.1:4245

# Now you can validate that you can access the Hubble API via the installed CLI
hubble status
Healthcheck (via localhost:4245): Ok
Current/Max Flows: 12,285/12,285 (100.00%)
Flows/s: 41.20

# hubble (api) server 기본 접속 주소 확인
hubble config view 
...
port-forward-port: "4245"
server: localhost:4245
...

# (옵션) 현재 k8s-ctr 가상머신이 아닌, 자신의 PC에 kubeconfig 설정 후 아래 --server 옵션을 통해 hubble api server 사용해보자!
hubble help status | grep 'server string'
      --server string                 Address of a Hubble server. Ignored when --input-file or --port-forward is provided. (default "localhost:4245")

# You can also query the flow API and look for flows
kubectl get ciliumendpoints.cilium.io -n kube-system # SECURITY IDENTITY

NAME                           SECURITY IDENTITY   ENDPOINT STATE   IPV4           IPV6
coredns-674b8bbfcf-92wf6       486                 ready            172.20.0.203
coredns-674b8bbfcf-d6r5p       486                 ready            172.20.0.81
hubble-relay-5dcd46f5c-xdlg7   13792               ready            172.20.1.246
hubble-ui-76d4965bb6-p2zvw     4475                ready            172.20.2.155

 

✅ Hubble observe를 통해 API Query 가능 -> flow를 확인 가능 

(⎈|HomeLab:N/A) root@k8s-ctr:~# hubble observe
Jul 21 05:19:36.116: kube-system/hubble-relay-5dcd46f5c-xdlg7:40184 (ID:13792) <- 192.168.10.101:4244 (host) to-endpoint FORWARDED (TCP Flags: ACK, PSH)
Jul 21 05:19:38.282: 10.0.2.15:58512 (host) -> kube-system/hubble-ui-76d4965bb6-p2zvw:8081 (ID:4475) to-endpoint FORWARDED (TCP Flags: SYN)
Jul 21 05:19:38.282: 10.0.2.15:58512 (host) <- kube-system/hubble-ui-76d4965bb6-p2zvw:8081 (ID:4475) to-stack FORWARDED (TCP Flags: SYN, ACK)
Jul 21 05:19:38.282: 10.0.2.15:58512 (host) -> kube-system/hubble-ui-76d4965bb6-p2zvw:8081 (ID:4475) to-endpoint FORWARDED (TCP Flags: ACK)
Jul 21 05:19:38.282: 10.0.2.15:58512 (host) <> kube-system/hubble-ui-76d4965bb6-p2zvw (ID:4475) pre-xlate-rev TRACED (TCP)
Jul 21 05:19:38.282: 10.0.2.15:58512 (host) -> kube-system/hubble-ui-76d4965bb6-p2zvw:8081 (ID:4475) to-endpoint FORWARDED (TCP Flags: ACK, PSH)
Jul 21 05:19:38.282: 10.0.2.15:58512 (host) <> kube-system/hubble-ui-76d4965bb6-p2zvw (ID:4475) pre-xlate-rev TRACED (TCP)
Jul 21 05:19:38.282: 10.0.2.15:58512 (host) <> kube-system/hubble-ui-76d4965bb6-p2zvw (ID:4475) pre-xlate-rev TRACED (TCP)
Jul 21 05:19:38.282: 10.0.2.15:58512 (host) <- kube-system/hubble-ui-76d4965bb6-p2zvw:8081 (ID:4475) to-stack FORWARDED (TCP Flags: ACK, PSH)
Jul 21 05:19:38.283: 10.0.2.15:58512 (host) -> kube-system/hubble-ui-76d4965bb6-p2zvw:8081 (ID:4475) to-endpoint FORWARDED (TCP Flags: ACK, FIN)
Jul 21 05:19:38.283: 10.0.2.15:58512 (host) <- kube-system/hubble-ui-76d4965bb6-p2zvw:8081 (ID:4475) to-stack FORWARDED (TCP Flags: ACK, FIN)
Jul 21 05:19:38.283: 10.0.2.15:58512 (host) -> kube-system/hubble-ui-76d4965bb6-p2zvw:8081 (ID:4475) to-endpoint FORWARDED (TCP Flags: ACK)
Jul 21 05:19:38.690: 192.168.10.102:33962 (host) -> 192.168.10.100:6443 (kube-apiserver) to-network FORWARDED (TCP Flags: ACK)
Jul 21 05:19:38.900: 10.0.2.15:44190 (host) -> kube-system/hubble-relay-5dcd46f5c-xdlg7:4222 (ID:13792) to-endpoint FORWARDED (TCP Flags: SYN)
Jul 21 05:19:38.900: 10.0.2.15:44190 (host) <- kube-system/hubble-relay-5dcd46f5c-xdlg7:4222 (ID:13792) to-stack FORWARDED (TCP Flags: SYN, ACK)
Jul 21 05:19:38.900: 10.0.2.15:44190 (host) -> kube-system/hubble-relay-5dcd46f5c-xdlg7:4222 (ID:13792) to-endpoint FORWARDED (TCP Flags: ACK)
Jul 21 05:19:38.900: 10.0.2.15:44190 (host) <> kube-system/hubble-relay-5dcd46f5c-xdlg7 (ID:13792) pre-xlate-rev TRACED (TCP)
Jul 21 05:19:38.900: 10.0.2.15:44190 (host) <> kube-system/hubble-relay-5dcd46f5c-xdlg7 (ID:13792) pre-xlate-rev TRACED (TCP)
Jul 21 05:19:38.900: 10.0.2.15:44190 (host) <> kube-system/hubble-relay-5dcd46f5c-xdlg7 (ID:13792) pre-xlate-rev TRACED (TCP)
Jul 21 05:19:38.901: 10.0.2.15:44190 (host) <- kube-system/hubble-relay-5dcd46f5c-xdlg7:4222 (ID:13792) to-stack FORWARDED (TCP Flags: ACK, PSH)
Jul 21 05:19:38.901: 10.0.2.15:44190 (host) -> kube-system/hubble-relay-5dcd46f5c-xdlg7:4222 (ID:13792) to-endpoint FORWARDED (TCP Flags: ACK, PSH)
Jul 21 05:19:38.901: 10.0.2.15:44190 (host) <> kube-system/hubble-relay-5dcd46f5c-xdlg7 (ID:13792) pre-xlate-rev TRACED (TCP)
Jul 21 05:19:38.901: 10.0.2.15:44190 (host) <> kube-system/hubble-relay-5dcd46f5c-xdlg7 (ID:13792) pre-xlate-rev TRACED (TCP)
Jul 21 05:19:38.901: 10.0.2.15:44190 (host) -> kube-system/hubble-relay-5dcd46f5c-xdlg7:4222 (ID:13792) to-endpoint FORWARDED (TCP Flags: ACK, FIN)
Jul 21 05:19:38.901: 10.0.2.15:44190 (host) <- kube-system/hubble-relay-5dcd46f5c-xdlg7:4222 (ID:13792) to-stack FORWARDED (TCP Flags: ACK, FIN)
Jul 21 05:19:38.901: 10.0.2.15:44190 (host) -> kube-system/hubble-relay-5dcd46f5c-xdlg7:4222 (ID:13792) to-endpoint FORWARDED (TCP Flags: ACK)
Jul 21 05:19:38.985: 127.0.0.1:56518 (world) <> 192.168.10.101 (host) pre-xlate-rev TRACED (TCP)
Jul 21 05:19:39.591: 127.0.0.1:8090 (world) <> kube-system/hubble-ui-76d4965bb6-p2zvw (ID:4475) pre-xlate-rev TRACED (TCP)
Jul 21 05:19:39.591: 127.0.0.1:8090 (world) <> kube-system/hubble-ui-76d4965bb6-p2zvw (ID:4475) pre-xlate-rev TRACED (TCP)
Jul 21 05:19:39.591: 127.0.0.1:42022 (world) <> kube-system/hubble-ui-76d4965bb6-p2zvw (ID:4475) pre-xlate-rev TRACED (TCP)
Jul 21 05:19:39.591: 127.0.0.1:42022 (world) <> kube-system/hubble-ui-76d4965bb6-p2zvw (ID:4475) pre-xlate-rev TRACED (TCP)
Jul 21 05:19:39.591: 127.0.0.1:42022 (world) <> kube-system/hubble-ui-76d4965bb6-p2zvw (ID:4475) pre-xlate-rev TRACED (TCP)
Jul 21 05:19:39.591: 127.0.0.1:42022 (world) <> kube-system/hubble-ui-76d4965bb6-p2zvw (ID:4475) pre-xlate-rev TRACED (TCP)
Jul 21 05:19:39.591: 127.0.0.1:42022 (world) <> kube-system/hubble-ui-76d4965bb6-p2zvw (ID:4475) pre-xlate-rev TRACED (TCP)
Jul 21 05:19:39.592: 127.0.0.1:8090 (world) <> kube-system/hubble-ui-76d4965bb6-p2zvw (ID:4475) pre-xlate-rev TRACED (TCP)
Jul 21 05:19:39.747: 127.0.0.1:8080 (world) <> kube-system/coredns-674b8bbfcf-d6r5p (ID:486) pre-xlate-rev TRACED (TCP)
Jul 21 05:19:39.747: 127.0.0.1:47548 (world) <> kube-system/coredns-674b8bbfcf-d6r5p (ID:486) pre-xlate-rev TRACED (TCP)
Jul 21 05:19:39.747: 127.0.0.1:47548 (world) <> kube-system/coredns-674b8bbfcf-d6r5p (ID:486) pre-xlate-rev TRACED (TCP)
Jul 21 05:19:39.747: 127.0.0.1:47548 (world) <> kube-system/coredns-674b8bbfcf-d6r5p (ID:486) pre-xlate-rev TRACED (TCP)
Jul 21 05:19:39.747: 127.0.0.1:8080 (world) <> kube-system/coredns-674b8bbfcf-d6r5p (ID:486) pre-xlate-rev TRACED (TCP)
Jul 21 05:19:39.747: 127.0.0.1:8080 (world) <> kube-system/coredns-674b8bbfcf-d6r5p (ID:486) pre-xlate-rev TRACED (TCP)
Jul 21 05:19:39.747: 127.0.0.1:8080 (world) <> kube-system/coredns-674b8bbfcf-d6r5p (ID:486) pre-xlate-rev TRACED (TCP)
Jul 21 05:19:39.747: 127.0.0.1:8080 (world) <> kube-system/coredns-674b8bbfcf-d6r5p (ID:486) pre-xlate-rev TRACED (TCP)
Jul 21 05:19:39.747: 127.0.0.1:47548 (world) <> kube-system/coredns-674b8bbfcf-d6r5p (ID:486) pre-xlate-rev TRACED (TCP)
Jul 21 05:19:39.747: 127.0.0.1:47548 (world) <> kube-system/coredns-674b8bbfcf-d6r5p (ID:486) pre-xlate-rev TRACED (TCP)
Jul 21 05:19:39.747: 127.0.0.1:8080 (world) <> kube-system/coredns-674b8bbfcf-92wf6 (ID:486) pre-xlate-rev TRACED (TCP)
Jul 21 05:19:39.747: 127.0.0.1:47558 (world) <> kube-system/coredns-674b8bbfcf-92wf6 (ID:486) pre-xlate-rev TRACED (TCP)
Jul 21 05:19:39.747: 127.0.0.1:47558 (world) <> kube-system/coredns-674b8bbfcf-92wf6 (ID:486) pre-xlate-rev TRACED (TCP)
Jul 21 05:19:39.747: 127.0.0.1:47558 (world) <> kube-system/coredns-674b8bbfcf-92wf6 (ID:486) pre-xlate-rev TRACED (TCP)
Jul 21 05:19:39.747: 127.0.0.1:8080 (world) <> kube-system/coredns-674b8bbfcf-92wf6 (ID:486) pre-xlate-rev TRACED (TCP)
Jul 21 05:19:39.747: 127.0.0.1:8080 (world) <> kube-system/coredns-674b8bbfcf-92wf6 (ID:486) pre-xlate-rev TRACED (TCP)
Jul 21 05:19:39.747: 127.0.0.1:8080 (world) <> kube-system/coredns-674b8bbfcf-92wf6 (ID:486) pre-xlate-rev TRACED (TCP)
Jul 21 05:19:39.747: 127.0.0.1:8080 (world) <> kube-system/coredns-674b8bbfcf-92wf6 (ID:486) pre-xlate-rev TRACED (TCP)
Jul 21 05:19:39.747: 127.0.0.1:47558 (world) <> kube-system/coredns-674b8bbfcf-92wf6 (ID:486) pre-xlate-rev TRACED (TCP)
Jul 21 05:19:39.748: 127.0.0.1:47558 (world) <> kube-system/coredns-674b8bbfcf-92wf6 (ID:486) pre-xlate-rev TRACED (TCP)
Jul 21 05:19:39.998: 192.168.10.101:52878 (host) -> 192.168.10.100:6443 (kube-apiserver) to-network FORWARDED (TCP Flags: ACK)
Jul 21 05:19:40.165: 127.0.0.1:33248 (world) <> kube-system/hubble-relay-5dcd46f5c-xdlg7 (ID:13792) pre-xlate-rev TRACED (TCP)
Jul 21 05:19:40.166: 127.0.0.1:33248 (world) <> kube-system/hubble-relay-5dcd46f5c-xdlg7 (ID:13792) pre-xlate-rev TRACED (TCP)
Jul 21 05:19:40.166: 127.0.0.1:33248 (world) <> kube-system/hubble-relay-5dcd46f5c-xdlg7 (ID:13792) pre-xlate-rev TRACED (TCP)
Jul 21 05:19:40.166: 127.0.0.1:33248 (world) <> kube-system/hubble-relay-5dcd46f5c-xdlg7 (ID:13792) pre-xlate-rev TRACED (TCP)

✅ Hubble Getting Started with the Star Wars Demo & Hubble/UI - Docs

 🎀 Demo Application 

  • 스타워즈에서 영감을 받은 예제에서는 데스스타, 타이파이터, 엑스윙의 세 가지 마이크로서비스 애플리케이션이 있습니다.
  • 데스스타는 포트 80에서 HTTP 웹서비스를 실행하며, 이 서비스는 두 개의 포드 복제본에 걸쳐 데스스타에 대한 요청을 로드 밸런싱하는 Kubernetes 서비스로 노출됩니다.
  • 데스스타 서비스는 제국의 우주선에 착륙 서비스를 제공하여 착륙 포트를 요청할 수 있도록 합니다.
  • 타이파이터 포드는 일반적인 제국 선박의 착륙 요청 클라이언트 서비스를 나타내며, 엑스윙은 동맹 선박의 유사한 서비스를 나타냅니다.
  • 데스스타 착륙 서비스에 대한 접근 제어를 위한 다양한 보안 정책을 테스트할 수 있도록 존재합니다.

✅ demo application deploy

#
kubectl apply -f https://raw.githubusercontent.com/cilium/cilium/1.17.6/examples/minikube/http-sw-app.yaml
service/deathstar created
deployment.apps/deathstar created
pod/tiefighter created
pod/xwing created

# 파드 라벨 labels 확인
kubectl get pod --show-labels
NAME                        READY   STATUS    RESTARTS   AGE   LABELS
deathstar-8c4c77fb7-9klws   1/1     Running   0          29s   app.kubernetes.io/name=deathstar,class=deathstar,org=empire,pod-template-hash=8c4c77fb7
deathstar-8c4c77fb7-kkwds   1/1     Running   0          29s   app.kubernetes.io/name=deathstar,class=deathstar,org=empire,pod-template-hash=8c4c77fb7
tiefighter                  1/1     Running   0          29s   app.kubernetes.io/name=tiefighter,class=tiefighter,org=empire
xwing                       1/1     Running   0          29s   app.kubernetes.io/name=xwing,class=xwing,org=alliance

kubectl get deploy,svc,ep deathstar
NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/deathstar   2/2     2            2           114s

NAME                TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/deathstar   ClusterIP   10.96.154.223   <none>        80/TCP    114s

NAME                  ENDPOINTS                      AGE
endpoints/deathstar   172.20.1.34:80,172.20.2.1:80   114s

✅ cilium endpoint 

 root@k8s-ctr:~# kubectl get ciliumendpoints.cilium.io -A
NAMESPACE     NAME                           SECURITY IDENTITY   ENDPOINT STATE   IPV4           IPV6
default       deathstar-8c4c77fb7-58qrq      36019               ready            172.20.1.196
default       deathstar-8c4c77fb7-nckpd      15464               ready            172.20.2.188
default       tiefighter                     10509               ready            172.20.1.81
default       xwing                          10192               ready            172.20.1.4

root@k8s-ctr:~# kubectl exec -it -n kube-system ds/cilium -c cilium-agent -- cilium endpoint list

ENDPOINT   POLICY (ingress)   POLICY (egress)   IDENTITY   LABELS (source:key[=value])                                                  IPv6   IPv4           STATUS
           ENFORCEMENT        ENFORCEMENT
3356       Disabled           Disabled          486        k8s:io.cilium.k8s.namespace.labels.kubernetes.io/metadata.name=kube-system          172.20.0.81    ready
                                                           k8s:io.cilium.k8s.policy.cluster=default
                                                           k8s:io.cilium.k8s.policy.serviceaccount=coredns
                                                           k8s:io.kubernetes.pod.namespace=kube-system
                                                           k8s:k8s-app=kube-dns
3691       Disabled           Disabled          486        k8s:io.cilium.k8s.namespace.labels.kubernetes.io/metadata.name=kube-system          172.20.0.203   ready
                                                           k8s:io.cilium.k8s.policy.cluster=default
                                                           k8s:io.cilium.k8s.policy.serviceaccount=coredns
                                                           k8s:io.kubernetes.pod.namespace=kube-system
                                                           k8s:k8s-app=kube-dns
3863       Disabled           Disabled          1          k8s:node-role.kubernetes.io/control-plane                                                          ready
                                                           k8s:node.kubernetes.io/exclude-from-external-load-balancers
                                                           reserved:host
(⎈|HomeLab:N/A) root@k8s-ctr:~# c0 endpoint list
ENDPOINT   POLICY (ingress)   POLICY (egress)   IDENTITY   LABELS (source:key[=value])                                                  IPv6   IPv4           STATUS
           ENFORCEMENT        ENFORCEMENT
3356       Disabled           Disabled          486        k8s:io.cilium.k8s.namespace.labels.kubernetes.io/metadata.name=kube-system          172.20.0.81    ready
                                                           k8s:io.cilium.k8s.policy.cluster=default
                                                           k8s:io.cilium.k8s.policy.serviceaccount=coredns
                                                           k8s:io.kubernetes.pod.namespace=kube-system
                                                           k8s:k8s-app=kube-dns
3691       Disabled           Disabled          486        k8s:io.cilium.k8s.namespace.labels.kubernetes.io/metadata.name=kube-system          172.20.0.203   ready
                                                           k8s:io.cilium.k8s.policy.cluster=default
                                                           k8s:io.cilium.k8s.policy.serviceaccount=coredns
                                                           k8s:io.kubernetes.pod.namespace=kube-system
                                                           k8s:k8s-app=kube-dns
3863       Disabled           Disabled          1          k8s:node-role.kubernetes.io/control-plane                                                          ready
                                                           k8s:node.kubernetes.io/exclude-from-external-load-balancers
                                                           reserved:host
(⎈|HomeLab:N/A) root@k8s-ctr:~# c1 endpoint list
ENDPOINT   POLICY (ingress)   POLICY (egress)   IDENTITY   LABELS (source:key[=value])                                                  IPv6   IPv4           STATUS
           ENFORCEMENT        ENFORCEMENT
41         Disabled           Disabled          10509      k8s:app.kubernetes.io/name=tiefighter                                               172.20.1.81    ready
                                                           k8s:class=tiefighter
                                                           k8s:io.cilium.k8s.namespace.labels.kubernetes.io/metadata.name=default
                                                           k8s:io.cilium.k8s.policy.cluster=default
                                                           k8s:io.cilium.k8s.policy.serviceaccount=default
                                                           k8s:io.kubernetes.pod.namespace=default
                                                           k8s:org=empire
207        Disabled           Disabled          1          reserved:host                                                                                      ready
611        Disabled           Disabled          13792      k8s:app.kubernetes.io/name=hubble-relay                                             172.20.1.246   ready
                                                           k8s:app.kubernetes.io/part-of=cilium
                                                           k8s:io.cilium.k8s.namespace.labels.kubernetes.io/metadata.name=kube-system
                                                           k8s:io.cilium.k8s.policy.cluster=default
                                                           k8s:io.cilium.k8s.policy.serviceaccount=hubble-relay
                                                           k8s:io.kubernetes.pod.namespace=kube-system
                                                           k8s:k8s-app=hubble-relay
696        Disabled           Disabled          36019      k8s:app.kubernetes.io/name=deathstar                                                172.20.1.196   ready
                                                           k8s:class=deathstar
                                                           k8s:io.cilium.k8s.namespace.labels.kubernetes.io/metadata.name=default
                                                           k8s:io.cilium.k8s.policy.cluster=default
                                                           k8s:io.cilium.k8s.policy.serviceaccount=default
                                                           k8s:io.kubernetes.pod.namespace=default
                                                           k8s:org=empire
1840       Disabled           Disabled          10192      k8s:app.kubernetes.io/name=xwing                                                    172.20.1.4     ready
                                                           k8s:class=xwing
                                                           k8s:io.cilium.k8s.namespace.labels.kubernetes.io/metadata.name=default
                                                           k8s:io.cilium.k8s.policy.cluster=default
                                                           k8s:io.cilium.k8s.policy.serviceaccount=default
                                                           k8s:io.kubernetes.pod.namespace=default
                                                           k8s:org=alliance
(⎈|HomeLab:N/A) root@k8s-ctr:~# c2 endpoint list
ENDPOINT   POLICY (ingress)   POLICY (egress)   IDENTITY   LABELS (source:key[=value])                                                  IPv6   IPv4           STATUS
           ENFORCEMENT        ENFORCEMENT
296        Disabled           Disabled          4475       k8s:app.kubernetes.io/name=hubble-ui                                                172.20.2.155   ready
                                                           k8s:app.kubernetes.io/part-of=cilium
                                                           k8s:io.cilium.k8s.namespace.labels.kubernetes.io/metadata.name=kube-system
                                                           k8s:io.cilium.k8s.policy.cluster=default
                                                           k8s:io.cilium.k8s.policy.serviceaccount=hubble-ui
                                                           k8s:io.kubernetes.pod.namespace=kube-system
                                                           k8s:k8s-app=hubble-ui
396        Disabled           Disabled          15464      k8s:app.kubernetes.io/name=deathstar                                                172.20.2.188   ready
                                                           k8s:class=deathstar
                                                           k8s:io.cilium.k8s.namespace.labels.kubernetes.io/metadata.name=default
                                                           k8s:io.cilium.k8s.policy.cluster=default
                                                           k8s:io.cilium.k8s.policy.serviceaccount=default
                                                           k8s:io.kubernetes.pod.namespace=default
                                                           k8s:org=empire
1209       Disabled           Disabled          1          reserved:host                                                                                      ready

 

🔐 Security Identity 

Security Identity는 Cilium이 Pod (또는 서비스) 에 부여하는 숫자 기반의 보안 식별자(ID)입니다.
이 ID는 네트워크 정책을 평가하고, 트래픽을 제어할 때 사용되는 기준 정보입니다.

 

🎀 cilium endpoint list

각 노드에 위치한 endpoint list만 호출되는것을 확인 

 

✅ cilium IDENTITY  Check Current Access 

# # 아래 출력에서 xwing 와 tiefighter 의 IDENTITY 메모
c1 endpoint list | grep -iE 'xwing|tiefighter|deathstar'
41         Disabled           Disabled          10509      k8s:app.kubernetes.io/name=tiefighter                                               172.20.1.81    ready
                                                           k8s:class=tiefighter
696        Disabled           Disabled          36019      k8s:app.kubernetes.io/name=deathstar                                                172.20.1.196   ready
                                                           k8s:class=deathstar
1840       Disabled           Disabled          10192      k8s:app.kubernetes.io/name=xwing                                                    172.20.1.4     ready


XWINGID=10192
TIEFIGHTERID=36019
DEATHSTARID=10509

✅ cilium IDENTITY  Check Current Access 

# 호출 시도 1번 Tab 
(⎈|HomeLab:N/A) root@k8s-ctr:~# kubectl exec tiefighter -- curl -s -XPOST deathstar.default.svc.cluster.local/v1/request-landing

# 2번 Tab 모니터링 
(⎈|HomeLab:N/A) root@k8s-ctr:~# hubble observe -f --protocol tcp --from-identity $TIEFIGHTERID
Jul 21 06:10:29.434: default/tiefighter (ID:10509) <> 10.96.248.237:80 (world) pre-xlate-fwd TRACED (TCP)
Jul 21 06:10:29.434: default/tiefighter (ID:10509) <> default/deathstar-8c4c77fb7-58qrq:80 (ID:36019) post-xlate-fwd TRANSLATED (TCP)
Jul 21 06:10:29.434: default/tiefighter:34722 (ID:10509) -> default/deathstar-8c4c77fb7-58qrq:80 (ID:36019) to-endpoint FORWARDED (TCP Flags: SYN)
Jul 21 06:10:29.434: default/tiefighter:34722 (ID:10509) -> default/deathstar-8c4c77fb7-58qrq:80 (ID:36019) to-endpoint FORWARDED (TCP Flags: ACK)
Jul 21 06:10:29.434: default/tiefighter:34722 (ID:10509) -> default/deathstar-8c4c77fb7-58qrq:80 (ID:36019) to-endpoint FORWARDED (TCP Flags: ACK, PSH)
Jul 21 06:10:29.435: default/tiefighter:34722 (ID:10509) <> default/deathstar-8c4c77fb7-58qrq (ID:36019) pre-xlate-rev TRACED (TCP)
Jul 21 06:10:29.435: default/tiefighter:34722 (ID:10509) <> default/deathstar-8c4c77fb7-58qrq (ID:36019) pre-xlate-rev TRACED (TCP)
Jul 21 06:10:29.435: default/tiefighter:34722 (ID:10509) <> default/deathstar-8c4c77fb7-58qrq (ID:36019) pre-xlate-rev TRACED (TCP)
Jul 21 06:10:29.436: default/tiefighter:34722 (ID:10509) <> default/deathstar-8c4c77fb7-58qrq (ID:36019) pre-xlate-rev TRACED (TCP)
Jul 21 06:10:29.436: default/tiefighter:34722 (ID:10509) <> default/deathstar-8c4c77fb7-58qrq (ID:36019) pre-xlate-rev TRACED (TCP)
Jul 21 06:10:29.437: default/tiefighter:34722 (ID:10509) -> default/deathstar-8c4c77fb7-58qrq:80 (ID:36019) to-endpoint FORWARDED (TCP Flags: ACK, FIN)
Jul 21 06:10:29.437: default/tiefighter:34722 (ID:10509) -> default/deathstar-8c4c77fb7-58qrq:80 (ID:36019) to-endpoint FORWARDED (TCP Flags: ACK)

 

Apply an L3/L4 Policy 

  • Cilium을 사용할 때 보안 정책을 정의할 때 엔드포인트 IP 주소는 중요하지 않습니다. 대신 포드에 할당된 레이블을 사용하여 보안 정책을 정의할 수 있습니다. 정책은 클러스터 내에서 실행 중이거나 실행 중인 위치에 관계없이 레이블을 기반으로 올바른 포드에 적용됩니다.
  • 데스스타 착륙 요청을 라벨이 있는 선박(org=empire)으로만 제한하는 기본 정책부터 시작하겠습니다. 이렇게 하면 org=empire 라벨이 없는 선박은 데스스타 서비스와 연결조차 할 수 없습니다. 이 정책은 IP 프로토콜(네트워크 계층 3)과 TCP 프로토콜(네트워크 계층 4)에만 적용되는 간단한 정책이므로 흔히 L3/L4 네트워크 보안 정책이라고 합니다.
  • 참고: 실리움은 상태별 연결 추적을 수행합니다. 이는 정책이 프론트엔드가 백엔드에 도달할 수 있도록 허용하면, 동일한 TCP/UDP 연결 내에서 백엔드 응답의 일부인 모든 필수 응답 패킷이 자동으로 프론트엔드에 도달하도록 허용한다는 것을 의미합니다. → 리턴 패킷 자동 허용!
# CiliumNetworkPolicy
## CiliumNetworkPolicys는 "endpointSelector"를 사용하여 팟 레이블에서 정책이 적용되는 소스와 목적지를 식별합니다. 
## 아래 정책은 TCP 포트 80에서 레이블(org=empire)이 있는 모든 팟에서 레이블(org=empire, class=deathstar)이 있는 데스스타 팟으로 전송되는 트래픽을 화이트리스트로 작성합니다.
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
  name: "rule1"
spec:
  description: "L3-L4 policy to restrict deathstar access to empire ships only"
  endpointSelector:
    matchLabels:
      org: empire
      class: deathstar
  ingress:
  - fromEndpoints:
    - matchLabels:
        org: empire
    toPorts:
    - ports:
      - port: "80"
        protocol: TCP

kubectl apply -f https://raw.githubusercontent.com/cilium/cilium/1.17.6/examples/minikube/sw_l3_l4_policy.yaml
kubectl get cnp
kubectl get cnp -o json | jq

# 모니터링
hubble observe -f --type drop

# 호출 시도 1 
kubectl exec xwing -- curl -s -XPOST deathstar.default.svc.cluster.local/v1/request-landing --connect-timeout 2


# 모니터링 
hubble observe -f --protocol tcp --from-identity $DEATHSTARID

# 호출 시도 2
kubectl exec tiefighter -- curl -s -XPOST deathstar.default.svc.cluster.local/v1/request-landing

xwing -> deatstar로의 착륙을 Drop 한것을 확인할수 있습니다.

 

Apply and Test HTTP-aware L7 Policy

🎀 cilium-envoy 데몬셋이 담당

(⎈|HomeLab:N/A) root@k8s-ctr:~# kubectl get pods -n kube-system -l k8s-app=cilium-envoy -owide
NAME                 READY   STATUS    RESTARTS   AGE     IP               NODE      NOMINATED NODE   READINESS GATES
cilium-envoy-dqt9x   1/1     Running   0          4h17m   192.168.10.102   k8s-w2    <none>           <none>
cilium-envoy-dsxk6   1/1     Running   0          4h18m   192.168.10.101   k8s-w1    <none>           <none>
cilium-envoy-shnfq   1/1     Running   0          4h20m   192.168.10.100   k8s-ctr   <none>           <none>

 

  • 앞서 진행한 간단한 시나리오 (L3,L4단계 ) 에서는 tiefighter / xwing에게 데스스타 API에 대한 전체 액세스 권한을 부여하거나 아예 액세스 권한을 부여하지 않는 것으로 충분했습니다. 그러나 마이크로서비스 간에 가장 강력한 보안(즉, 최소 권한 격리를 강제하는 것)을 제공하기 위해서는 데스스타 API를 호출하는 각 서비스가 합법적인 운영에 필요한 HTTP 요청 세트만 수행하도록 제한해야 합니다.
  • 예를 들어, 데스스타 서비스가 임의의 제국 선박이 호출해서는 안 되는 일부 유지보수중인 또는 전버전인  API를 노출한다고 가정해 보겠습니다. ex ) v1/xxx/
# 모니터링 >> Layer3/4 에서는 애플리케이션 상태를 확인 할 수 없음!
hubble observe -f --protocol tcp --from-identity $DEATHSTARID

# 호출해서는 안 되는 일부 유지보수 API를 노출
kubectl exec tiefighter -- curl -s -XPUT deathstar.default.svc.cluster.local/v1/exhaust-port

Panic: deathstar exploded

goroutine 1 [running]:
main.HandleGarbage(0x2080c3f50, 0x2, 0x4, 0x425c0, 0x5, 0xa)
        /code/src/github.com/empire/deathstar/
        temp/main.go:9 +0x64
main.main()
        /code/src/github.com/empire/deathstar/
        temp/main.go:5 +0x85

 

 

 

Apply and Test HTTP-aware L7 Policy

🎀 Cilium은 HTTP 계층(즉, L7) 정책을 적용하여 타이파이터가 도달할 수 있는 URL을 제한할 수 있습니다. 다음은 타이파이터를 POST /v1/요청-랜딩 API 호출만 수행하도록 제한하고 다른 모든 호출(PUT /v1/배기포트 포함)은 허용하지 않는 정책 파일의 예입니다.

# 기존 rule1 정책을 업데이트 해서 사용
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
  name: "rule1"
spec:
  description: "L7 policy to restrict access to specific HTTP call"
  endpointSelector:
    matchLabels:
      org: empire
      class: deathstar
  ingress:
  - fromEndpoints:
    - matchLabels:
        org: empire
    toPorts:
    - ports:
      - port: "80"
        protocol: TCP
      rules:
        http:
        - method: "POST"
          path: "/v1/request-landing"

# Update the existing rule to apply L7-aware policy to protect deathstar using:
kubectl apply -f https://raw.githubusercontent.com/cilium/cilium/1.17.6/examples/minikube/sw_l3_l4_l7_policy.yaml
kubectl get cnp
kc describe cnp
c0 policy get


# 모니터링 : 파드 이름 지정
hubble observe -f --pod deathstar --protocol http
Jul 20 01:28:02.184: default/tiefighter:59020 (ID:19274) -> default/deathstar-8c4c77fb7-9klws:80 (ID:318) http-request FORWARDED (HTTP/1.1 POST http://deathstar.default.svc.cluster.local/v1/request-landing)
Jul 20 01:28:02.190: default/tiefighter:59020 (ID:19274) <- default/deathstar-8c4c77fb7-9klws:80 (ID:318) http-response FORWARDED (HTTP/1.1 200 6ms (POST http://deathstar.default.svc.cluster.local/v1/request-landing))

# We can now re-run the same test as above, but we will see a different outcome
kubectl exec tiefighter -- curl -s -XPOST deathstar.default.svc.cluster.local/v1/request-landing

해당 테스트는 L7 레이어에서 트래픽을 제어하는 테스트임

- deatstar/v1/request-landing에 대한 트래픽을 제어함 

🔐 목적 요약

  • 특정 라벨(org=empire)을 가진 Pod이, 다른 특정 라벨(org=empire, class=deathstar)을 가진 Pod의 HTTP POST /v1/request-landing 요청만 허용하도록 하는 정책입니다.
  • 다른 요청은 모두 거부(Deny by default) 됨.

Cilium은 "기본 거부 정책(Default Deny)" 모델을 따릅니다.
즉:

명시적으로 허용(allow)된 요청만 통과하고
그 외 모든 요청은 자동으로 차단됩니다.

Apply and Test HTTP-aware L7 Policy ( DROP case )

# monitoring tab
(⎈|HomeLab:N/A) root@k8s-ctr:~# hubble observe -f --pod deathstar --verdict DROPPED
Jul 22 01:35:42.288: default/tiefighter:60678 (ID:10509) -> default/deathstar-8c4c77fb7-58qrq:80 (ID:36019) http-request DROPPED (HTTP/1.1 PUT http://deathstar.default.svc.cluster.local/v1/exhaust-port)

# action tab 
(⎈|HomeLab:N/A) root@k8s-ctr:~# kubectl exec tiefighter -- curl -s -XPUT deathstar.default.svc.cluster.local/v1/exhaust-port
Access denied