Ssoon

[8주차] Cilium CNI : 노드 간 파드 통신 확인 본문

쿠버네티스 네트워크 스터디 3기

[8주차] Cilium CNI : 노드 간 파드 통신 확인

구구달스 2024. 10. 21. 20:20
CloudNet@ 가시다님이 진행하는 쿠버네티스 네트워크 스터디 3기

  TC(Traffic Control)

https://suchakra.wordpress.com/2017/05/23/an-entertaining-ebpf-xdp-adventure/

Linux 커널의 네트워크 트래픽을 조절하고 관리하기 위한 도구입니다. TC를 사용하면 네트워크의 대역폭을 제한하거나, 트래픽의 우선순위를 정하거나, 패킷을 필터링할 수 있습니다. 주로 다음과 같은 기능을 제공합니다:

  • 대역폭 관리: 네트워크 대역폭을 조절하여 특정 애플리케이션이나 서비스가 사용하는 대역폭을 제한하거나 보장합니다.
  • 우선순위 설정: 특정 유형의 트래픽에 더 높은 우선순위를 부여하여, 중요 데이터가 지연 없이 전송될 수 있도록 합니다.
  • 패킷 필터링: 트래픽을 필터링하여 특정 패킷을 차단하거나 허용합니다.

🧿Cilium에서 TC의 역할

Cilium은 eBPF를 활용하여 Kubernetes 환경에서 네트워크 정책을 적용하는데, TC는 이러한 정책을 커널 레벨에서 구현하는 데 사용됩니다. Cilium에서 TC의 주요 기능은 다음과 같습니다:

  • 네트워크 정책 구현: Cilium은 Kubernetes의 Custom Resource Definition (CRD)을 사용하여 네트워크 정책을 정의하고, 이러한 정책을 TC를 통해 실제로 적용합니다. 이로 인해 Kubernetes의 파드 간 통신을 제어할 수 있습니다.
  • 고성능 패킷 처리: Cilium은 eBPF를 통해 TC를 사용하여 패킷을 커널 레벨에서 직접 처리합니다. 이는 사용자 공간과 커널 공간 간의 오버헤드를 줄이고, 성능을 극대화합니다.
  • 지능형 트래픽 관리: TC를 활용하여 애플리케이션의 요구에 맞는 다양한 트래픽 관리 기능을 제공합니다. 예를 들어, 특정 서비스에 대해 대역폭을 제한하거나, QoS(서비스 품질) 정책을 적용할 수 있습니다.

🧿Cilium TC의 작동 방식

Cilium에서 TC가 작동하는 과정은 다음과 같습니다:

  • 정책 정의: 사용자가 Kubernetes에서 Cilium 네트워크 정책을 정의합니다. 예를 들어, 특정 파드 간의 통신을 허용하거나 차단할 수 있습니다.
  • TC 설정: Cilium은 이 정책을 기반으로 TC를 설정하여 패킷 필터링, 우선순위 지정 및 대역폭 관리를 수행합니다.
  • eBPF와의 통합: Cilium은 eBPF를 사용하여 TC와 함께 패킷 처리를 최적화합니다. eBPF 프로그램은 TC의 액션을 수행하며, 패킷이 커널 네트워크 스택으로 넘어가기 전에 필터링할 수 있습니다.
  • 실시간 트래픽 모니터링: Cilium은 TC를 통해 실시간으로 트래픽을 모니터링하고, 필요한 경우 정책을 동적으로 조정할 수 있습니다.

 XDP (Express Data Path)

XDP는 Linux 커널에서 제공하는 기능으로, 고성능 패킷 처리를 가능하게 합니

https://www.iovisor.org/technology/xdp

다. XDP의 주요 특징은 다음과 같습니다:

  • 고성능 패킷 처리: XDP는 패킷을 커널의 네트워크 스택으로 전달하기 전에 사용자 정의 프로그램을 통해 패킷을 처리할 수 있게 합니다. 이를 통해 패킷 처리 속도를 크게 향상시킬 수 있습니다.
  • eBPF와의 통합: XDP는 eBPF를 활용하여 고속 패킷 처리와 관련된 사용자 정의 로직을 작성할 수 있습니다. 이를 통해 복잡한 패킷 필터링이나 로깅, 트래픽 샘플링 등의 작업을 수행할 수 있습니다.
  • 다양한 사용 사례: XDP는 DDoS 방어, 패킷 필터링, 로드 밸런싱 등 다양한 네트워크 관련 작업에 사용할 수 있습니다.

🧿 Cilium과 XDP의 관계

Cilium은 XDP를 활용하여 패킷 처리 성능을 최적화합니다. Cilium의 eBPF 프로그램은 XDP와 함께 작동하여 다음과 같은 방식으로 작용합니다:

  • XDP를 통한 초기 패킷 처리: 패킷이 네트워크 인터페이스 카드(NIC)로부터 수신되면, XDP 프로그램이 먼저 실행되어 패킷을 필터링하거나 조작합니다. 이렇게 함으로써 불필요한 패킷이 커널 네트워크 스택으로 넘어가는 것을 방지하고, 성능을 향상시킵니다.
  • 정교한 정책 적용: XDP에서 패킷이 처리된 후, Cilium의 eBPF 프로그램이 실행되어 L3/L7 정책을 적용합니다. 

BPF program

  • L3/L4/L7 정책 적용:
    • L3/L4 (Network and Transport Layer): Cilium은 IP 주소 및 포트를 기준으로 네트워크 트래픽을 필터링하는 정책을 BPF 프로그램으로 구현합니다.
    • L7 (Application Layer): HTTP, gRPC와 같은 애플리케이션 프로토콜에 기반하여 더 세밀한 정책을 적용합니다.
  • 네트워크 성능 향상: Cilium의 BPF 프로그램은 패킷을 커널에서 직접 처리하여 사용자 공간으로의 전환을 최소화합니다. 이를 통해 패킷 처리 속도가 향상되고, 성능이 극대화됩니다.
  • 서비스 메쉬 기능: Cilium은 BPF를 사용하여 서비스 간의 통신을 추적하고, 모니터링할 수 있는 기능을 제공합니다. 이를 통해 마이크로서비스 아키텍처에서의 데이터 흐름을 이해하고 관리할 수 있습니다.

🧿 BPF 프로그램의 작동 방식

Cilium에서 BPF 프로그램이 작동하는 과정은 다음과 같습니다:

  1. 정책 정의: 사용자는 Kubernetes API를 통해 Cilium 네트워크 정책을 정의합니다. 예를 들어, 특정 파드 간의 트래픽을 허용하거나 차단할 수 있습니다.
  2. BPF 프로그램 생성: Cilium은 이 정책을 기반으로 BPF 프로그램을 생성하고, 이를 커널에 로드합니다.
  3. 패킷 처리: 패킷이 네트워크 인터페이스를 통해 들어오면, Cilium의 BPF 프로그램이 실행되어 정의된 정책에 따라 패킷을 처리합니다. 이 과정에서 패킷을 필터링하고, 로깅하며, 필요한 경우 수정할 수 있습니다.

 


  JIT (Just-In-Time Compilation)

  • JIT는 프로그램이 실행되는 시점에 바이트코드를 머신 코드로 변환하는 기술입니다. 이를 통해 CPU가 직접 실행할 수 있도록 최적화된 코드를 생성합니다.
  • JIT 컴파일을 통해 실행 시간 동안 필요할 때 즉시 코드를 컴파일하므로, 전통적인 컴파일 과정에 비해 성능이 크게 향상됩니다.

🧿 BPF JIT의 작동 방식

BPF JIT의 작동 방식은 다음과 같습니다:

  1. BPF 프로그램 로드: 사용자가 정의한 BPF 프로그램이 커널에 로드됩니다. 이 프로그램은 네트워크 패킷을 처리하기 위한 로직을 포함하고 있습니다.
  2. JIT 컴파일:
    • BPF 프로그램이 커널에 로드될 때, JIT 컴파일러가 이를 감지합니다.
    • JIT 컴파일러는 BPF 바이트코드를 분석하고, 이를 CPU에서 직접 실행할 수 있는 최적화된 머신 코드로 변환합니다.
  3. 머신 코드 실행: JIT 컴파일된 머신 코드는 CPU에서 직접 실행됩니다. 이 과정에서 BPF 프로그램의 성능이 크게 향상되며, 패킷 처리가 더 빠르게 이루어집니다.

 BPF map

Linux 커널의 BPF 시스템에서 사용되는 데이터 구조로, 데이터를 저장하고 효율적으로 액세스하는 데 사용됩니다. BPF는 주로 네트워크 패킷 필터링, 모니터링, 트레이싱 등의 용도로 활용되며, BPF 맵은 이러한 데이터 처리에서 중요한 역할을 합니다.


🧿 파드 생성 및 확인

netpod app: netpod k8s-s nicolaka/netshoot tail -f /dev/null terminationGracePeriodSeconds: 0
webpod1 app: webpod k8s-w1 traefik/whoami - terminationGracePeriodSeconds: 0
webpod2 app: webpod k8s-w2 traefik/whoami - terminationGracePeriodSeconds: 0
  • netpod는 무한 대기 상태로 유지되며, webpod1과 webpod2는 각각 다른 노드에서 traefik/whoami 이미지를 실행합니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
  name: netpod
  labels:
    app: netpod
spec:
  nodeName: k8s-s
  containers:
  - name: netshoot-pod
    image: nicolaka/netshoot
    command: ["tail"]
    args: ["-f", "/dev/null"]
  terminationGracePeriodSeconds: 0
---
apiVersion: v1
kind: Pod
metadata:
  name: webpod1
  labels:
    app: webpod
spec:
  nodeName: k8s-w1
  containers:
  - name: container
    image: traefik/whoami
  terminationGracePeriodSeconds: 0
---
apiVersion: v1
kind: Pod
metadata:
  name: webpod2
  labels:
    app: webpod
spec:
  nodeName: k8s-w2
  containers:
  - name: container
    image: traefik/whoami
  terminationGracePeriodSeconds: 0
EOF
pod/netpod created
pod/webpod1 created
pod/webpod2 created

🧿 Cilium 네트워크의 상태 정보

  • Allocated addresses: Cilium에서 현재 할당된 IP 주소 목록입니다. 각 주소는 특정 기능이나 Pod와 연결되어 있습니다.
172.16.0.12 라우터 주소: 클러스터의 네트워크 라우터 역할을 하는 주소입니다. 다른 네트워크와의 연결을 관리합니다.
172.16.0.230 Pod 주소: netpod라는 이름의 Pod에 할당된 IP 주소입니다. 이 주소를 통해 다른 Pod나 서비스와 통신할 수 있습니다.
172.16.0.236 헬스 체크 주소: Cilium의 건강 상태를 확인하는 데 사용되는 주소입니다. Cilium이 제대로 작동하는지 모니터링합니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# kubectl get pod -o wide
NAME      READY   STATUS    RESTARTS   AGE   IP             NODE     NOMINATED NODE   READINESS GATES
netpod    1/1     Running   0          19s   172.16.0.230   k8s-s    <none>           <none>
webpod1   1/1     Running   0          19s   172.16.1.111   k8s-w1   <none>           <none>
webpod2   1/1     Running   0          19s   172.16.2.180   k8s-w2   <none>           <none>

(⎈|CiliumLab:N/A) root@k8s-s:~# c0 status --verbose | grep Allocated -A5
Allocated addresses:
  172.16.0.12 (router)
  172.16.0.230 (default/netpod)
  172.16.0.236 (health)
IPv4 BIG TCP:           Disabled
IPv6 BIG TCP:           Disabled
172.16.1.111 Pod 주소: webpod1이라는 이름의 Pod에 할당된 IP 주소입니다. 이 주소를 통해 webpod1가 다른 Pod나 서비스와 통신할 수 있습니다.
172.16.1.159 헬스 체크 주소: Cilium의 상태를 확인하는 데 사용되는 주소입니다. Cilium이 정상적으로 작동하는지 모니터링합니다.
172.16.1.198 라우터 주소: 클러스터 내의 네트워크 라우터 역할을 하는 주소입니다. 네트워크 간의 연결을 관리합니다.
172.16.1.210 Pod 주소: kube-system 네임스페이스의 coredns-55cb58b774-2xvk2라는 이름의 Pod에 할당된 IP 주소입니다. DNS 서비스를 제공합니다.
172.16.1.221 Pod 주소: kube-system 네임스페이스의 coredns-55cb58b774-7v788라는 이름의 Pod에 할당된 IP 주소입니다. DNS 서비스를 제공합니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# c1 status --verbose | grep Allocated -A5
Allocated addresses:
  172.16.1.111 (default/webpod1)
  172.16.1.159 (health)
  172.16.1.198 (router)
  172.16.1.210 (kube-system/coredns-55cb58b774-2xvk2 [restored])
  172.16.1.221 (kube-system/coredns-55cb58b774-7v788 [restored])
172.16.2.116 라우터 주소: 클러스터 내의 네트워크 라우터 역할을 하는 주소입니다. 네트워크 간의 연결을 관리합니다.
172.16.2.180 Pod 주소: webpod2라는 이름의 Pod에 할당된 IP 주소입니다. 이 주소를 통해 webpod2가 다른 Pod나 서비스와 통신할 수 있습니다.
172.16.2.73 헬스 체크 주소: Cilium의 상태를 확인하는 데 사용되는 주소입니다. Cilium이 정상적으로 작동하는지 모니터링합니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# c2 status --verbose | grep Allocated -A5
Allocated addresses:
  172.16.2.116 (router)
  172.16.2.180 (default/webpod2)
  172.16.2.73 (health)
IPv4 BIG TCP:           Disabled
IPv6 BIG TCP:           Disabled

🧿 Cilium Endpoint 정보

  • 보안 ID (SECURITY IDENTITY): 각 Pod에 할당된 고유한 보안 ID로, Cilium의 보안 정책 적용에 사용됩니다.
  • 상태 (ENDPOINT STATE): 각 Endpoint의 상태로, ready는 정상적으로 작동하고 있음을 나타냅니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# kubectl get ciliumendpoints
NAME      SECURITY IDENTITY   ENDPOINT STATE   IPV4           IPV6
netpod    39126               ready            172.16.0.230
webpod1   25054               ready            172.16.1.111
webpod2   25054               ready            172.16.2.180

(⎈|CiliumLab:N/A) root@k8s-s:~# kubectl get ciliumendpoints -A
NAMESPACE     NAME                           SECURITY IDENTITY   ENDPOINT STATE   IPV4           IPV6
default       netpod                         39126               ready            172.16.0.230
default       webpod1                        25054               ready            172.16.1.111
default       webpod2                        25054               ready            172.16.2.180
kube-system   coredns-55cb58b774-2xvk2       39166               ready            172.16.1.210
kube-system   coredns-55cb58b774-7v788       39166               ready            172.16.1.221
kube-system   hubble-relay-88f7f89d4-jgwk2   44886               ready            172.16.1.78
kube-system   hubble-ui-59bb4cb67b-vr67b     42840               ready            172.16.1.79

🧿 각 엔드포인트의 정보

  • 엔드포인트 416: netpod 앱에 속하는 정상 작동 중인 Pod입니다.
  • 엔드포인트 905: 헬스 체크를 위한 예약된 엔드포인트입니다.
  • 엔드포인트 1541: Kubernetes의 컨트롤 플레인 역할을 하는 노드에 관련된 엔드포인트입니다.
ENDPOINT 정책 (ingress) 정책 (egress) IDENTITY 레이블 IPv4 상태
416 Disabled Disabled 39126 k8s=netpod 172.16.0.230 ready
905 Disabled Disabled 4 reserved
 
172.16.0.236 ready
1541 Disabled Disabled 1 k8s .kubernetes.io/control-plane
k8s
 
.kubernetes.io/exclude-from-external-load-balancers
reserved
 
- ready
(⎈|CiliumLab:N/A) root@k8s-s:~# c0 endpoint list
ENDPOINT   POLICY (ingress)   POLICY (egress)   IDENTITY   LABELS (source:key[=value])                                              IPv6   IPv4           STATUS
           ENFORCEMENT        ENFORCEMENT
416        Disabled           Disabled          39126      k8s:app=netpod                                                                  172.16.0.230   ready
                                                           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                                                         
905        Disabled           Disabled          4          reserved:health                                                                 172.16.0.236   ready
1541       Disabled           Disabled          1          k8s:node-role.kubernetes.io/control-plane                                                      ready
                                                           k8s:node.kubernetes.io/exclude-from-external-load-balancers                                     
                                                           reserved:host                                                                                   

(⎈|CiliumLab:N/A) root@k8s-s:~# c0 bpf endpoint list
IP ADDRESS        LOCAL ENDPOINT INFO
192.168.10.10:0   (localhost)
172.16.0.12:0     (localhost)
172.16.0.230:0    id=416   sec_id=39126 flags=0x0000 ifindex=10  mac=92:EF:86:7B:D1:D4 nodemac=5E:B5:9A:19:FB:B3
172.16.0.236:0    id=905   sec_id=4     flags=0x0000 ifindex=8   mac=22:1F:BD:B2:24:65 nodemac=BE:40:78:DD:72:24

(⎈|CiliumLab:N/A) root@k8s-s:~# c0 map get cilium_lxc
Key              Value                                                                                            State   Error
172.16.0.236:0   id=905   sec_id=4     flags=0x0000 ifindex=8   mac=22:1F:BD:B2:24:65 nodemac=BE:40:78:DD:72:24   sync
172.16.0.230:0   id=416   sec_id=39126 flags=0x0000 ifindex=10  mac=92:EF:86:7B:D1:D4 nodemac=5E:B5:9A:19:FB:B3   sync

(⎈|CiliumLab:N/A) root@k8s-s:~# c0 ip list
IP                  IDENTITY                                                                     SOURCE
0.0.0.0/0           reserved:world
172.16.0.12/32      reserved:host
                    reserved:kube-apiserver
172.16.0.230/32     k8s:app=netpod                                                               custom-resource
                    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
172.16.0.236/32     reserved:health
172.16.1.78/32      k8s:app.kubernetes.io/name=hubble-relay                                      custom-resource
                    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
172.16.1.79/32      k8s:app.kubernetes.io/name=hubble-ui                                         custom-resource
                    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
172.16.1.111/32     k8s:app=webpod                                                               custom-resource
                    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
172.16.1.159/32     reserved:health
172.16.1.198/32     reserved:remote-node
172.16.1.210/32     k8s:io.cilium.k8s.namespace.labels.kubernetes.io/metadata.name=kube-system   custom-resource
                    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
172.16.1.221/32     k8s:io.cilium.k8s.namespace.labels.kubernetes.io/metadata.name=kube-system   custom-resource
                    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
172.16.2.73/32      reserved:health
172.16.2.116/32     reserved:remote-node
172.16.2.180/32     k8s:app=webpod                                                               custom-resource
                    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
192.168.10.10/32    reserved:host
                    reserved:kube-apiserver
192.168.10.101/32   reserved:remote-node
192.168.10.102/32   reserved:remote-node

🧿  Kubernetes 클러스터 내에서 특정 파드의 IP 주소를 가져오고, 각 파드에 대한 간편한 명령어 실행을 위한 별칭을 설정

  • NETPODIP: netpod라는 이름을 가진 파드의 IP 주소를 변수에 저장합니다.
  • WEBPOD1IP: webpod1 파드의 IP 주소를 변수에 저장합니다.
  • WEBPOD2IP: webpod2 파드의 IP 주소를 변수에 저장합니다.
  • p0: netpod 파드에 대한 명령을 실행하기 위한 별칭입니다. 사용자가 p0 <command> 형식으로 입력하면 kubectl exec -it netpod -- <command>가 실행됩니다.
  • p1: webpod1 파드에 대한 명령을 실행하기 위한 별칭입니다.
  • p2: webpod2 파드에 대한 명령을 실행하기 위한 별칭입니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# NETPODIP=$(kubectl get pods netpod -o jsonpath='{.status.podIP}')
WEBPOD1IP=$(kubectl get pods webpod1 -o jsonpath='{.status.podIP}')
WEBPOD2IP=$(kubectl get pods webpod2 -o jsonpath='{.status.podIP}')

(⎈|CiliumLab:N/A) root@k8s-s:~# alias p0="kubectl exec -it netpod  -- "
alias p1="kubectl exec -it webpod1 -- "
alias p2="kubectl exec -it webpod2 -- "

🧿 netpod  Kubernetes 파드 안에서 네트워크 인터페이스의 IP 주소와 라우팅 테이블을 확인

(⎈|CiliumLab:N/A) root@k8s-s:~# p0 ip -c -4 addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
9: eth0@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc noqueue state UP group default qlen 1000 link-netnsid 0
    inet 172.16.0.230/32 scope global eth0
       valid_lft forever preferred_lft forever
       
(⎈|CiliumLab:N/A) root@k8s-s:~# p0 route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.16.0.12     0.0.0.0         UG    0      0        0 eth0
172.16.0.12     0.0.0.0         255.255.255.255 UH    0      0        0 eth0

🧿 netpod 파드에서 webpod1 webpod2 파드로 각각 1회씩 Ping 테스트를 수행

(⎈|CiliumLab:N/A) root@k8s-s:~# p0 ping -c 1 $WEBPOD1IP && p0 ping -c 1 $WEBPOD2IP
PING 172.16.1.111 (172.16.1.111) 56(84) bytes of data.
64 bytes from 172.16.1.111: icmp_seq=1 ttl=62 time=0.214 ms

--- 172.16.1.111 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.214/0.214/0.214/0.000 ms
PING 172.16.2.180 (172.16.2.180) 56(84) bytes of data.
64 bytes from 172.16.2.180: icmp_seq=1 ttl=62 time=0.416 ms

--- 172.16.2.180 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.416/0.416/0.416/0.000 ms


🧿 netpod 파드에서 webpod1 webpod2 파드에 대해 HTTP 요청 (80)

(⎈|CiliumLab:N/A) root@k8s-s:~# p0 curl -s $WEBPOD1IP && p0 curl -s $WEBPOD2IP
Hostname: webpod1
IP: 127.0.0.1
IP: ::1
IP: 172.16.1.111
IP: fe80::c8ae:93ff:feb3:dd53
RemoteAddr: 172.16.0.230:41320
GET / HTTP/1.1
Host: 172.16.1.111
User-Agent: curl/8.7.1
Accept: */*

Hostname: webpod2
IP: 127.0.0.1
IP: ::1
IP: 172.16.2.180
IP: fe80::a8bb:feff:fe60:8ad5
RemoteAddr: 172.16.0.230:60650
GET / HTTP/1.1
Host: 172.16.2.180
User-Agent: curl/8.7.1
Accept: */*


🧿 netpod 파드에서 webpod1 webpod2 파드에 대해 HTTP 요청 (8080)

  •  exit code 7 는 "Failed to connect to the host"라는 오류를 의미합니다. 이는 curl이 요청을 보낼 대상(host)과 연결할 수 없다는 것을 뜻합니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# p0 curl -s $WEBPOD1IP:8080 ; p0 curl -s $WEBPOD2IP:8080
command terminated with exit code 7
command terminated with exit code 7


🧿 netpod 포드에서 외부 DNS 서버와의 연결을 확인하고, 서울의 날씨를 출력

(⎈|CiliumLab:N/A) root@k8s-s:~# p0 ping -c 1 8.8.8.8 && p0 curl -s wttr.in/seoul
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=47 time=33.3 ms

--- 8.8.8.8 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 33.349/33.349/33.349/0.000 ms
Weather report: seoul

     \  /       Partly cloudy
   _ /"".-.     19 °C
     \_(   ).   ← 5 km/h
     /(___(__)  10 km
                0.0 mm
...


🧿 netpod 네트워크 트래픽 로그

소스 포드 소스 포드 ID 목적지 포드 목적지 포드 ID 포워드 방향 프로토콜 TCP 플래그
default/netpod 39126 default/webpod2 25054 to-endpoint ICMPv4 EchoRequest
default/webpod2 25054 default/netpod 39126 to-network ICMPv4 EchoReply
default/netpod:60650 39126 default/webpod2:80 25054 to-endpoint TCP SYN
default/webpod2:80 25054 default/netpod:60650 39126 to-network TCP SYN, ACK
default/netpod:60650 39126 default/webpod2:80 25054 to-endpoint TCP ACK
default/netpod:60650 39126 default/webpod2:80 25054 to-endpoint TCP ACK, PSH
default/netpod:60650 39126 default/webpod2 25054 pre-xlate-rev TCP -
default/netpod:60650 39126 default/webpod2 25054 pre-xlate-rev TCP -
default/netpod:60650 39126 default/webpod2 25054 pre-xlate-rev TCP -
default/netpod:60650 39126 default/webpod2 25054 pre-xlate-rev TCP -
default/netpod:60650 39126 default/webpod2:80 25054 to-network TCP ACK, PSH
default/netpod:60650 39126 default/webpod2:80 25054 to-endpoint TCP ACK, FIN
default/webpod2:80 25054 default/netpod:60650 39126 to-network TCP ACK, FIN
default/netpod:60650 39126 default/webpod2:80 25054 to-endpoint TCP ACK
default/netpod:47608 39126 default/webpod2:8080 25054 to-endpoint TCP SYN
default/webpod2:8080 25054 default/netpod:47608 39126 to-network TCP ACK, RST
default/netpod:44939 39126 kube-system/coredns-55cb58b774-2xvk2:53 39166 to-endpoint UDP -
default/netpod:44939 39126 kube-system/coredns-55cb58b774-2xvk2 39166 pre-xlate-rev UDP -
default/netpod:44939 39126 kube-system/coredns-55cb58b774-2xvk2 39166 pre-xlate-rev UDP -
default/netpod:44939 39126 kube-system/coredns-55cb58b774-2xvk2 39166 pre-xlate-rev UDP -
kube-system/coredns-55cb58b774-2xvk2:53 39166 default/netpod 39126 pre-xlate-rev UDP -
kube-system/kube-dns:53 world default/netpod 39126 post-xlate-rev UDP -
kube-system/coredns-55cb58b774-2xvk2:53 39166 default/netpod 39126 pre-xlate-rev UDP -
kube-system/kube-dns:53 world default/netpod 39126 post-xlate-rev UDP -
default/netpod:44939 39126 kube-system/coredns-55cb58b774-2xvk2 39166 pre-xlate-rev UDP -
default/netpod:44939 39126 kube-system/coredns-55cb58b774-2xvk2 39166 pre-xlate-rev UDP -
kube-system/coredns-55cb58b774-2xvk2:53 39166 default/netpod 39126 pre-xlate-rev UDP -
kube-system/kube-dns:53 world default/netpod 39126 post-xlate-rev UDP -
kube-system/coredns-55cb58b774-2xvk2:53 39166 default/netpod 39126 pre-xlate-rev UDP -
kube-system/kube-dns:53 world default/netpod 39126 post-xlate-rev UDP -
default/netpod:40294 39126 5.9.243.187:80 world to-network TCP SYN
default/netpod:40294 39126 5.9.243.187:80 world to-endpoint TCP SYN, ACK
default/netpod:40294 39126 5.9.243.187:80 world to-network TCP ACK
default/netpod:40294 39126 5.9.243.187:80 world to-network TCP ACK, PSH
default/netpod:40294 39126 5.9.243.187:80 world to-endpoint TCP ACK, PSH
default/netpod:40294 39126 5.9.243.187:80 world to-network TCP ACK, FIN
default/netpod:40294 39126 5.9.243.187:80 world to-endpoint TCP ACK, FIN
(⎈|CiliumLab:N/A) root@k8s-s:~# hubble observe --pod netpod
Oct 21 11:10:08.177: default/netpod (ID:39126) -> default/webpod2 (ID:25054) to-endpoint FORWARDED (ICMPv4 EchoRequest)
Oct 21 11:10:08.177: default/netpod (ID:39126) <- default/webpod2 (ID:25054) to-network FORWARDED (ICMPv4 EchoReply)
Oct 21 11:12:11.151: default/netpod:60650 (ID:39126) -> default/webpod2:80 (ID:25054) to-endpoint FORWARDED (TCP Flags: SYN)
Oct 21 11:12:11.151: default/netpod:60650 (ID:39126) <- default/webpod2:80 (ID:25054) to-network FORWARDED (TCP Flags: SYN, ACK)
Oct 21 11:12:11.151: default/netpod:60650 (ID:39126) -> default/webpod2:80 (ID:25054) to-endpoint FORWARDED (TCP Flags: ACK)
Oct 21 11:12:11.151: default/netpod:60650 (ID:39126) -> default/webpod2:80 (ID:25054) to-endpoint FORWARDED (TCP Flags: ACK, PSH)
Oct 21 11:12:11.151: default/netpod:60650 (ID:39126) <> default/webpod2 (ID:25054) pre-xlate-rev TRACED (TCP)
Oct 21 11:12:11.151: default/netpod:60650 (ID:39126) <> default/webpod2 (ID:25054) pre-xlate-rev TRACED (TCP)
Oct 21 11:12:11.151: default/netpod:60650 (ID:39126) <> default/webpod2 (ID:25054) pre-xlate-rev TRACED (TCP)
Oct 21 11:12:11.152: default/netpod:60650 (ID:39126) <> default/webpod2 (ID:25054) pre-xlate-rev TRACED (TCP)
Oct 21 11:12:11.152: default/netpod:60650 (ID:39126) <> default/webpod2 (ID:25054) pre-xlate-rev TRACED (TCP)
Oct 21 11:12:11.152: default/netpod:60650 (ID:39126) <- default/webpod2:80 (ID:25054) to-network FORWARDED (TCP Flags: ACK, PSH)
Oct 21 11:12:11.153: default/netpod:60650 (ID:39126) -> default/webpod2:80 (ID:25054) to-endpoint FORWARDED (TCP Flags: ACK, FIN)
Oct 21 11:12:11.153: default/netpod:60650 (ID:39126) <- default/webpod2:80 (ID:25054) to-network FORWARDED (TCP Flags: ACK, FIN)
Oct 21 11:12:11.153: default/netpod:60650 (ID:39126) -> default/webpod2:80 (ID:25054) to-endpoint FORWARDED (TCP Flags: ACK)
Oct 21 11:13:07.020: default/netpod:47608 (ID:39126) -> default/webpod2:8080 (ID:25054) to-endpoint FORWARDED (TCP Flags: SYN)
Oct 21 11:13:07.020: default/netpod:47608 (ID:39126) <- default/webpod2:8080 (ID:25054) to-network FORWARDED (TCP Flags: ACK, RST)
Oct 21 11:14:01.004: default/netpod:44939 (ID:39126) -> kube-system/coredns-55cb58b774-2xvk2:53 (ID:39166) to-endpoint FORWARDED (UDP)
Oct 21 11:14:01.004: default/netpod:44939 (ID:39126) <> kube-system/coredns-55cb58b774-2xvk2 (ID:39166) pre-xlate-rev TRACED (UDP)
Oct 21 11:14:01.004: default/netpod:44939 (ID:39126) <> kube-system/coredns-55cb58b774-2xvk2 (ID:39166) pre-xlate-rev TRACED (UDP)
Oct 21 11:14:01.004: default/netpod:44939 (ID:39126) <- kube-system/coredns-55cb58b774-2xvk2:53 (ID:39166) to-network FORWARDED (UDP)
Oct 21 11:14:01.005: default/netpod:44939 (ID:39126) <> kube-system/coredns-55cb58b774-2xvk2 (ID:39166) pre-xlate-rev TRACED (UDP)
Oct 21 11:14:01.005: default/netpod:44939 (ID:39126) <> kube-system/coredns-55cb58b774-2xvk2 (ID:39166) pre-xlate-rev TRACED (UDP)
Oct 21 11:14:01.005: default/netpod:44939 (ID:39126) <> kube-system/coredns-55cb58b774-2xvk2 (ID:39166) pre-xlate-rev TRACED (UDP)
Oct 21 11:14:01.005: default/netpod:44939 (ID:39126) <> kube-system/coredns-55cb58b774-2xvk2 (ID:39166) pre-xlate-rev TRACED (UDP)
Oct 21 11:14:01.006: kube-system/coredns-55cb58b774-2xvk2:53 (ID:39166) <> default/netpod (ID:39126) pre-xlate-rev TRACED (UDP)
Oct 21 11:14:01.006: kube-system/kube-dns:53 (world) <> default/netpod (ID:39126) post-xlate-rev TRANSLATED (UDP)
Oct 21 11:14:01.006: kube-system/coredns-55cb58b774-2xvk2:53 (ID:39166) <> default/netpod (ID:39126) pre-xlate-rev TRACED (UDP)
Oct 21 11:14:01.006: kube-system/kube-dns:53 (world) <> default/netpod (ID:39126) post-xlate-rev TRANSLATED (UDP)
Oct 21 11:14:01.006: default/netpod:44939 (ID:39126) <> kube-system/coredns-55cb58b774-2xvk2 (ID:39166) pre-xlate-rev TRACED (UDP)
Oct 21 11:14:01.006: default/netpod:44939 (ID:39126) <> kube-system/coredns-55cb58b774-2xvk2 (ID:39166) pre-xlate-rev TRACED (UDP)
Oct 21 11:14:01.007: kube-system/coredns-55cb58b774-2xvk2:53 (ID:39166) <> default/netpod (ID:39126) pre-xlate-rev TRACED (UDP)
Oct 21 11:14:01.007: kube-system/kube-dns:53 (world) <> default/netpod (ID:39126) post-xlate-rev TRANSLATED (UDP)
Oct 21 11:14:01.007: kube-system/coredns-55cb58b774-2xvk2:53 (ID:39166) <> default/netpod (ID:39126) pre-xlate-rev TRACED (UDP)
Oct 21 11:14:01.007: kube-system/kube-dns:53 (world) <> default/netpod (ID:39126) post-xlate-rev TRANSLATED (UDP)
Oct 21 11:14:01.008: default/netpod:44939 (ID:39126) <> kube-system/coredns-55cb58b774-2xvk2 (ID:39166) pre-xlate-rev TRACED (UDP)
Oct 21 11:14:01.008: default/netpod:44939 (ID:39126) <> kube-system/coredns-55cb58b774-2xvk2 (ID:39166) pre-xlate-rev TRACED (UDP)
Oct 21 11:14:01.266: kube-system/coredns-55cb58b774-2xvk2:53 (ID:39166) <> default/netpod (ID:39126) pre-xlate-rev TRACED (UDP)
Oct 21 11:14:01.266: kube-system/kube-dns:53 (world) <> default/netpod (ID:39126) post-xlate-rev TRANSLATED (UDP)
Oct 21 11:14:01.315: kube-system/coredns-55cb58b774-2xvk2:53 (ID:39166) <> default/netpod (ID:39126) pre-xlate-rev TRACED (UDP)
Oct 21 11:14:01.315: kube-system/kube-dns:53 (world) <> default/netpod (ID:39126) post-xlate-rev TRANSLATED (UDP)
Oct 21 11:14:01.315: default/netpod:40294 (ID:39126) -> 5.9.243.187:80 (world) to-network FORWARDED (TCP Flags: SYN)
Oct 21 11:14:01.609: default/netpod:40294 (ID:39126) <- 5.9.243.187:80 (world) to-endpoint FORWARDED (TCP Flags: SYN, ACK)
Oct 21 11:14:01.609: default/netpod:40294 (ID:39126) -> 5.9.243.187:80 (world) to-network FORWARDED (TCP Flags: ACK)
Oct 21 11:14:01.609: default/netpod:40294 (ID:39126) -> 5.9.243.187:80 (world) to-network FORWARDED (TCP Flags: ACK, PSH)
Oct 21 11:14:02.764: default/netpod:40294 (ID:39126) <- 5.9.243.187:80 (world) to-endpoint FORWARDED (TCP Flags: ACK, PSH)
Oct 21 11:14:02.765: default/netpod:40294 (ID:39126) -> 5.9.243.187:80 (world) to-network FORWARDED (TCP Flags: ACK, FIN)
Oct 21 11:14:03.058: default/netpod:40294 (ID:39126) <- 5.9.243.187:80 (world) to-endpoint FORWARDED (TCP Flags: ACK, FIN)
Oct 21 11:14:03.058: default/netpod:40294 (ID:39126) -> 5.9.243.187:80 (world) to-network FORWARDED (TCP Flags: ACK)

🧿 netpod webpod1 간의 네트워크 트래픽 로그

default/netpod 39126 default/webpod1 25054 -> ICMPv4 EchoRequest
default/netpod 39126 default/webpod1 25054 <- ICMPv4 EchoReply
default/netpod:41320 39126 default/webpod1:80 25054 -> TCP SYN
default/webpod1:80 25054 default/netpod:41320 39126 <- TCP SYN, ACK
default/netpod:41320 39126 default/webpod1:80 25054 -> TCP ACK
default/netpod:41320 39126 default/webpod1:80 25054 -> TCP ACK, PSH
default/webpod1:80 25054 default/netpod:41320 39126 <- TCP ACK, PSH
default/netpod:41320 39126 default/webpod1:80 25054 -> TCP ACK, FIN
default/webpod1:80 25054 default/netpod:41320 39126 <- TCP ACK, FIN
default/netpod:38492 39126 default/webpod1:8080 25054 -> TCP SYN
default/webpod1:8080 25054 default/netpod:38492 39126 <- TCP ACK, RST
(⎈|CiliumLab:N/A) root@k8s-s:~# hubble observe --pod webpod1
Oct 21 11:10:08.023: default/netpod (ID:39126) -> default/webpod1 (ID:25054) to-network FORWARDED (ICMPv4 EchoRequest)
Oct 21 11:10:08.023: default/netpod (ID:39126) <- default/webpod1 (ID:25054) to-endpoint FORWARDED (ICMPv4 EchoReply)
Oct 21 11:12:10.998: default/netpod:41320 (ID:39126) -> default/webpod1:80 (ID:25054) to-network FORWARDED (TCP Flags: SYN)
Oct 21 11:12:10.998: default/netpod:41320 (ID:39126) <- default/webpod1:80 (ID:25054) to-endpoint FORWARDED (TCP Flags: SYN, ACK)
Oct 21 11:12:10.999: default/netpod:41320 (ID:39126) -> default/webpod1:80 (ID:25054) to-network FORWARDED (TCP Flags: ACK)
Oct 21 11:12:10.999: default/netpod:41320 (ID:39126) -> default/webpod1:80 (ID:25054) to-network FORWARDED (TCP Flags: ACK, PSH)
Oct 21 11:12:11.000: default/netpod:41320 (ID:39126) <- default/webpod1:80 (ID:25054) to-endpoint FORWARDED (TCP Flags: ACK, PSH)
Oct 21 11:12:11.001: default/netpod:41320 (ID:39126) -> default/webpod1:80 (ID:25054) to-network FORWARDED (TCP Flags: ACK, FIN)
Oct 21 11:12:11.001: default/netpod:41320 (ID:39126) <- default/webpod1:80 (ID:25054) to-endpoint FORWARDED (TCP Flags: ACK, FIN)
Oct 21 11:12:11.001: default/netpod:41320 (ID:39126) -> default/webpod1:80 (ID:25054) to-network FORWARDED (TCP Flags: ACK)
Oct 21 11:13:06.862: default/netpod:38492 (ID:39126) -> default/webpod1:8080 (ID:25054) to-network FORWARDED (TCP Flags: SYN)
Oct 21 11:13:06.862: default/netpod:38492 (ID:39126) <- default/webpod1:8080 (ID:25054) to-endpoint FORWARDED (TCP Flags: ACK, RST)

🧿 netpod webpod2 간의 네트워크 트래픽 로그

default/netpod 39126 default/webpod2 25054 -> ICMPv4 EchoRequest
default/netpod 39126 default/webpod2 25054 <- ICMPv4 EchoReply
default/netpod 39126 default/webpod2 25054 -> ICMPv4 EchoRequest
default/webpod2 25054 default/netpod 39126 <- ICMPv4 EchoReply
default/netpod:60650 39126 default/webpod2:80 25054 -> TCP SYN
default/netpod:60650 39126 default/webpod2:80 25054 -> TCP SYN
default/webpod2:80 25054 default/netpod:60650 39126 <- TCP SYN, ACK
default/netpod:60650 39126 default/webpod2:80 25054 -> TCP ACK
default/netpod:60650 39126 default/webpod2:80 25054 -> TCP ACK
default/netpod:60650 39126 default/webpod2:80 25054 -> TCP ACK, PSH
default/webpod2:80 25054 default/netpod:60650 39126 <- TCP ACK, PSH
default/netpod:60650 39126 default/webpod2:80 25054 -> TCP ACK, FIN
default/webpod2:80 25054 default/netpod:60650 39126 <- TCP ACK, FIN
default/netpod:60650 39126 default/webpod2:80 25054 -> TCP ACK
default/netpod:47608 39126 default/webpod2:8080 25054 -> TCP SYN
default/webpod2:8080 25054 default/netpod:47608 39126 <- TCP ACK, RST
default/netpod:47608 39126 default/webpod2:8080 25054 -> TCP SYN
default/webpod2:8080 25054 default/netpod:47608 39126 <- TCP ACK, RST
(⎈|CiliumLab:N/A) root@k8s-s:~# hubble observe --pod webpod2
Oct 21 11:10:08.176: default/netpod (ID:39126) -> default/webpod2 (ID:25054) to-network FORWARDED (ICMPv4 EchoRequest)
Oct 21 11:10:08.177: default/netpod (ID:39126) <- default/webpod2 (ID:25054) to-endpoint FORWARDED (ICMPv4 EchoReply)
Oct 21 11:10:08.177: default/netpod (ID:39126) -> default/webpod2 (ID:25054) to-endpoint FORWARDED (ICMPv4 EchoRequest)
Oct 21 11:10:08.177: default/netpod (ID:39126) <- default/webpod2 (ID:25054) to-network FORWARDED (ICMPv4 EchoReply)
Oct 21 11:12:11.150: default/netpod:60650 (ID:39126) -> default/webpod2:80 (ID:25054) to-network FORWARDED (TCP Flags: SYN)
Oct 21 11:12:11.151: default/netpod:60650 (ID:39126) -> default/webpod2:80 (ID:25054) to-endpoint FORWARDED (TCP Flags: SYN)
Oct 21 11:12:11.151: default/netpod:60650 (ID:39126) <- default/webpod2:80 (ID:25054) to-network FORWARDED (TCP Flags: SYN, ACK)
Oct 21 11:12:11.151: default/netpod:60650 (ID:39126) <- default/webpod2:80 (ID:25054) to-endpoint FORWARDED (TCP Flags: SYN, ACK)
Oct 21 11:12:11.151: default/netpod:60650 (ID:39126) -> default/webpod2:80 (ID:25054) to-network FORWARDED (TCP Flags: ACK)
Oct 21 11:12:11.151: default/netpod:60650 (ID:39126) -> default/webpod2:80 (ID:25054) to-endpoint FORWARDED (TCP Flags: ACK)
Oct 21 11:12:11.151: default/netpod:60650 (ID:39126) -> default/webpod2:80 (ID:25054) to-network FORWARDED (TCP Flags: ACK, PSH)
Oct 21 11:12:11.151: default/netpod:60650 (ID:39126) -> default/webpod2:80 (ID:25054) to-endpoint FORWARDED (TCP Flags: ACK, PSH)
Oct 21 11:12:11.151: default/netpod:60650 (ID:39126) <> default/webpod2 (ID:25054) pre-xlate-rev TRACED (TCP)
Oct 21 11:12:11.151: default/netpod:60650 (ID:39126) <> default/webpod2 (ID:25054) pre-xlate-rev TRACED (TCP)
Oct 21 11:12:11.151: default/netpod:60650 (ID:39126) <> default/webpod2 (ID:25054) pre-xlate-rev TRACED (TCP)
Oct 21 11:12:11.152: default/netpod:60650 (ID:39126) <> default/webpod2 (ID:25054) pre-xlate-rev TRACED (TCP)
Oct 21 11:12:11.152: default/netpod:60650 (ID:39126) <> default/webpod2 (ID:25054) pre-xlate-rev TRACED (TCP)
Oct 21 11:12:11.152: default/netpod:60650 (ID:39126) <- default/webpod2:80 (ID:25054) to-network FORWARDED (TCP Flags: ACK, PSH)
Oct 21 11:12:11.152: default/netpod:60650 (ID:39126) <- default/webpod2:80 (ID:25054) to-endpoint FORWARDED (TCP Flags: ACK, PSH)
Oct 21 11:12:11.153: default/netpod:60650 (ID:39126) -> default/webpod2:80 (ID:25054) to-network FORWARDED (TCP Flags: ACK, FIN)
Oct 21 11:12:11.153: default/netpod:60650 (ID:39126) -> default/webpod2:80 (ID:25054) to-endpoint FORWARDED (TCP Flags: ACK, FIN)
Oct 21 11:12:11.153: default/netpod:60650 (ID:39126) <- default/webpod2:80 (ID:25054) to-network FORWARDED (TCP Flags: ACK, FIN)
Oct 21 11:12:11.153: default/netpod:60650 (ID:39126) <- default/webpod2:80 (ID:25054) to-endpoint FORWARDED (TCP Flags: ACK, FIN)
Oct 21 11:12:11.153: default/netpod:60650 (ID:39126) -> default/webpod2:80 (ID:25054) to-network FORWARDED (TCP Flags: ACK)
Oct 21 11:12:11.153: default/netpod:60650 (ID:39126) -> default/webpod2:80 (ID:25054) to-endpoint FORWARDED (TCP Flags: ACK)
Oct 21 11:13:07.020: default/netpod:47608 (ID:39126) -> default/webpod2:8080 (ID:25054) to-network FORWARDED (TCP Flags: SYN)
Oct 21 11:13:07.020: default/netpod:47608 (ID:39126) <- default/webpod2:8080 (ID:25054) to-endpoint FORWARDED (TCP Flags: ACK, RST)
Oct 21 11:13:07.020: default/netpod:47608 (ID:39126) -> default/webpod2:8080 (ID:25054) to-endpoint FORWARDED (TCP Flags: SYN)
Oct 21 11:13:07.020: default/netpod:47608 (ID:39126) <- default/webpod2:8080 (ID:25054) to-network FORWARDED (TCP Flags: ACK, RST)

🧿 Cilium의 IP 캐시 조회

(⎈|CiliumLab:N/A) root@k8s-s:~# c0 map get cilium_ipcache
Key                 Value                                                                     State   Error
172.16.1.210/32     identity=39166 encryptkey=0 tunnelendpoint=192.168.10.101, flags=<none>   sync
0.0.0.0/0           identity=2 encryptkey=0 tunnelendpoint=0.0.0.0, flags=<none>              sync
172.16.2.116/32     identity=6 encryptkey=0 tunnelendpoint=192.168.10.102, flags=<none>       sync
172.16.2.73/32      identity=4 encryptkey=0 tunnelendpoint=192.168.10.102, flags=<none>       sync
172.16.1.198/32     identity=6 encryptkey=0 tunnelendpoint=192.168.10.101, flags=<none>       sync
172.16.1.221/32     identity=39166 encryptkey=0 tunnelendpoint=192.168.10.101, flags=<none>   sync
172.16.0.236/32     identity=4 encryptkey=0 tunnelendpoint=0.0.0.0, flags=<none>              sync
172.16.0.230/32     identity=39126 encryptkey=0 tunnelendpoint=0.0.0.0, flags=<none>          sync
172.16.1.111/32     identity=25054 encryptkey=0 tunnelendpoint=192.168.10.101, flags=<none>   sync
172.16.1.78/32      identity=44886 encryptkey=0 tunnelendpoint=192.168.10.101, flags=<none>   sync
172.16.1.79/32      identity=42840 encryptkey=0 tunnelendpoint=192.168.10.101, flags=<none>   sync
192.168.10.10/32    identity=1 encryptkey=0 tunnelendpoint=0.0.0.0, flags=<none>              sync
172.16.1.159/32     identity=4 encryptkey=0 tunnelendpoint=192.168.10.101, flags=<none>       sync
192.168.10.102/32   identity=6 encryptkey=0 tunnelendpoint=0.0.0.0, flags=<none>              sync
172.16.2.180/32     identity=25054 encryptkey=0 tunnelendpoint=192.168.10.102, flags=<none>   sync
192.168.10.101/32   identity=6 encryptkey=0 tunnelendpoint=0.0.0.0, flags=<none>              sync
172.16.0.12/32      identity=1 encryptkey=0 tunnelendpoint=0.0.0.0, flags=<none>              sync

🧿 cilium_ipcache에서 WEBPOD1IP에 해당하는 IP 주소에 대한 정보를 확인

  • 172.16.1.111/32:
    • 이 IP 주소는 identity=25054와 연결되어 있으며, tunnelendpoint는 192.168.10.101입니다.
    • 이 IP는 Cilium의 IP 캐시에 등록되어 있고, 상태는 sync입니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# c0 map get cilium_ipcache | grep $WEBPOD1IP
172.16.1.111/32     identity=25054 encryptkey=0 tunnelendpoint=192.168.10.101, flags=<none>   sync

🧿 특정 LXC 컨테이너의 네트워크 인터페이스 정보

  • 지정한 LXC 컨테이너의 네트워크 인터페이스 주소 정보를 표시합니다
10: lxc7408fc78b9ff@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc noqueue state UP group default qlen 1000
    link/ether 5e:b5:9a:19:fb:b3 brd ff:ff:ff:ff:ff:ff link-netns cni-35c57e23-01ba-0bc8-9858-769f1479059c
    inet6 fe80::5cb5:9aff:fe19:fbb3/64 scope link
       valid_lft forever preferred_lft forever
       
(⎈|CiliumLab:N/A) root@k8s-s:~# LXC=lxc7408fc78b9ff

(⎈|CiliumLab:N/A) root@k8s-s:~# ip -c addr show dev $LXC
10: lxc7408fc78b9ff@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc noqueue state UP group default qlen 1000
    link/ether 5e:b5:9a:19:fb:b3 brd ff:ff:ff:ff:ff:ff link-netns cni-35c57e23-01ba-0bc8-9858-769f1479059c
    inet6 fe80::5cb5:9aff:fe19:fbb3/64 scope link
       valid_lft forever preferred_lft forever

🧿  Cilium의 BPF 네트워크 상태 정보

  • xdp:
    • XDP (eXpress Data Path)는 고성능 패킷 처리 기술로, 이 항목 아래에 정보가 없다는 것은 현재 XDP 프로그램이 활성화되어 있지 않음을 나타냅니다.
  • tc:
    • Linux의 트래픽 제어(traffic control) 기능을 나타내며, 다양한 네트워크 인터페이스에 연결된 BPF 프로그램과 관련된 정보가 나열됩니다.
      인터페이스
      방향 BPF 프로그램 프로그램 ID
      ens5(2) ingress cil_from_netdev 1284
      ens5(2) egress cil_to_netdev 1290
      cilium_net(3) ingress cil_to_host 1278
      cilium_host(4) ingress cil_to_host 1260
      cilium_host(4) egress cil_from_host 1266
      lxc_health(8) ingress cil_from_container 1302
      lxc_health(8) egress cil_to_container 1303
      lxc7408fc78b9ff(10) ingress cil_from_container 1312
      lxc7408fc78b9ff(10) egress cil_to_container 1311
  • ens5: 물리적 네트워크 인터페이스.
  • cilium_net: Cilium 네트워크 인터페이스.
  • lxc_health: 컨테이너의 상태 확인을 위한 인터페이스.
  • lxc7408fc78b9ff: 특정 LXC 컨테이너의 네트워크 인터페이스

 

  • flow_dissector:
    • flow dissector는 BPF 프로그램에서 패킷 흐름을 분석하는 데 사용됩니다. 현재 이 항목 아래에 정보가 없다는 것은 특정한 흐름 디섹터가 활성화되어 있지 않음을 의미합니다.
  • netfilter:
    • netfilter는 Linux 커널의 패킷 필터링 시스템으로, Cilium에서 사용하는 netfilter 관련 정보가 나열됩니다. 현재 이 항목 아래에도 정보가 없다는 것은 활성화된 netfilter 규칙이 없음을 나타냅니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# c0bpf net show
xdp:

tc:
ens5(2) tcx/ingress cil_from_netdev prog_id 1284 link_id 16
ens5(2) tcx/egress cil_to_netdev prog_id 1290 link_id 17
cilium_net(3) tcx/ingress cil_to_host prog_id 1278 link_id 15
cilium_host(4) tcx/ingress cil_to_host prog_id 1260 link_id 13
cilium_host(4) tcx/egress cil_from_host prog_id 1266 link_id 14
lxc_health(8) tcx/ingress cil_from_container prog_id 1302 link_id 21
lxc_health(8) tcx/egress cil_to_container prog_id 1303 link_id 22
lxc7408fc78b9ff(10) tcx/ingress cil_from_container prog_id 1312 link_id 23
lxc7408fc78b9ff(10) tcx/egress cil_to_container prog_id 1311 link_id 24

flow_dissector:

netfilter:

🧿 특정 LXC 컨테이너(lxc7408fc78b9ff)에 대한 BPF 정보

lxc7408fc78b9ff(10) 이 항목은 lxc7408fc78b9ff라는 LXC 컨테이너의 네트워크 인터페이스를 나타냅니다. (10)은 이 인터페이스의 ID입니다.
tcx/ingress ingress는 들어오는 패킷을 처리하는 트래픽 클래스(tcx)를 나타냅니다. 이 경우, LXC 컨테이너에서 호스트로 들어오는 패킷을 처리하는 BPF 프로그램이 실행됩니다.
cil_from_container 이 BPF 프로그램의 이름입니다. cil_from_container는 컨테이너에서 호스트로 패킷을 전송하는 역할을 합니다.
prog_id 1312 이 BPF 프로그램의 고유 ID입니다. 1312는 특정 프로그램을 식별하는 데 사용됩니다.
link_id 23 이 BPF 프로그램이 연결된 링크의 ID입니다. 23은 해당 링크를 식별하는 데 사용됩니다.
lxc7408fc78b9ff(10) 동일한 LXC 컨테이너의 네트워크 인터페이스로, (10)은 이 인터페이스의 ID입니다.
tcx/egress egress는 나가는 패킷을 처리하는 트래픽 클래스(tcx)를 나타냅니다. 이 경우, 호스트에서 LXC 컨테이너로 나가는 패킷을 처리하는 BPF 프로그램이 실행됩니다.
cil_to_container 이 BPF 프로그램의 이름입니다. cil_to_container는 호스트에서 컨테이너로 패킷을 전송하는 역할을 합니다.
prog_id 1311 이 BPF 프로그램의 고유 ID입니다. 1311은 특정 프로그램을 식별하는 데 사용됩니다.
link_id 24 이 BPF 프로그램이 연결된 링크의 ID입니다. 24는 해당 링크를 식별하는 데 사용됩니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# c0bpf net show | grep $LXC
lxc7408fc78b9ff(10) tcx/ingress cil_from_container prog_id 1312 link_id 23
lxc7408fc78b9ff(10) tcx/egress cil_to_container prog_id 1311 link_id 24

🧿 특정 BPF 프로그램의 세부 정보

  • c0bpf prog show id 1312: BPF 프로그램 ID가 1312인 프로그램에 대한 정보를 요청합니다.
    • cil_from_container: 컨테이너에서 호스트로 들어오는 패킷을 처리합니다.
  • c0bpf prog show id 1311: BPF 프로그램 ID가 1311인 프로그램에 대한 정보를 요청합니다.
    • cil_to_container: 호스트에서 컨테이너로 나가는 패킷을 처리합니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# c0bpf prog show id 1312
1312: sched_cls  name cil_from_container  tag ebe634d5df387fad  gpl
        loaded_at 2024-10-21T11:06:22+0000  uid 0
        xlated 728B  jited 545B  memlock 4096B  map_ids 175,66
        btf_id 350
        
(⎈|CiliumLab:N/A) root@k8s-s:~# c0bpf prog show id 1311
1311: sched_cls  name cil_to_container  tag 8fea7246bd011141  gpl
        loaded_at 2024-10-21T11:06:22+0000  uid 0
        xlated 1712B  jited 1015B  memlock 4096B  map_ids 66,175
        btf_id 349

🧿 Cilium의 BPF 맵 정보

  • percpu_hash는 CPU마다 각각 해시 테이블을 사용하는 구조입니다. 이 방식은 여러 CPU에서 동시성을 높이고 성능을 개선합니다.
  • cilium_metrics는 Cilium 네트워크에서 수집한 메트릭 데이터(예: 트래픽 통계)를 저장하는 맵입니다.
  • prog_array는 프로그램 배열을 의미하며, 여러 BPF 프로그램을 저장하는 데 사용됩니다. 이 맵은 주로 BPF 프로그램의 순서를 관리하는 데 사용됩니다.
  • cilium_calls_00는 Cilium에서 호출되는 BPF 프로그램들을 관리하는 맵입니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# c0bpf map list
...
66: percpu_hash  name cilium_metrics  flags 0x1
        key 8B  value 16B  max_entries 1024  memlock 19384B
...
172: prog_array  name cilium_calls_00  flags 0x0
        key 4B  value 4B  max_entries 50  memlock 720B
        owner_prog_type sched_cls  owner jited
...
Comments