Ssoon

[8주차] Cilium CNI : 서비스 통신 확인 본문

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

[8주차] Cilium CNI : 서비스 통신 확인

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

Socket-based load-balancing

https://cilium.io/blog/2019/08/20/cilium-16/

    • 로드 밸런싱은 일반적으로 다음 중 하나의 방법으로 수행됩니다:
      • 애플리케이션이 클라이언트 측 로드 밸런싱을 수행하는 경우, 자신이 연결할 서버를 스스로 선택합니다.
        • 장점: 연결이 처음 설정될 때만 로드 밸런싱에 대한 비용이 발생하고, 이후 연결이 유지되는 동안에는 추가적인 작업이나 비용이 없습니다. 즉, 처음에만 서버를 선택하면 되고, 그 후에는 그 서버와 계속 통신하게 됩니다.
        • 단점: 이 방식은 애플리케이션이 어떤 서버를 선택했는지 알게 되므로, 사용자가 서버 선택에 대해 신경 쓰지 않아도 되지만, 애플리케이션 자체가 이 과정에 관여해야 한다는 점에서 불투명하다는 것입니다. 즉, 애플리케이션이 로드 밸런싱을 직접 처리해야 하므로 더 복잡해집니다.
      • 네트워크에서는 로드 밸런싱을 중간 장치(중간 박스)를 통해 수행하여 요청을 특정 서비스 IP로 변환합니다.
        • 장점: 이 방법의 가장 큰 장점은 애플리케이션이 이 과정에 전혀 관여하지 않는다는 것입니다. 즉, 애플리케이션이 어떤 서버에 연결되는지 신경 쓸 필요가 없고, 모든 로드 밸런싱 작업이 자동으로 처리됩니다.
        • 단점: 그러나 이 방법은 각 네트워크 패킷(데이터의 작은 조각)에 대해 요청과 응답 모두에서 IP 주소를 변경해야 하므로, 약간의 추가 작업이 필요합니다. 이는 패킷이 네트워크를 통해 전송될 때마다 주소를 바꿔야 한다는 뜻입니다.

Cilium 1.6에서는 두 가지 접근 방식의 장점을 결합한 소켓 기반 로드 밸런싱을 도입합니다:

  • Transparent:  로드 밸런싱은 애플리케이션에 100% 투명하게 유지됩니다. 서비스는 표준 쿠버네티스 서비스 정의를 사용하여 정의됩니다.
  • Highly efficient:  시스템 호출 내에서 주소를 변환하여 소켓 수준에서 부하 분산을 수행하면 연결을 설정할 때 부하 분산 비용을 미리 지불하고 이후 연결 기간 동안 추가 변환이 필요하지 않습니다. 성능은 애플리케이션이 백엔드와 직접 통신하는 것과 동일합니다.

🧿 서비스 생성

  • 쿠버네티스 클러스터 내에서 webpod 라벨을 가진 Pod들과 통신할 수 있는 클러스터 내부용 서비스(ClusterIP) 를 생성합니다.
  • 서비스는 80번 포트를 사용해 해당 Pod로 트래픽을 전달하게 됩니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Service
metadata:
  name: svc
spec:
  ports:
    - name: svc-webport
      port: 80
      targetPort: 80
  selector:
    app: webpod
  type: ClusterIP
EOF
service/svc created

🧿  서비스와  연결된 엔드포인트(Endpoints)를 확인

  • 서비스 svc는 클러스터 내부 IP 10.10.123.20에서 80번 포트를 사용하며, 라벨이 app: webpod인 Pod들과 연결됩니다.
  • 엔드포인트는 두 개의 Pod가 있고, 각각의 IP 주소가 172.16.1.111:80과 172.16.2.180:80입니다. 서비스가 이 두 Pod로 트래픽을 전달합니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# kubectl get svc,ep svc
NAME          TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
service/svc   ClusterIP   10.10.123.20   <none>        80/TCP    60s

NAME            ENDPOINTS                         AGE
endpoints/svc   172.16.1.111:80,172.16.2.180:80   60s

🧿 노드에 iptables 더이상 KUBE-SVC rule 이 생성되지 않는다!

  • Cilium의 iptables 규칙
    • mangle 체인: 패킷의 속성을 수정 (예: 마크 설정, TProxy 사용).
    • raw 체인: Pod 간의 트래픽 또는 프록시 트래픽을 연결 추적에서 제외하여 성능 최적화.
    • forward 체인: 클러스터 내부와 외부 간의 트래픽 전달을 허용.
    • nat 체인: 들어오거나 나가는 트래픽에 대해 주소 변환 (NAT)을 처리.
CILIUM_PRE_mangle 들어오는 트래픽을 수정하는 체인. 패킷 마크 설정, 트래픽 리다이렉션에 사용됨. -A CILIUM_PRE_mangle -p tcp -j TPROXY --on-port 35005 --on-ip 127.0.0.1 (TCP 트래픽을 TProxy를 통해 포트 35005로 리다이렉션)
CILIUM_POST_mangle 나가는 트래픽을 수정하는 체인. 트래픽의 출발지와 관련된 작업에 사용됨. -A POSTROUTING -m comment --comment "cilium-feeder: CILIUM_POST_mangle" -j CILIUM_POST_mangle
CILIUM_PRE_raw 들어오는 트래픽을 연결 추적에서 제외하기 위해 사용됨. 주로 Pod 간 트래픽에 대해 사용함. -A CILIUM_PRE_raw -d 192.168.0.0/16 -j CT --notrack (192.168.0.0/16 대역의 트래픽을 연결 추적에서 제외)
CILIUM_OUTPUT_raw 나가는 트래픽을 연결 추적에서 제외하기 위해 사용됨. Pod 간 및 프록시 트래픽에 주로 적용됨. -A CILIUM_OUTPUT_raw -s 192.168.0.0/16 -j CT --notrack (Pod 간 트래픽을 연결 추적에서 제외)
CILIUM_FORWARD 클러스터 내부와 외부 간에 전달되는 트래픽에 대한 허용 규칙 설정. Cilium을 사용하는 네트워크 인터페이스 간 트래픽을 허용함. -A CILIUM_FORWARD -o cilium_host -j ACCEPT (클러스터 내부에서 나가는 트래픽을 허용)
CILIUM_INPUT 들어오는 트래픽에 대한 규칙. 프록시 트래픽을 허용하기 위해 사용됨. -A CILIUM_INPUT -m comment --comment "cilium: ACCEPT for proxy traffic" -j ACCEPT (프록시 트래픽을 허용)
CILIUM_OUTPUT 나가는 트래픽에 대한 규칙. 주로 프록시를 통해 나가는 트래픽을 허용함. -A CILIUM_OUTPUT -m comment --comment "cilium: ACCEPT for proxy traffic" -j ACCEPT (프록시 트래픽을 허용)
CILIUM_PRE_nat 들어오는 트래픽에 대해 NAT(Network Address Translation)를 적용하는 체인. -A CILIUM_PRE_nat -m comment --comment "cilium-feeder: CILIUM_PRE_nat" -j CILIUM_PRE_nat
CILIUM_OUTPUT_nat 나가는 트래픽에 대해 NAT를 적용하는 체인. -A CILIUM_OUTPUT_nat -m comment --comment "cilium-feeder: CILIUM_OUTPUT_nat" -j CILIUM_OUTPUT_nat
CILIUM_POST_nat NAT 이후 트래픽 처리를 위한 체인. -A POSTROUTING -m comment --comment "cilium-feeder: CILIUM_POST_nat" -j CILIUM_POST_nat
(⎈|CiliumLab:N/A) root@k8s-s:~# iptables-save | grep KUBE-SVC

(⎈|CiliumLab:N/A) root@k8s-s:~# iptables-save | grep CILIUM
:CILIUM_POST_mangle - [0:0]
:CILIUM_PRE_mangle - [0:0]
-A PREROUTING -m comment --comment "cilium-feeder: CILIUM_PRE_mangle" -j CILIUM_PRE_mangle
-A POSTROUTING -m comment --comment "cilium-feeder: CILIUM_POST_mangle" -j CILIUM_POST_mangle
-A CILIUM_PRE_mangle ! -o lo -m socket --transparent -m comment --comment "cilium: any->pod redirect proxied traffic to host proxy" -j MARK --set-xmark 0x200/0xffffffff
-A CILIUM_PRE_mangle -p tcp -m comment --comment "cilium: TPROXY to host cilium-dns-egress proxy" -j TPROXY --on-port 35005 --on-ip 127.0.0.1 --tproxy-mark 0x200/0xffffffff
-A CILIUM_PRE_mangle -p udp -m comment --comment "cilium: TPROXY to host cilium-dns-egress proxy" -j TPROXY --on-port 35005 --on-ip 127.0.0.1 --tproxy-mark 0x200/0xffffffff
:CILIUM_OUTPUT_raw - [0:0]
:CILIUM_PRE_raw - [0:0]
-A PREROUTING -m comment --comment "cilium-feeder: CILIUM_PRE_raw" -j CILIUM_PRE_raw
-A OUTPUT -m comment --comment "cilium-feeder: CILIUM_OUTPUT_raw" -j CILIUM_OUTPUT_raw
-A CILIUM_OUTPUT_raw -d 192.168.0.0/16 -m comment --comment "cilium: NOTRACK for pod traffic" -j CT --notrack
-A CILIUM_OUTPUT_raw -s 192.168.0.0/16 -m comment --comment "cilium: NOTRACK for pod traffic" -j CT --notrack
-A CILIUM_OUTPUT_raw -o lxc+ -m comment --comment "cilium: NOTRACK for proxy return traffic" -j CT --notrack
-A CILIUM_OUTPUT_raw -o cilium_host -m comment --comment "cilium: NOTRACK for proxy return traffic" -j CT --notrack
-A CILIUM_OUTPUT_raw -o lxc+ -m comment --comment "cilium: NOTRACK for L7 proxy upstream traffic" -j CT --notrack
-A CILIUM_OUTPUT_raw -o cilium_host -m comment --comment "cilium: NOTRACK for L7 proxy upstream traffic" -j CT --notrack
-A CILIUM_PRE_raw -d 192.168.0.0/16 -m comment --comment "cilium: NOTRACK for pod traffic" -j CT --notrack
-A CILIUM_PRE_raw -s 192.168.0.0/16 -m comment --comment "cilium: NOTRACK for pod traffic" -j CT --notrack
-A CILIUM_PRE_raw -m comment --comment "cilium: NOTRACK for proxy traffic" -j CT --notrack
:CILIUM_FORWARD - [0:0]
:CILIUM_INPUT - [0:0]
:CILIUM_OUTPUT - [0:0]
-A INPUT -m comment --comment "cilium-feeder: CILIUM_INPUT" -j CILIUM_INPUT
-A FORWARD -m comment --comment "cilium-feeder: CILIUM_FORWARD" -j CILIUM_FORWARD
-A OUTPUT -m comment --comment "cilium-feeder: CILIUM_OUTPUT" -j CILIUM_OUTPUT
-A CILIUM_FORWARD -o cilium_host -m comment --comment "cilium: any->cluster on cilium_host forward accept" -j ACCEPT
-A CILIUM_FORWARD -i cilium_host -m comment --comment "cilium: cluster->any on cilium_host forward accept (nodeport)" -j ACCEPT
-A CILIUM_FORWARD -i lxc+ -m comment --comment "cilium: cluster->any on lxc+ forward accept" -j ACCEPT
-A CILIUM_FORWARD -i cilium_net -m comment --comment "cilium: cluster->any on cilium_net forward accept (nodeport)" -j ACCEPT
-A CILIUM_FORWARD -o lxc+ -m comment --comment "cilium: any->cluster on lxc+ forward accept" -j ACCEPT
-A CILIUM_FORWARD -i lxc+ -m comment --comment "cilium: cluster->any on lxc+ forward accept (nodeport)" -j ACCEPT
-A CILIUM_INPUT -m comment --comment "cilium: ACCEPT for proxy traffic" -j ACCEPT
-A CILIUM_OUTPUT -m comment --comment "cilium: ACCEPT for proxy traffic" -j ACCEPT
-A CILIUM_OUTPUT -m comment --comment "cilium: ACCEPT for l7 proxy upstream traffic" -j ACCEPT
-A CILIUM_OUTPUT -m comment --comment "cilium: host->any mark as from host" -j MARK --set-xmark 0xc00/0xf00
:CILIUM_OUTPUT_nat - [0:0]
:CILIUM_POST_nat - [0:0]
:CILIUM_PRE_nat - [0:0]
-A PREROUTING -m comment --comment "cilium-feeder: CILIUM_PRE_nat" -j CILIUM_PRE_nat
-A OUTPUT -m comment --comment "cilium-feeder: CILIUM_OUTPUT_nat" -j CILIUM_OUTPUT_nat
-A POSTROUTING -m comment --comment "cilium-feeder: CILIUM_POST_nat" -j CILIUM_POST_nat

🧿 무한 루프를 돌며 netpod  Pod에서 curl 명령어를 사용해 svc 서비스로 요청

(⎈|CiliumLab:N/A) root@k8s-s:~# SVCIP=$(kubectl get svc svc -o jsonpath='{.spec.clusterIP}')
(⎈|CiliumLab:N/A) root@k8s-s:~# while true; do kubectl exec netpod -- curl -s $SVCIP | grep Hostname;echo "-----";sleep 1;done
Hostname: webpod1
-----
Hostname: webpod2
-----
Hostname: webpod2
-----

🧿 tcpdump를 통해 모든 인터페이스(any)에서 발생하는 네트워크 트래픽을 실시간으로 캡처

172.16.0.230에서 172.16.1.111로 TCP 트래픽이 오가는 것을 보여줍니다. 주요 패턴은 다음과 같습니다:

  • TCP 요청: 172.16.0.230에서 172.16.1.111로 80번 포트(HTTP)로의 TCP 연결 요청이 발생.
  • TCP 응답: 172.16.1.111 서버가 이 요청에 응답하며, 패킷들이 오가고 있음.

예를 들어, 12:23:46.955045에 요청 패킷이 나가고, 이어서 12:23:46.955324에 응답 패킷이 들어오는 패턴이 보입니다. 이 과정에서 TCP 패킷이 계속해서 주고받으며, 실제로 HTTP 요청을 처리하고 있음을 알 수 있습니다.

파드 내부 캡쳐인데, SVC  IP는 보이지 않고, DNAT 된 web-pod 의 IP가 확인!

(⎈|CiliumLab:N/A) root@k8s-s:~# kubectl exec netpod -- tcpdump -enni any -q
tcpdump: data link type LINUX_SLL2
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes
12:23:46.955045 eth0  Out ifindex 9 92:ef:86:7b:d1:d4 172.16.0.230.57786 > 172.16.1.111.80: tcp 0
12:23:46.955324 eth0  In  ifindex 9 5e:b5:9a:19:fb:b3 172.16.1.111.80 > 172.16.0.230.57786: tcp 0
12:23:46.955377 eth0  Out ifindex 9 92:ef:86:7b:d1:d4 172.16.0.230.57786 > 172.16.1.111.80: tcp 0
12:23:46.955422 eth0  Out ifindex 9 92:ef:86:7b:d1:d4 172.16.0.230.57786 > 172.16.1.111.80: tcp 75
12:23:46.955537 eth0  In  ifindex 9 5e:b5:9a:19:fb:b3 172.16.1.111.80 > 172.16.0.230.57786: tcp 0
12:23:46.956088 eth0  In  ifindex 9 5e:b5:9a:19:fb:b3 172.16.1.111.80 > 172.16.0.230.57786: tcp 311
12:23:46.956115 eth0  Out ifindex 9 92:ef:86:7b:d1:d4 172.16.0.230.57786 > 172.16.1.111.80: tcp 0
12:23:46.956321 eth0  Out ifindex 9 92:ef:86:7b:d1:d4 172.16.0.230.57786 > 172.16.1.111.80: tcp 0
12:23:46.957669 eth0  In  ifindex 9 5e:b5:9a:19:fb:b3 172.16.1.111.80 > 172.16.0.230.57786: tcp 0
12:23:46.957700 eth0  Out ifindex 9 92:ef:86:7b:d1:d4 172.16.0.230.57786 > 172.16.1.111.80: tcp 0
...

🧿 ngrep 툴을 사용하여 네트워크 상의 TCP 80번 포트에서 오가는 HTTP 요청과 응답을 캡처

  • 클라이언트(172.16.0.230)는 GET / 요청을 보냈고, webpod2라는 Pod가 응답을 처리하여 상태 코드 200과 함께 호스트 정보를 반환했습니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# kubectl exec netpod -- sh -c "ngrep -tW byline -d eth0 '' 'tcp port 80'"
interface: eth0 (172.16.0.230/255.255.255.255)
filter: ( tcp port 80 ) and ((ip || ip6) || (vlan && (ip || ip6)))
####
T 2024/10/21 12:24:27.963906 172.16.0.230:45992 -> 172.16.2.180:80 [AP] #4
GET / HTTP/1.1.
Host: 10.10.123.20.
User-Agent: curl/8.7.1.
Accept: */*.
.

##
T 2024/10/21 12:24:27.964573 172.16.2.180:80 -> 172.16.0.230:45992 [AP] #6
HTTP/1.1 200 OK.
Date: Mon, 21 Oct 2024 12:24:27 GMT.
Content-Length: 193.
Content-Type: text/plain; charset=utf-8.
.
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:45992
GET / HTTP/1.1.
Host: 10.10.123.20.
User-Agent: curl/8.7.1.
Accept: */*.
.
...

🧿 Cilium에서 관리하는 Kubernetes 서비스 목록

  • Frontend (서비스 IP:포트): 클라이언트가 접근하는 서비스의 IP와 포트를 나타냅니다.
  • Service Type (서비스 유형): 서비스 유형을 나타내며, ClusterIP, NodePort 등의 종류가 있습니다.
    • ClusterIP: 클러스터 내부에서 서비스하는 IP로, 외부에서는 접근 불가.
    • NodePort: 클러스터 외부에서도 접근 가능한 IP와 포트를 할당.
  • Backend (백엔드 IP:포트): 요청을 처리하는 백엔드(실제 서버 또는 Pod)의 IP와 포트 정보입니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# c0 service list
ID   Frontend              Service Type   Backend
1    10.10.0.1:443         ClusterIP      1 => 192.168.10.10:6443 (active)
2    10.10.92.90:443       ClusterIP      1 => 192.168.10.10:4244 (active)
3    10.10.203.229:80      ClusterIP      1 => 172.16.1.78:4245 (active)
4    10.10.201.143:80      ClusterIP      1 => 172.16.1.79:8081 (active)
5    10.10.0.10:53         ClusterIP      1 => 172.16.1.221:53 (active)
                                          2 => 172.16.1.210:53 (active)
6    10.10.0.10:9153       ClusterIP      1 => 172.16.1.221:9153 (active)
                                          2 => 172.16.1.210:9153 (active)
7    192.168.10.10:31274   NodePort       1 => 172.16.1.79:8081 (active)
8    0.0.0.0:31274         NodePort       1 => 172.16.1.79:8081 (active)
9    10.10.123.20:80       ClusterIP      1 => 172.16.1.111:80 (active)
                                          2 => 172.16.2.180:80 (active)

🧿 Kubernetes 클러스터에서의 서비스와 백엔드 간의 로드 밸런싱 정보

  • SERVICE ADDRESS: 서비스의 IP 주소와 포트 번호입니다. 이 주소로 요청을 보내면 Kubernetes가 해당 서비스에 연결합니다.
  • BACKEND ADDRESS: 서비스가 요청을 전달하는 실제 백엔드 서버의 IP 주소와 포트 번호입니다. 즉, 서비스가 요청을 처리하기 위해 사용되는 서버입니다.
  • REVNAT_ID: 이 숫자는 역 NAT(Reverse Network Address Translation) ID로, 해당 백엔드 서버와 연결된 서비스의 고유 ID를 나타냅니다. 이는 요청이 어떻게 라우팅되는지를 추적하는 데 도움이 됩니다.
  • SLOT: 각 요청의 슬롯 번호를 나타내며, 로드 밸런서가 요청을 처리하기 위해 사용하는 슬롯의 식별자입니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# c0 bpf lb list
SERVICE ADDRESS           BACKEND ADDRESS (REVNAT_ID) (SLOT)
10.10.201.143:80 (1)      172.16.1.79:8081 (4) (1)
10.10.0.10:53 (1)         172.16.1.221:53 (5) (1)
10.10.123.20:80 (2)       172.16.2.180:80 (9) (2)
10.10.0.10:53 (2)         172.16.1.210:53 (5) (2)
192.168.10.10:31274 (1)   172.16.1.79:8081 (7) (1)
10.10.0.1:443 (1)         192.168.10.10:6443 (1) (1)
10.10.203.229:80 (0)      0.0.0.0:0 (3) (0) [ClusterIP, non-routable]
10.10.0.1:443 (0)         0.0.0.0:0 (1) (0) [ClusterIP, non-routable]
10.10.92.90:443 (0)       0.0.0.0:0 (2) (0) [ClusterIP, InternalLocal, non-routable]
0.0.0.0:31274 (0)         0.0.0.0:0 (8) (0) [NodePort, non-routable]
192.168.10.10:31274 (0)   0.0.0.0:0 (7) (0) [NodePort]
10.10.123.20:80 (0)       0.0.0.0:0 (9) (0) [ClusterIP, non-routable]
10.10.0.10:9153 (0)       0.0.0.0:0 (6) (0) [ClusterIP, non-routable]
10.10.123.20:80 (1)       172.16.1.111:80 (9) (1)
10.10.201.143:80 (0)      0.0.0.0:0 (4) (0) [ClusterIP, non-routable]
10.10.0.10:53 (0)         0.0.0.0:0 (5) (0) [ClusterIP, non-routable]
10.10.0.10:9153 (1)       172.16.1.221:9153 (6) (1)
10.10.0.10:9153 (2)       172.16.1.210:9153 (6) (2)
10.10.203.229:80 (1)      172.16.1.78:4245 (3) (1)
0.0.0.0:31274 (1)         172.16.1.79:8081 (8) (1)
10.10.92.90:443 (1)       192.168.10.10:4244 (2) (1)

🧿 Cilium에서 사용 중인 로드 밸런싱 관련 맵(Map)들의 목록

cilium_lb4_reverse_nat 역 NAT 맵: 외부 트래픽을 내부 백엔드로 매핑
cilium_lb4_affinity 어피니티 맵: 클라이언트 IP에 따라 특정 백엔드로 라우팅
cilium_lb4_source_range 소스 범위 맵: 허용된 소스 IP 주소 범위 정의
cilium_lb4_reverse_sk 역 소켓 키 맵: 소켓 정보 저장 및 세션 유지
cilium_lb4_backends_v3 백엔드 맵: 서비스와 연결된 백엔드 서버 정보 저장
cilium_lb4_services_v2 서비스 맵: 서비스 정보 및 메타데이터 저장
cilium_lb_affinity_match 어피니티 매치 맵: 클라이언트와 백엔드 간 연결 추적
cilium_skip_lb4 스킵 맵: 로드 밸런싱을 적용하지 않고 특정 트래픽 처리
(⎈|CiliumLab:N/A) root@k8s-s:~# c0 map list --verbose | grep lb
## Map: cilium_lb4_reverse_nat
## Map: cilium_lb4_affinity
## Map: cilium_lb4_source_range
## Map: cilium_lb4_reverse_sk
## Map: cilium_lb4_backends_v3
## Map: cilium_lb4_services_v2
## Map: cilium_lb_affinity_match
## Map: cilium_skip_lb4

🧿  Cilium의 cilium_lb4_services_v2 맵에서 서비스에 대한 상세 정보

Key 서비스의 IP 주소 및 포트 정보를 포함합니다. (0) 또는 (1)은 서비스의 REVNAT_ID를 나타냅니다.
Value 서비스와 관련된 내부 상태 값을 나타냅니다. 이 값은 보통 백엔드 서버의 수와 연결 상태를 의미합니다.
State 서비스의 동기화 상태를 나타냅니다. 보통 sync는 정상적으로 동기화되었음을 의미합니다.
Error 에러 상태를 나타내며, 에러가 없을 경우는 비어 있습니다. 이 값이 0이 아닌 경우는 문제가 발생했음을 시사합니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# c0 map get cilium_lb4_services_v2
Key                       Value                State   Error
10.10.92.90:443 (0)       0 1 (2) [0x0 0x10]   sync
10.10.203.229:80 (0)      0 1 (3) [0x0 0x0]    sync
10.10.0.10:9153 (2)       6 0 (6) [0x0 0x0]    sync
10.10.0.10:9153 (0)       0 2 (6) [0x0 0x0]    sync
10.10.0.10:53 (2)         5 0 (5) [0x0 0x0]    sync
0.0.0.0:31274 (1)         7 0 (8) [0x0 0x0]    sync
10.10.201.143:80 (0)      0 1 (4) [0x0 0x0]    sync
192.168.10.10:31274 (1)   7 0 (7) [0x0 0x0]    sync
10.10.123.20:80 (1)       11 0 (9) [0x0 0x0]   sync
0.0.0.0:31274 (0)         0 1 (8) [0x2 0x0]    sync
10.10.123.20:80 (2)       12 0 (9) [0x0 0x0]   sync
10.10.0.1:443 (1)         1 0 (1) [0x0 0x0]    sync
10.10.0.1:443 (0)         0 1 (1) [0x0 0x0]    sync
10.10.201.143:80 (1)      7 0 (4) [0x0 0x0]    sync
10.10.0.10:9153 (1)       3 0 (6) [0x0 0x0]    sync
10.10.0.10:53 (1)         4 0 (5) [0x0 0x0]    sync
10.10.0.10:53 (0)         0 2 (5) [0x0 0x0]    sync
10.10.92.90:443 (1)       9 0 (2) [0x0 0x0]    sync
10.10.203.229:80 (1)      10 0 (3) [0x0 0x0]   sync
192.168.10.10:31274 (0)   0 1 (7) [0x42 0x0]   sync
10.10.123.20:80 (0)       0 2 (9) [0x0 0x0]    sync

🧿 Cilium의 cilium_lb4_backends_v3 맵에서 로드 밸런싱에 사용되는 백엔드 서버들의 정보

Key 백엔드 서버의 고유 식별자입니다. 숫자로 표시되며, 백엔드 서버를 참조하는 데 사용됩니다.
Value 백엔드 서버의 주소를 포함합니다. ANY:// 접두사는 해당 주소가 여러 프로토콜(예: TCP, UDP)에서 사용될 수 있음을 의미합니다.
State 서버의 동기화 상태를 나타내며, 보통 sync는 정상적으로 동기화되었음을 의미합니다.
Error 에러 상태를 나타내며, 에러가 없을 경우는 비어 있습니다. 이 값이 0이 아닌 경우는 문제가 발생했음을 시사합니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# c0 map get cilium_lb4_backends_v3
Key   Value                 State   Error
9     ANY://192.168.10.10   sync
10    ANY://172.16.1.78     sync
11    ANY://172.16.1.111    sync
12    ANY://172.16.2.180    sync

🧿  Cilium의 cilium_lb4_reverse_nat 맵에서 로드 밸런싱에 관련된 역 NAT(Reverse NAT) 설정

Key 역 NAT 엔트리의 고유 식별자입니다. 숫자로 표시되며, NAT 매핑을 참조하는 데 사용됩니다.
Value 클러스터 내부 서비스의 주소와 포트를 나타냅니다. 이 값은 외부에서 접근하는 주소로 변환됩니다.
State NAT 엔트리의 동기화 상태를 나타내며, 보통 sync는 정상적으로 동기화되었음을 의미합니다.
Error 에러 상태를 나타내며, 에러가 없을 경우는 비어 있습니다. 이 값이 0이 아닌 경우는 문제가 발생했음을 시사합니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# c0 map get cilium_lb4_reverse_nat
Key   Value                 State   Error
1     10.10.0.1:443         sync
2     10.10.92.90:443       sync
6     10.10.0.10:9153       sync
5     10.10.0.10:53         sync
7     192.168.10.10:31274   sync
9     10.10.123.20:80       sync
3     10.10.203.229:80      sync
4     10.10.201.143:80      sync
8     0.0.0.0:31274         sync

🧿 Cilium의 cilium_lb4_reverse_sk 맵에서 역 소켓 키(Reverse Socket Key)에 대한 정보

  •  Cilium 로드 밸런서에서 요청을 특정 백엔드 서비스와 연결하는 데 사용되는 소켓 정보를 포함
Key 요청이 도착하는 외부 주소와 포트를 나타냅니다. 이 형식은 [IP]:[포트], [다른 포트]로 구성되어 있습니다.
Value 요청이 연결되는 내부 서비스의 주소와 포트를 나타냅니다. 이 형식도 [IP]:[포트], [다른 포트]로 구성되어 있습니다.
State 이 정보는 출력되지 않았지만, 일반적으로 sync 상태를 가질 수 있습니다.
Error 이 정보도 출력되지 않았지만, 에러가 발생할 경우 이 열에 표시됩니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# c0 map get cilium_lb4_reverse_sk
Key                           Value                        State   Error
[172.16.2.180]:20480, 31485   [10.10.123.20]:20480, 2304
[172.16.2.180]:20480, 31814   [10.10.123.20]:20480, 2304
[172.16.1.111]:20480, 31536   [10.10.123.20]:20480, 2304
[172.16.1.111]:20480, 31795   [10.10.123.20]:20480, 2304
[172.16.2.180]:20480, 30973   [10.10.123.20]:20480, 2304
[172.16.1.111]:20480, 27213   [10.10.123.20]:20480, 2304
[172.16.2.180]:20480, 18806   [10.10.123.20]:20480, 2304
[172.16.2.180]:20480, 23418   [10.10.123.20]:20480, 2304
[172.16.1.111]:20480, 31683   [10.10.123.20]:20480, 2304
[172.16.1.111]:20480, 27238   [10.10.123.20]:20480, 2304
[172.16.1.111]:20480, 19033   [10.10.123.20]:20480, 2304
[172.16.1.111]:20480, 31526   [10.10.123.20]:20480, 2304
[172.16.1.111]:20480, 27123   [10.10.123.20]:20480, 2304
[172.16.2.180]:20480, 23185   [10.10.123.20]:20480, 2304
[172.16.1.111]:20480, 27270   [10.10.123.20]:20480, 2304
[172.16.2.180]:20480, 27326   [10.10.123.20]:20480, 2304
[172.16.1.111]:20480, 18810   [10.10.123.20]:20480, 2304
[172.16.2.180]:20480, 31509   [10.10.123.20]:20480, 2304
[172.16.1.111]:20480, 27304   [10.10.123.20]:20480, 2304
[172.16.2.180]:20480, 27003   [10.10.123.20]:20480, 2304
[172.16.2.180]:20480, 23430   [10.10.123.20]:20480, 2304
...

🧿 Cilium의 LXC 컨테이너에 대한 정보

Key LXC 컨테이너의 IP 주소와 포트 정보를 나타냅니다. 0은 포트가 사용되지 않음을 의미합니다.
Value 컨테이너에 대한 상세 정보로, 다음과 같은 항목을 포함합니다:
- id: 컨테이너의 고유 ID
- sec_id: 보안 ID (Security ID)
- flags: 플래그 값 (여러 설정을 나타냄)
- ifindex: 네트워크 인터페이스 인덱스
- mac: 컨테이너의 MAC 주소
- nodemac: 노드의 MAC 주소
State 현재 상태를 나타내며, sync는 동기화 상태를 의미합니다.
Error 오류가 발생한 경우 이 열에 에러 메시지가 표시됩니다.
(⎈|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

🧿  Cilium의 IP 캐시에 저장된 IP 주소에 대한 정보

Key IP 주소와 서브넷을 나타냅니다. /32는 단일 IP 주소를 의미합니다.
Value IP 주소에 대한 상세 정보로 다음과 같은 항목을 포함합니다:
- identity: 보안 ID (Security ID)
- encryptkey: 암호화 키 (0이면 사용되지 않음)
- tunnelendpoint: 터널 엔드포인트의 IP 주소
- flags: 추가 설정 (현재는 <none>으로 표시됨)
State 현재 상태를 나타내며, sync는 동기화 상태를 의미합니다.
Error 오류가 발생한 경우 이 열에 에러 메시지가 표시됩니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# c0 map get cilium_ipcache
Key                 Value                                                                     State   Error
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.221/32     identity=39166 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
172.16.1.78/32      identity=44886 encryptkey=0 tunnelendpoint=192.168.10.101, flags=<none>   sync
172.16.0.12/32      identity=1 encryptkey=0 tunnelendpoint=0.0.0.0, flags=<none>              sync
192.168.10.101/32   identity=6 encryptkey=0 tunnelendpoint=0.0.0.0, 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.210/32     identity=39166 encryptkey=0 tunnelendpoint=192.168.10.101, flags=<none>   sync

🧿 KubeProxyReplacement 설정

  • KubeProxyReplacement: True
    • Cilium이 Kube-proxy의 기능을 대체하여 클러스터 내의 서비스 트래픽을 처리하고 있음을 의미합니다. Kube-proxy는 Kubernetes의 기본 컴포넌트로, 서비스와 파드 간의 트래픽을 라우팅하는 역할을 합니다. Cilium은 BPF (Berkeley Packet Filter)를 사용하여 이 기능을 더 효율적이고 성능이 뛰어나게 구현합니다.
  • 네트워크 인터페이스 정보
    • ens5: Cilium이 사용 중인 네트워크 인터페이스의 이름입니다.
    • 192.168.10.10: 이 인터페이스에 할당된 IPv4 주소입니다. Cilium은 이 IP를 통해 서비스 트래픽을 처리합니다.
  • (Direct Routing):
    • Cilium이 사용하는 라우팅 방법을 나타냅니다. "Direct Routing"은 클러스터 내의 서비스 트래픽이 직접 파드에 전달됨을 의미합니다. 이는 Cilium이 BPF를 사용하여 패킷을 직접 필터링하고 처리할 수 있게 하여, 네트워크 성능을 향상시킵니다.

🧿 Routing 정보

  • Network: Native
    • Cilium이 Kubernetes 클러스터 내에서 사용하는 네트워크 라우팅 방식입니다. "Native"는 Cilium이 네이티브 IP 주소를 사용하여 패킷을 라우팅한다는 의미입니다. 이는 Cilium이 Kubernetes의 네트워킹 스택과 통합되어 IP 패킷을 직접 처리하고, Kubernetes API를 통해 서비스를 관리하는 방식을 의미합니다.
  • Host: BPF
    • "BPF"는 Berkeley Packet Filter의 약자로, Cilium이 호스트 시스템에서 패킷을 처리하는 방법입니다. BPF는 고급 패킷 필터링 및 모니터링 기능을 제공하는 커널 기능으로, Cilium은 이를 통해 패킷을 효율적으로 필터링하고 처리합니다. BPF를 사용하면 커널 모드에서 직접 패킷을 조작할 수 있어 성능이 크게 향상됩니다.

🧿 Masquerading 정보

  • Masquerading: BPF
    • Cilium은 패킷의 출발지 IP 주소를 변경하기 위해 BPF(Berkeley Packet Filter) 기술을 사용합니다. BPF는 패킷을 커널에서 필터링하고 처리할 수 있게 해주는 기능으로, 성능을 향상시키는 데 도움을 줍니다.
  • [ens5]
    • ens5는 Cilium이 masquerading을 적용하는 네트워크 인터페이스의 이름입니다. 이 인터페이스를 통해 패킷이 전송되며, Cilium은 해당 인터페이스를 통해 나가는 패킷의 출발지 IP 주소를 변경합니다.
  • 192.168.0.0/16
    • 이 CIDR(Classless Inter-Domain Routing) 블록은 masquerading이 적용되는 IP 주소 범위를 나타냅니다. 여기서는 192.168.0.0부터 192.168.255.255까지의 모든 주소가 포함됩니다. 이 주소 범위 내의 모든 패킷은 masquerading 규칙에 따라 처리됩니다.

🧿 Proxy Status 정보

  • Proxy Status: OK
    • Cilium 프록시의 상태가 정상임을 나타냅니다. 즉, 프록시가 예상대로 작동하고 있음을 의미합니다.
  • ip 172.16.0.12
    • Cilium 프록시의 내부 IP 주소입니다. 이 주소는 Cilium에서 관리하는 트래픽의 출발지 또는 목적지로 사용될 수 있습니다.
  • 0 redirects active on ports 10000-20000
    • 현재 10000번에서 20000번 포트 간에 활성화된 리다이렉트가 없음을 나타냅니다. 리다이렉트는 특정 포트에서 수신한 트래픽을 다른 포트로 전송하는 기능입니다. 이 경우에는 해당 포트 범위 내에서 리다이렉트가 설정되지 않았습니다.
  • Envoy: external
    • Cilium의 Envoy 프록시가 외부 환경에서 실행되고 있음을 나타냅니다. Envoy는 HTTP 및 TCP 요청을 관리하는 고성능 프록시 서버로, 서비스 간의 통신을 지원합니다. "external"이라는 용어는 Envoy가 클러스터 외부와의 통신을 포함한 외부 환경에 연결되어 있음을 의미합니다.

🧿 BPF Maps 정보 설명

  • BPF Maps: Cilium에서 사용하는 데이터 구조로, 다양한 형태의 데이터를 저장하고 관리하는 데 사용됩니다. 네트워크 트래픽, 상태 정보, 라우팅 정보 등 여러 정보를 저장하는 데 필요합니다.
  • Dynamic Sizing:
    • BPF 맵의 크기가 동적으로 조정됨을 나타냅니다. 즉, 사용량에 따라 BPF 맵의 크기가 자동으로 증가하거나 감소하여 메모리 사용을 최적화할 수 있습니다.
  • On:
    • 동적 크기 조정 기능이 활성화되어 있음을 의미합니다. 이 기능은 BPF 맵이 더 많은 데이터를 처리해야 할 때 유용하며, 메모리 효율성을 높여줍니다.
  • Ratio: 0.002500:
    • 동적 크기 조정 시 BPF 맵의 최적화 비율을 나타냅니다. 이 비율은 맵의 기본 크기와 현재 사용 중인 항목 수의 비율을 나타내며, 이 값은 맵의 크기가 조정될 때의 기준으로 사용됩니다. 비율이 작을수록 더 많은 메모리를 사용하여 데이터를 수용할 수 있습니다.

 

 

(⎈|CiliumLab:N/A) root@k8s-s:~# c0 status --verbose
KVStore:                Ok   Disabled
Kubernetes:             Ok   1.30 (v1.30.5) [linux/amd64]
Kubernetes APIs:        ["EndpointSliceOrEndpoint", "cilium/v2::CiliumClusterwideNetworkPolicy", "cilium/v2::CiliumEndpoint", "cilium/v2::CiliumNetworkPolicy", "cilium/v2::CiliumNode", "cilium/v2alpha1::CiliumCIDRGroup", "core/v1::Namespace", "core/v1::Pods", "core/v1::Service", "networking.k8s.io/v1::NetworkPolicy"]
KubeProxyReplacement:   True   [ens5   192.168.10.10 fe80::ca:b4ff:fe99:6a93 (Direct Routing)]
Host firewall:          Disabled
SRv6:                   Disabled
CNI Chaining:           none
CNI Config file:        successfully wrote CNI configuration file to /host/etc/cni/net.d/05-cilium.conflist
Cilium:                 Ok   1.16.3 (v1.16.3-f2217191)
NodeMonitor:            Listening for events on 4 CPUs with 64x4096 of shared memory
Cilium health daemon:   Ok
IPAM:                   IPv4: 3/254 allocated from 172.16.0.0/24,
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
BandwidthManager:       Disabled
Routing:                Network: Native   Host: BPF
Attach Mode:            TCX
Device Mode:            veth
Masquerading:           BPF (ip-masq-agent)   [ens5]   192.168.0.0/16 [IPv4: Enabled, IPv6: Disabled]
Clock Source for BPF:   ktime
Controller Status:      26/26 healthy
  Name                                  Last success   Last error   Count   Message
  bpf-map-sync-cilium_lxc               7s ago         never        0       no error
  cilium-health-ep                      49s ago        never        0       no error
  ct-map-pressure                       27s ago        never        0       no error
  daemon-validate-config                58s ago        never        0       no error
  dns-garbage-collector-job             1m0s ago       never        0       no error
  endpoint-1541-regeneration-recovery   never          never        0       no error
  endpoint-416-regeneration-recovery    never          never        0       no error
  endpoint-905-regeneration-recovery    never          never        0       no error
  endpoint-gc                           3m0s ago       never        0       no error
  ep-bpf-prog-watchdog                  28s ago        never        0       no error
  ipcache-inject-labels                 58s ago        never        0       no error
  k8s-heartbeat                         30s ago        never        0       no error
  link-cache                            13s ago        never        0       no error
  node-neighbor-link-updater            8s ago         never        0       no error
  resolve-identity-416                  2m40s ago      never        0       no error
  resolve-identity-905                  2m57s ago      never        0       no error
  resolve-labels-/                      2h2m58s ago    never        0       no error
  resolve-labels-default/netpod         1h22m40s ago   never        0       no error
  restoring-ep-identity (1541)          2h2m58s ago    never        0       no error
  sync-lb-maps-with-k8s-services        2h2m58s ago    never        0       no error
  sync-policymap-1541                   2m54s ago      never        0       no error
  sync-policymap-416                    7m40s ago      never        0       no error
  sync-policymap-905                    2m49s ago      never        0       no error
  sync-to-k8s-ciliumendpoint (416)      10s ago        never        0       no error
  sync-utime                            58s ago        never        0       no error
  write-cni-file                        2h3m0s ago     never        0       no error
Proxy Status:            OK, ip 172.16.0.12, 0 redirects active on ports 10000-20000, Envoy: external
Global Identity Range:   min 256, max 65535
Hubble:                  Ok   Current/Max Flows: 4095/4095 (100.00%), Flows/s: 1.48   Metrics: Ok
KubeProxyReplacement Details:
  Status:                 True
  Socket LB:              Enabled
  Socket LB Tracing:      Enabled
  Socket LB Coverage:     Full
  Devices:                ens5   192.168.10.10 fe80::ca:b4ff:fe99:6a93 (Direct Routing)
  Mode:                   SNAT
  Backend Selection:      Random
  Session Affinity:       Enabled
  Graceful Termination:   Enabled
  NAT46/64 Support:       Disabled
  XDP Acceleration:       Disabled
  Services:
  - ClusterIP:      Enabled
  - NodePort:       Enabled (Range: 30000-32767)
  - LoadBalancer:   Enabled
  - externalIPs:    Enabled
  - HostPort:       Enabled
 ...

🧿 Cilium의 cgroup 관련 설정 정보

  • cgroup-root: Cilium은 컨테이너의 자원 관리를 위해 cgroup을 사용합니다. 위 설정은 Cilium이 cgroup v2를 사용하고 있음을 나타내며, /run/cilium/cgroupv2 디렉터리를 cgroup의 루트로 설정하고 있습니다. 이 경로는 Cilium이 네트워크 정책, 리소스 제한, 우선 순위 설정 등을 관리하는 데 사용됩니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# cilium config view | grep cgroup
cgroup-root                                       /run/cilium/cgroupv2

🧿 Cilium이 cgroup을 사용하여 네트워크 트래픽을 어떻게 관리

CgroupPath cgroup의 경로를 나타냅니다.
ID cgroup의 고유 ID입니다.
AttachType cgroup에 첨부된 BPF 프로그램의 유형을 나타냅니다.
- cgroup_device: 장치 접근 제어를 위한 cgroup입니다.
- tcx_ingress: 트래픽 컨트롤을 위한 ingress 필터입니다.
- tcx_egress: 트래픽 컨트롤을 위한 egress 필터입니다.
AttachFlags cgroup 첨부에 대한 플래그를 나타내며, 현재는 multi와 같은 플래그가 있을 수 있습니다.
Name cgroup의 이름을 나타내며, 현재 BPF 프로그램이 attach된 cgroup의 이름을 보여줍니다.
  • cgroup에 attach되어 네트워크 트래픽을 제어하고, 이를 통해 보안 및 성능을 최적화할 수 있습니다. 
  • tcx_ingress와 tcx_egress cgroup은 각각 호스트로 들어오고 나가는 트래픽을 제어하는 데 사용됩니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# c0bpf cgroup tree
CgroupPath
ID       AttachType      AttachFlags     Name
/sys/fs/cgroup
864      cgroup_device   multi
1260     tcx_ingress                     cil_to_host
1266     tcx_egress                      cil_from_host

🧿 Cilium의 cgroup 마운트 정보

  • Cilium 컨테이너는 cilium-mount 바이너리를 사용하여 cgroup을 호스트 시스템에 마운트
(⎈|CiliumLab:N/A) root@k8s-s:~# kubectl describe pod -n kube-system   cilium-4lkk6
Name:                 cilium-4lkk6
Namespace:            kube-system
Priority:             2000001000
Priority Class Name:  system-node-critical
Service Account:      cilium
Node:                 k8s-s/192.168.10.10
...
Status:               Running
IP:                   192.168.10.10
IPs:
  IP:           192.168.10.10
Controlled By:  DaemonSet/cilium
Init Containers:
  config:
    Container ID:  containerd://22f01697d9bcb03d271a29d65a490d861eac63607a2a5144e70daaa16f4c4e31
    Image:         quay.io/cilium/cilium:v1.16.3@sha256:62d2a09bbef840a46099ac4c69421c90f84f28d018d479749049011329aa7f28
    Image ID:      quay.io/cilium/cilium@sha256:62d2a09bbef840a46099ac4c69421c90f84f28d018d479749049011329aa7f28
    Port:          <none>
    Host Port:     <none>
    Command:
      cilium-dbg
      build-config
    State:          Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Mon, 21 Oct 2024 19:25:50 +0900
      Finished:     Mon, 21 Oct 2024 19:25:50 +0900
    Ready:          True
    Restart Count:  0
    Environment:
      K8S_NODE_NAME:             (v1:spec.nodeName)
      CILIUM_K8S_NAMESPACE:     kube-system (v1:metadata.namespace)
      KUBERNETES_SERVICE_HOST:  192.168.10.10
      KUBERNETES_SERVICE_PORT:  6443
    Mounts:
      /tmp from tmp (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-l5l4n (ro)
  mount-cgroup:
    Container ID:  containerd://00c8b03d74293cb86c5f09a06def39765dcaf0121928880e2245823e5555a260
    Image:         quay.io/cilium/cilium:v1.16.3@sha256:62d2a09bbef840a46099ac4c69421c90f84f28d018d479749049011329aa7f28
    Image ID:      quay.io/cilium/cilium@sha256:62d2a09bbef840a46099ac4c69421c90f84f28d018d479749049011329aa7f28
    Port:          <none>
    Host Port:     <none>
    Command:
      sh
      -ec
      cp /usr/bin/cilium-mount /hostbin/cilium-mount;
      nsenter --cgroup=/hostproc/1/ns/cgroup --mount=/hostproc/1/ns/mnt "${BIN_PATH}/cilium-mount" $CGROUP_ROOT;
      rm /hostbin/cilium-mount

    State:          Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Mon, 21 Oct 2024 19:25:51 +0900
      Finished:     Mon, 21 Oct 2024 19:25:51 +0900
    Ready:          True
    Restart Count:  0
    Environment:
      CGROUP_ROOT:  /run/cilium/cgroupv2
      BIN_PATH:     /opt/cni/bin
    Mounts:
      /hostbin from cni-path (rw)
      /hostproc from hostproc (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-l5l4n (ro)
    ...

🧿 mount-cgroup 컨테이너의 로그를 수집하는 과정에서 발생한 로그와 오류 메시지

  • Cilium이 cgroupv2 파일 시스템을 성공적으로 마운트했음을 보여줍니다.
  • cgroupv2는 Linux의 cgroup 버전 2를 의미하며, 리소스 관리를 보다 효율적으로 수행할 수 있도록 도와줍니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# kubetail -n kube-system -c mount-cgroup --since 12h
...
[cilium-t2d6x] time="2024-10-21T19:25:50+09:00" level=info msg="Mounted cgroupv2 filesystem at /run/cilium/cgroupv2" subsys=cgroups
[cilium-4lkk6] time="2024-10-21T19:25:51+09:00" level=info msg="Mounted cgroupv2 filesystem at /run/cilium/cgroupv2" subsys=cgroups
...

🧿 netpod에서 특정 서비스의 IP에 대해 curl을 통해 HTTP 요청을 실행한 결과, strace를 사용하여 시스템 호출에 대한 통계 정보

  • connect: 클라이언트가 서버에 연결하려고 할 때 사용하는 함수.
  • getsockname: 클라이언트가 자신의 소켓 주소(즉, IP와 포트 번호)를 확인할 때 사용하는 함수.
(⎈|CiliumLab:N/A) root@k8s-s:~# kubectl exec netpod -- strace -c curl -s $SVCIP
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:35402
GET / HTTP/1.1
Host: 10.10.123.20
User-Agent: curl/8.7.1
Accept: */*

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 33.74    0.000722           9        79           mmap
 18.27    0.000391           6        56        32 open
 10.51    0.000225          16        14           mprotect
  8.18    0.000175           6        27           read
  6.64    0.000142           5        27           munmap
  4.49    0.000096           4        23           fcntl
  4.21    0.000090           7        12           fstat
  4.02    0.000086           3        27           close
  2.76    0.000059          59         1         1 connect
  1.45    0.000031           5         6           poll
  1.40    0.000030           0        31           rt_sigaction
  1.36    0.000029          29         1           sendto
  0.98    0.000021           5         4           getsockname
  0.37    0.000008           0        12           rt_sigprocmask
  0.33    0.000007           2         3           brk
  0.33    0.000007           7         1           getsockopt
  0.28    0.000006           6         1           getuid
  0.23    0.000005           2         2           geteuid
  0.23    0.000005           5         1           getegid
  0.23    0.000005           5         1           getgid
  0.00    0.000000           0         1           writev
  0.00    0.000000           0         1           pipe
  0.00    0.000000           0         3         3 ioctl
  0.00    0.000000           0        10           readv
  0.00    0.000000           0         1           socket
  0.00    0.000000           0         1           recvfrom
  0.00    0.000000           0         4           setsockopt
  0.00    0.000000           0         1           execve
  0.00    0.000000           0        31           lseek
  0.00    0.000000           0         1           arch_prctl
  0.00    0.000000           0         1           set_tid_address
  0.00    0.000000           0         5           getrandom
------ ----------- ----------- --------- --------- ----------------
100.00    0.002140           5       389        36 total

🧿 netpod에서 $SVCIP로의 curl 요청을 실행하면서 strace를 사용하여 시스템 호출

  • 10.10.123.20 IP 주소의 서버의 80번 포트(웹 서버)로 연결을 시도
    • connect: 클라이언트가 서버에 연결하려고 할 때 사용하는 함수.
  • 소켓 5번이 현재 로컬에서 IP 주소 172.16.0.230과 포트 43780을 사용
    • getsockname: 클라이언트가 자신의 소켓 주소(즉, IP와 포트 번호)를 확인할 때 사용하는 함수.
(⎈|CiliumLab:N/A) root@k8s-s:~# kubectl exec netpod -- strace -s 65535 -f -tt curl -s $SVCIP
...
12:35:07.781163 connect(5, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("10.10.123.20")}, 16) = -1 EINPROGRESS (Operation in progress)
12:35:07.781559 getsockname(5, {sa_family=AF_INET, sin_port=htons(43780), sin_addr=inet_addr("172.16.0.230")}, [128 => 16]) = 0
...
12:35:07.782917 getsockopt(5, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
12:35:07.783215 getsockname(5, {sa_family=AF_INET, sin_port=htons(43780), sin_addr=inet_addr("172.16.0.230")}, [128 => 16]) = 0
12:35:07.783429 getsockname(5, {sa_family=AF_INET, sin_port=htons(43780), sin_addr=inet_addr("172.16.0.230")}, [128 => 16]) = 0
12:35:07.783535 getsockname(5, {sa_family=AF_INET, sin_port=htons(43780), sin_addr=inet_addr("172.16.0.230")}, [128 => 16]) = 0
...

🧿 netpod 파드에서 strace를 사용해 시스템 호출을 추적하며 curl을 통해 특정 서비스 IP로 요청을 보내는 과정

  • kubectl exec 명령어를 통해 netpod라는 파드에서 curl을 사용해 10.10.123.20에 HTTP 요청을 보내는 작업을 했습니다.
  • strace를 사용해 연결 시도(connect)를 추적했으며, 연결이 비차단 소켓으로 처리되고 있어 즉시 완료되지 않고 진행 중이라는 메시지를 받았습니다.
  • HTTP 요청은 정상적으로 이루어졌고, 서버에서 응답을 받았습니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# kubectl exec netpod -- strace -e trace=connect curl -s $SVCIP
connect(5, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("10.10.123.20")}, 16) = -1 EINPROGRESS (Operation in progress)
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:59490
GET / HTTP/1.1
Host: 10.10.123.20
User-Agent: curl/8.7.1
Accept: */*

+++ exited with 0 +++

🧿  netpod 파드 내에서 curl 명령을 실행하고, 그 과정에서 getsockname 시스템 호출을 추적

  • kubectl exec로 netpod 파드에서 curl 명령을 실행하면서, 로컬 소켓의 IP 주소와 포트 번호를 확인하는 getsockname 호출을 추적했습니다.
  • 소켓이 로컬 IP 172.16.0.230과 포트 44532에 바인딩되어 있다는 정보를 여러 번 얻었으며, 이는 curl이 HTTP 요청을 보내기 위한 준비 과정에서 발생한 것입니다.
  • 요청은 성공적으로 처리되었고, 원격 서버 webpod2에서 응답을 받았습니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# kubectl exec netpod -- strace -e trace=getsockname curl -s $SVCIP
getsockname(5, {sa_family=AF_INET, sin_port=htons(44532), sin_addr=inet_addr("172.16.0.230")}, [128 => 16]) = 0
getsockname(5, {sa_family=AF_INET, sin_port=htons(44532), sin_addr=inet_addr("172.16.0.230")}, [128 => 16]) = 0
getsockname(5, {sa_family=AF_INET, sin_port=htons(44532), sin_addr=inet_addr("172.16.0.230")}, [128 => 16]) = 0
getsockname(5, {sa_family=AF_INET, sin_port=htons(44532), sin_addr=inet_addr("172.16.0.230")}, [128 => 16]) = 0
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:44532
GET / HTTP/1.1
Host: 10.10.123.20
User-Agent: curl/8.7.1
Accept: */*

+++ exited with 0 +++
Comments