본문 바로가기
DevOps/cilium

[Cilium Study] Cilium Performance

by 서어켜엉 2025. 8. 31.

 실습 환경 구성

kind k8s + cilium CNI

# Prometheus Target connection refused bind-address 설정 : kube-controller-manager , kube-scheduler , etcd , kube-proxy
kind create cluster --name myk8s --image kindest/node:v1.33.2 --config - <<EOF
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  extraPortMappings:
  - containerPort: 30000
    hostPort: 30000
  - containerPort: 30001
    hostPort: 30001
  - containerPort: 30002
    hostPort: 30002
  - containerPort: 30003
    hostPort: 30003
  kubeadmConfigPatches: # Prometheus Target connection refused bind-address 설정
  - |
    kind: ClusterConfiguration
    controllerManager:
      extraArgs:
        bind-address: 0.0.0.0
    etcd:
      local:
        extraArgs:
          listen-metrics-urls: http://0.0.0.0:2381
    scheduler:
      extraArgs:
        bind-address: 0.0.0.0
  - |
    kind: KubeProxyConfiguration
    metricsBindAddress: 0.0.0.0
networking:
  disableDefaultCNI: true
  kubeProxyMode: none
  podSubnet: "10.244.0.0/16"   # cluster-cidr
kubeadmConfigPatches:
- |
  kind: ClusterConfiguration
  controllerManager:
    extraArgs:
      allocate-node-cidrs: "true"
      cluster-cidr: "10.244.0.0/16"
      node-cidr-mask-size: "22"
EOF

# node 별 PodCIDR 확인
kubectl get nodes -o jsonpath='{.items[*].spec.podCIDR}'


# cilium cni 설치
cilium install --version 1.18.1 --set ipam.mode=kubernetes --set ipv4NativeRoutingCIDR=172.20.0.0/16 \
--set routingMode=native --set autoDirectNodeRoutes=true --set endpointRoutes.enabled=true --set directRoutingSkipUnreachable=true \
--set kubeProxyReplacement=true --set bpf.masquerade=true \
--set endpointHealthChecking.enabled=false --set healthChecking=false \
--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=30003 \
--set prometheus.enabled=true --set operator.prometheus.enabled=true --set envoy.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}" \
--set debug.enabled=true  # --dry-run-helm-values

# hubble ui
open http://127.0.0.1:30003


# metrics-server
helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/
helm upgrade --install metrics-server metrics-server/metrics-server --set 'args[0]=--kubelet-insecure-tls' -n kube-system

# 확인
kubectl top node
kubectl top pod -A --sort-by='cpu'
kubectl top pod -A --sort-by='memory'

cilium 관련 pods creating (꽤 오래 걸림)
에러가 발생

원인 파악을 위해 kubectl -n kube-system describe pod cilium-rmrc8
명령어를 입력했더니, 아래와 같은 상태이다. connection refused 

 

kubectl -n kube-system logs -p cilium-rmrc8 -c cilium-agent | grep -i "level=error"

문제가 발생한 pod의 로그를 확인해보자

 

대충 로그를 보면 bpf_lxc.c 의 컴파일이 실패했다고 한다.

 

모르는 내용이니 ChatGPT의 도움을 받아보자

원인
모든 에러가 공통적으로 bpf_lxc.c 컴파일 실패(exit status 1) 에서 시작합니다.

BPF template object creation failed
Error while reloading endpoint BPF program
endpoint regeneration failed
즉, Cilium이 Pod 네트워크 인터페이스에 붙일 eBPF 프로그램을 커널에 컴파일·로드하지 못해서 에이전트가 계속 재시작하는 겁니다.

 

무슨 소릴 하는걸까? 
GPT가 제시한 해결방안

1. Docker desktop의 버전을 확인하라.

(eBPF JIT 지원 여부 확인)

문제 없음. 

 

2. seccomp 옵션 확인

type이 Unconfined 인가?

문제 없음.

 

 

온갖 삽질을 하다가 docker desktop 버젼 업그레이드를 진행했더니 해결..

현재 docker desktop version은 28.3.3

 

실습 환경 준비 완료.

 

Prometheus & Grafana 설치

#
kubectl apply -f https://raw.githubusercontent.com/cilium/cilium/1.18.1/examples/kubernetes/addons/prometheus/monitoring-example.yaml

#
kubectl get deploy,pod,svc,ep -n cilium-monitoring
kubectl get cm -n cilium-monitoring
kc describe cm -n cilium-monitoring prometheus
kc describe cm -n cilium-monitoring grafana-config
kubectl get svc -n cilium-monitoring

# NodePort 설정
kubectl patch svc -n cilium-monitoring prometheus -p '{"spec": {"type": "NodePort", "ports": [{"port": 9090, "targetPort": 9090, "nodePort": 30001}]}}'
kubectl patch svc -n cilium-monitoring grafana -p '{"spec": {"type": "NodePort", "ports": [{"port": 3000, "targetPort": 3000, "nodePort": 30002}]}}'

# 접속 주소 확인
open "http://127.0.0.1:30001"  # prometheus
open "http://127.0.0.1:30002"  # grafana

 

쿠버네티스 환경에서 속도 측정 테스트

# 배포
cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: iperf3-server
spec:
  selector:
    matchLabels:
      app: iperf3-server
  replicas: 1
  template:
    metadata:
      labels:
        app: iperf3-server
    spec:
      containers:
      - name: iperf3-server
        image: networkstatic/iperf3
        args: ["-s"]
        ports:
        - containerPort: 5201
---
apiVersion: v1
kind: Service
metadata:
  name: iperf3-server
spec:
  selector:
    app: iperf3-server
  ports:
    - name: tcp-service
      protocol: TCP
      port: 5201
      targetPort: 5201
    - name: udp-service
      protocol: UDP
      port: 5201
      targetPort: 5201
  type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: iperf3-client
spec:
  selector:
    matchLabels:
      app: iperf3-client
  replicas: 1
  template:
    metadata:
      labels:
        app: iperf3-client
    spec:
      containers:
      - name: iperf3-client
        image: networkstatic/iperf3
        command: ["sleep"]
        args: ["infinity"]
EOF

# 확인 : 서버와 클라이언트가 어떤 노드에 배포되었는지 확인
kubectl get deploy,svc,pod -owide

# 서버 파드 로그 확인 : 기본 5201 포트 Listen
kubectl logs -l app=iperf3-server -f

 

1. TCP 5201, 측정 시간 5초

# 클라이언트 파드에서 아래 명령 실행
kubectl exec -it deploy/iperf3-client -- iperf3 -c iperf3-server -t 5

# 서버 파드 로그 확인 : 기본 5201 포트 Listen
kubectl logs -l app=iperf3-server -f

 

2. UDP 사용, 역박향모드(-R)

# 클라이언트 파드에서 아래 명령 실행
kubectl exec -it deploy/iperf3-client -- iperf3 -c iperf3-server -u -b 20G

# 서버 파드 로그 확인 : 기본 5201 포트 Listen
kubectl logs -l app=iperf3-server -f

 

 

3. TCP, 쌍방향 모드(-R)

# 클라이언트 파드에서 아래 명령 실행
kubectl exec -it deploy/iperf3-client -- iperf3 -c iperf3-server -t 5 --bidir

# 서버 파드 로그 확인 : 기본 5201 포트 Listen
kubectl logs -l app=iperf3-server -f

 

4. TCP 다중 스트림(30개), -P(number of parallel client streams to run)

# 클라이언트 파드에서 아래 명령 실행
kubectl exec -it deploy/iperf3-client -- iperf3 -c iperf3-server -t 10 -P 2

# 서버 파드 로그 확인 : 기본 5201 포트 Listen
kubectl logs -l app=iperf3-server -f

'DevOps > cilium' 카테고리의 다른 글

[Cilium Study] Cilium Security 실습  (0) 2025.09.07
[Cilium Study] Cilium Security  (0) 2025.09.07
[Cilium Study] kube-burner  (0) 2025.08.30
[Cilium Study] Mutual Authentication  (0) 2025.08.23
[Cilium Study] Cilium Service Mesh 3  (0) 2025.08.20