Ssoon

[8주차] Cilium CNI : Cilium 이란? 본문

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

[8주차] Cilium CNI : Cilium 이란?

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

https://isovalent.com/blog/post/why-replace-iptables-with-ebpf/

  • iptables conntrack overhead : 네트워크 연결 상태를 추적해 보안과 세션 관리를 용이하게 하지만, 많은 연결을 추적할 때 시스템 자원을 많이 소모할 수 있습니다. 이로 인해 메모리와 CPU 사용이 증가하고, 네트워크 지연이 발생할 수 있습니다.
  • iptables overhead : 패킷을 규칙과 일치시키는 과정에서 발생하는 CPU와 메모리 사용의 추가적인 부담을 말합니다. 특히 규칙이 많거나 연결 추적을 사용하면 오버헤드가 증가할 수 있습니다.
  • Context-switch overhead :CPU가 여러 프로세스 간에 작업을 전환할 때 발생하는 성능 손실입니다. 작업 전환이 많아질수록 실제 연산 시간보다 전환에 소요되는 시간이 늘어나 시스템 성능이 떨어질 수 있습니다.

IPTables 방식의 단점

  • IPTables는 네트워크 패킷이 들어오고 나가는 경로에 따라 다양한 규칙을 설정할 수 있습니다. 하지만 이 규칙들이 매우 구체적이고 세부적이어서 관리가 어려울 수 있습니다. 규칙을 추가하고 수정하는 과정이 복잡할 수 있습니다.
  • 많은 규칙이 설정된 경우, 네트워크 트래픽이 들어오고 나갈 때마다 그 규칙들을 일일이 검사해야 합니다. 규칙이 많아질수록 시스템의 성능이 떨어질 수 있습니다. 특히 대규모 네트워크 환경에서는 성능 저하가 눈에 띌 수 있습니다.

 BPF (Berkeley Packet Filter)

BPF는 1992년 버클리 대학에서 개발된 기술로, 네트워크 트래픽을 분석하고 필터링하는 데 사용됩니다

  • 패킷 필터링:
    • BPF는 네트워크 트래픽에서 원하는 패킷을 고속으로 필터링할 수 있도록 설계되었습니다. 
    • BPF는 패킷을 커널에서 처리하기 전에 필터링하여, 불필요한 패킷을 애플리케이션에 전달하지 않음으로써 시스템 리소스를 절약합니다.
  • 효율성:
    • BPF는 매우 경량화된 필터링 시스템입니다. 패킷을 처리할 때, 커널 내부에서 직접 실행되기 때문에 성능 저하가 거의 없고, 불필요한 복잡한 연산 없이 필요한 패킷만 추려냅니다.
  • 유연성:
    • BPF는 매우 유연한 구조를 가지고 있어, 사용자 정의 필터링 규칙을 쉽게 작성할 수 있습니다. 

 eBPF (Extended BPF)

eBPF는 리눅스 커널 안에 내장된 작은 가상 머신으로, 특정 이벤트가 발생할 때 실행되는 프로그램을 커널에 적재하여 커널의 동작을 자유롭게 커스터마이징할 수 있게 합니다. 

  • 더 많은 기능:
    • eBPF는 패킷 필터링뿐만 아니라, 리눅스 커널에서 일어나는 거의 모든 이벤트를 추적할 수 있습니다. 이를 통해 네트워크 트래픽뿐만 아니라 파일 시스템, 시스템 호출, 프로세스 상태 등을 실시간으로 모니터링할 수 있습니다.
  • 커널 수준에서 안전한 실행:
    • eBPF 프로그램은 커널에서 직접 실행되지만, 사용자 영역에서 작성한 코드가 커널에서 실행될 때 발생할 수 있는 보안 문제를 예방하기 위해 검증 과정을 거칩니다. 즉, 커널 패닉을 일으킬 위험이 있는 코드는 실행되지 않습니다.
  • 고성능:
    • eBPF는 이벤트를 실시간으로 모니터링하면서도 시스템 성능에 미치는 영향이 적습니다. 이는 주로 eBPF 프로그램이 커널 내에서 실행되기 때문에 컨텍스트 스위칭과 같은 추가적인 오버헤드가 없기 때문입니다.
  • 사용자 정의 가능성:
    • 사용자는 eBPF 프로그램을 작성하여 특정 조건이나 상황에 맞게 네트워크 트래픽을 분석하거나, 시스템의 성능을 측정할 수 있습니다.


eBPF는 Linux 커널 내부에서 직접 동작하는 방식으로, 네트워크 프로그래밍에 효율성을 높였습니다.

기존의 유저 공간 네트워킹과 달리, eBPF는 커널에서 완전히 처리되므로 애플리케이션이 소켓 계층을 거치지 않아도 됩니다.


BPF (Berkeley Packet Filter) vs eBPF (Extended BPF)

  • BPF:
    • 레지스터: 제한된 수(0~31)의 레지스터로 동작, Accumulator와 X라는 두 개의 주요 레지스터가 있습니다.
    • 보조 메모리: 16개의 슬롯으로 구성된 메모리 공간.
  • eBPF:
    • 레지스터: 11개의 64비트 레지스터로 더 많은 데이터 처리 가능.
    • 스택: 512바이트의 스택을 제공하여 임시 데이터를 저장.
    • 맵(Maps): 키-값 형태의 자료구조로 무제한 데이터를 저장하고 공유 가능.

eBPF는 BPF보다 더 유연하고 확장된 기능을 제공합니다.

  BPF (Berkeley Packet Filter) eBPF (Extended BPF)
기능 목적 네트워크 패킷 필터링 네트워크 필터링 외 다양한 커널 작업 제어
주요 사용 분야 네트워크 트래픽 필터링 보안, 성능 모니터링, 시스템 분석, 네트워크 트래픽 관리
유연성 제한적이며 네트워크 패킷 필터링에 집중 고도의 유연성으로 커널의 다양한 동작을 프로그래밍 가능
안전성 보장 제한적 엄격한 검증 절차로 메모리와 실행시간 제한, 커널 안정성 유지
주요 특징 커널에 단순 필터링 규칙 적용 커널에 작은 프로그램 적재 가능, 다양한 시스템 이벤트에 반응

Cilium

https://www.solo.io/blog/cilium-trends-2023/

네트워크 보안 및 성능을 개선하기 위해 설계된 오픈 소스 소프트웨어로, eBPF 기술을 사용하여 Kubernetes와 같은 클라우드 네이티브 환경에서 동작합니다. 네트워크 정책 관리, 로드 밸런싱, 트래픽 모니터링 등을 효율적으로 처리할 수 있게 도와줍니다.

  • 네트워크 보안: 마이크로서비스 간의 통신을 세밀하게 제어하는 네트워크 정책을 제공.
  • 성능 최적화: eBPF로 커널 레벨에서 패킷을 처리해 성능을 향상.
  • 로드 밸런싱 및 모니터링: 트래픽 흐름을 추적하고 분석하여 리소스 관리.
  • kube-proxy 대체 : Cilium은 Kubernetes의 기본 kube-proxy를 대체할 수 있습니다. kube-proxy는 클러스터 내 서비스의 네트워크 요청을 라우팅하는 역할을 합니다. Cilium을 사용하면 eBPF를 통해 더 효율적이고 고급 기능을 제공할 수 있습니다.

 Cilium의 작동 방식

Cilium은 여러 구성 요소가 함께 작동하여 네트워킹과 보안 기능을 수행합니다. 

  • Cilium Agent:
    • 각 노드에 배포되며, Kubernetes API 서버와 통신합니다. Cilium Agent는 eBPF 프로그램을 로드하고, 파드의 네트워크 트래픽을 처리하며, 네트워크 정책을 시행합니다. DaemonSet으로 배포되어 노드마다 하나씩 실행됩니다.
  • eBPF 프로그램:
    • Cilium은 eBPF를 사용하여 패킷 필터링, 라우팅, 트래픽 모니터링 등 다양한 네트워킹 기능을 수행합니다. eBPF 프로그램은 커널 수준에서 실행되기 때문에 성능이 뛰어나고, 네트워크 트래픽을 매우 세밀하게 제어할 수 있습니다.
  • Cilium CNI 플러그인:
    • Cilium은 Kubernetes의 CNI 플러그인으로서, 파드가 생성될 때 네트워크를 설정하고 IP 주소를 할당합니다. 또한, 새로운 파드가 생성되거나 삭제될 때 Cilium은 이를 감지하고 네트워크 구성을 업데이트합니다.
  • 네트워크 정책:
    • 관리자는 Cilium을 통해 네트워크 정책을 정의할 수 있습니다. 예를 들어, 특정 파드 간의 트래픽을 허용하거나 차단하는 규칙을 설정할 수 있습니다. Cilium은 이러한 정책을 eBPF 프로그램으로 변환하여 커널에서 직접 실행합니다.
  • Envoy 프록시 (선택 사항):
    • L7 규칙(애플리케이션 계층 프로토콜에 대한 규칙)을 사용하는 경우, Cilium은 Envoy 프록시를 사용하여 HTTP 트래픽을 관리합니다. Envoy는 요청을 라우팅하고, 로드 밸런싱을 수행하며, 모니터링 및 로깅 기능을 제공합니다.

https://learncloudnative.com/blog/2023-06-14-cilium-network-policy

Cilium 에이전트는 데몬셋으로 배포되며, 이는 클러스터 노드당 하나의 에이전트 인스턴스가 있다는 것을 의미합니다. 

에이전트 포드는 API 서비스와 통신하고 Linux 커널과 상호 작용하여 eBPF 프로그램을 로드하고 eBPF 맵을 업데이트합니다. 

또한 Cilium CNI 플러그인에 연결하여 대화하므로 새로운 워크로드가 예약될 때마다 알림을 받습니다. 또한 CiliumNetworkPolicy가 L7 규칙을 사용할 때 Envoy 프록시 인스턴스를 시작합니다. 

에이전트는 또한 클러스터 전체에 대한 통합 가시성을 위해 Hubble 릴레이가 연결할 수 있는 gRPC 서비스를 제공합니다.

 

실습 환경 구성

  • CloudFormation 스택 배포
C:\Users\ssoon\KANS>curl -O https://s3.ap-northeast-2.amazonaws.com/cloudformation.cloudneta.net/kans/kans-8w.yaml
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 20371  100 20371    0     0   162k      0 --:--:-- --:--:-- --:--:--  167k

C:\Users\ssoon\KANS>curl -s ipinfo.io/ip
112.152.82.177

C:\Users\ssoon\KANS>aws cloudformation deploy --template-file kans-8w.yaml --stack-name mylab --parameter-overrides MyInstanceType=t3.xlarge KeyName=KANS_KEY SgIngressSshCidr=112.152.82.177/32 --region ap-northeast-2

Waiting for changeset to be created..
Waiting for stack create/update to complete
Successfully created/updated stack - mylab

C:\Users\ssoon\KANS>aws ec2 describe-instances --query "Reservations[*].Instances[*].{PublicIPAdd:PublicIpAddress,InstanceName:Tags[?Key=='Name']|[0].Value,Status:State.Name}" --filters Name=instance-state-name,Values=running --output text
k8s-w1  3.35.53.69      running
k8s-s   3.35.54.219     running
k8s-w2  3.36.65.216     running
testpc  43.201.52.199   running

C:\Users\ssoon\KANS>ssh -i KANS_KEY.pem ubuntu@3.35.54.219
The authenticity of host '3.35.54.219 (3.35.54.219)' can't be established.
ED25519 key fingerprint is SHA256:XCfzZcIJ3RSosY4jh46g8Hf8tPNgRfel1I1RY/hrVok.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
...
(⎈|kubernetes-admin@kubernetes:N/A) root@k8s-s:~#

  • "kubernetes-admin@kubernetes" 컨텍스트 이름을 "CiliumLab"으로 변경합니다.
  • kubectl cluster-info 명령어를 사용하면 현재 Kubernetes 클러스터의 상태와 주요 서비스들의 정보를 확인합니다.
  • 현재 모든 노드(k8s-s, k8s-w1, k8s-w2)가 NotReady 상태입니다 ▶ kube-proxy 미설치 
(⎈|kubernetes-admin@kubernetes:N/A) root@k8s-s:~# kubectl config rename-context "kubernetes-admin@kubernetes" "CiliumLab"
Context "kubernetes-admin@kubernetes" renamed to "CiliumLab".

(⎈|CiliumLab:N/A) root@k8s-s:~# kubectl cluster-info
Kubernetes control plane is running at https://192.168.10.10:6443
CoreDNS is running at https://192.168.10.10:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

(⎈|CiliumLab:N/A) root@k8s-s:~# kc get node -owide
NAME     STATUS     ROLES           AGE     VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION   CONTAINER-RUNTIME
k8s-s    NotReady   control-plane   9m48s   v1.30.5   192.168.10.10    <none>        Ubuntu 22.04.5 LTS   6.8.0-1015-aws   containerd://1.7.22
k8s-w1   NotReady   <none>          9m28s   v1.30.5   192.168.10.101   <none>        Ubuntu 22.04.5 LTS   6.8.0-1015-aws   containerd://1.7.22
k8s-w2   NotReady   <none>          9m25s   v1.30.5   192.168.10.102   <none>        Ubuntu 22.04.5 LTS   6.8.0-1015-aws   containerd://1.7.22

  • CoreDNS가 Pending 상태에 있어 클러스터 네트워크 기능이 아직 완전히 동작하지 않습니다. ▶ kube-proxy 미설치 
(⎈|CiliumLab:N/A) root@k8s-s:~# kc get pod -A
NAMESPACE     NAME                            READY   STATUS    RESTARTS   AGE
kube-system   coredns-55cb58b774-2xvk2        0/1     Pending   0          10m
kube-system   coredns-55cb58b774-7v788        0/1     Pending   0          10m
kube-system   etcd-k8s-s                      1/1     Running   0          10m
kube-system   kube-apiserver-k8s-s            1/1     Running   0          10m
kube-system   kube-controller-manager-k8s-s   1/1     Running   0          10m
kube-system   kube-scheduler-k8s-s            1/1     Running   0          10m

  • 커널 버전 5.8 이상은 Cilium을 최적의 성능으로 실행하기 위한 권장 사항입니다.
  • 현재 리눅스 커널 버전: 6.8.0-1015 
(⎈|CiliumLab:N/A) root@k8s-s:~# uname -a
Linux k8s-s 6.8.0-1015-aws #16~22.04.1-Ubuntu SMP Mon Aug 19 19:38:17 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

  • Helm에 Cilium의 Helm 차트 저장소(repository)를 추가합니다.
  • 현재 Helm에 추가된 저장소 목록을 확인합니다.
  • Helm에 추가된 저장소에서 최신 차트 정보를 가져옵니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# helm repo add cilium https://helm.cilium.io/
"cilium" has been added to your repositories

(⎈|CiliumLab:N/A) root@k8s-s:~# helm repo list
NAME    URL
cilium  https://helm.cilium.io/

(⎈|CiliumLab:N/A) root@k8s-s:~# helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "cilium" chart repository
Update Complete. ⎈Happy Helming!⎈

Cilium 설치

  • Cilium을 설치하면서 네트워크 성능 최적화, 모니터링 및 디버깅 기능을 활성화하는 여러 설정을 포함합니다.
옵션 설명
helm install cilium cilium/cilium cilium이라는 이름으로 Helm 차트를 설치하고, Cilium 차트를 사용합니다.
--version 1.16.3 Cilium의 버전을 1.16.3으로 설치합니다.
--namespace kube-system Cilium을 kube-system 네임스페이스에 설치합니다.
--set k8sServiceHost=192.168.10.10 Kubernetes API 서버의 IP 주소를 192.168.10.10으로 설정합니다.
--set k8sServicePort=6443 Kubernetes API 서버의 포트를 6443으로 설정합니다.
--set debug.enabled=true 디버그 모드를 활성화하여 상세한 로그를 출력합니다.
--set rollOutCiliumPods=true 기존 Cilium 파드를 자동으로 롤링 업데이트하여 재시작합니다.
--set routingMode=native Cilium의 네이티브 라우팅 모드를 사용하여 직접 패킷을 라우팅합니다.
--set autoDirectNodeRoutes=true 노드 간 자동으로 직접 라우팅을 설정하여 성능을 향상시킵니다.
--set bpf.masquerade=true eBPF를 사용하여 NAT(Masquerade) 기능을 처리합니다.
--set bpf.hostRouting=true eBPF 기반의 호스트 라우팅을 활성화하여 호스트 네트워크 트래픽을 처리합니다.
--set endpointRoutes.enabled=true 각 파드에 고유한 라우팅 경로를 설정하여 세밀한 트래픽 제어가 가능합니다.
--set ipam.mode=kubernetes Kubernetes의 IP 주소 관리(IPAM)를 사용합니다.
--set k8s.requireIPv4PodCIDR=true Kubernetes 클러스터에서 IPv4 CIDR 사용을 요구합니다.
--set kubeProxyReplacement=true Cilium이 kube-proxy를 대체하여 eBPF 기반의 서비스 라우팅 및 로드 밸런싱을 처리합니다.
--set ipv4NativeRoutingCIDR=192.168.0.0/16 IPv4 네이티브 라우팅을 위한 CIDR 블록을 192.168.0.0/16으로 지정합니다.
--set installNoConntrackIptablesRules=true Cilium이 iptables의 Conntrack 규칙을 설치하지 않도록 설정합니다.
--set hubble.ui.enabled=true Hubble UI(웹 기반 네트워크 모니터링 도구)를 활성화합니다.
--set hubble.relay.enabled=true Hubble Relay를 활성화하여 여러 Hubble 에이전트의 데이터를 수집할 수 있습니다.
--set prometheus.enabled=true Prometheus를 활성화하여 Cilium의 메트릭을 수집합니다.
--set operator.prometheus.enabled=true Cilium Operator에서 Prometheus 메트릭을 활성화합니다.
--set hubble.metrics.enableOpenMetrics=true OpenMetrics 표준을 사용하여 Prometheus 호환 메트릭을 수집합니다.
--set hubble.metrics.enabled="{...}" Hubble에서 DNS, TCP, ICMP, HTTP 등 다양한 네트워크 메트릭 수집을 활성화합니다.
--set operator.replicas=1 Cilium Operator의 복제본 수를 1개로 설정하여 리소스를 절약합니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# helm install cilium cilium/cilium --version 1.16.3 --namespace kube-system \
--set k8sServiceHost=192.168.10.10 --set k8sServicePort=6443 --set debug.enabled=true \
--set rollOutCiliumPods=true --set routingMode=native --set autoDirectNodeRoutes=true \
--set bpf.masquerade=true --set bpf.hostRouting=true --set endpointRoutes.enabled=true \
--set ipam.mode=kubernetes --set k8s.requireIPv4PodCIDR=true --set kubeProxyReplacement=true \
--set ipv4NativeRoutingCIDR=192.168.0.0/16 --set installNoConntrackIptablesRules=true \
--set hubble.ui.enabled=true --set hubble.relay.enabled=true --set prometheus.enabled=true --set operator.prometheus.enabled=true --set hubble.metrics.enableOpenMetrics=true \
--set hubble.metrics.enabled="{dns:query;ignoreAAAA,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 operator.replicas=1
NAME: cilium
LAST DEPLOYED: Mon Oct 21 19:12:22 2024
NAMESPACE: kube-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
You have successfully installed Cilium with Hubble Relay and Hubble UI.

Your release version is 1.16.3.

For any further help, visit https://docs.cilium.io/en/v1.16/gettinghelp

  • ens5: 실제 네트워크와 연결된 인터페이스로, IP 주소 192.168.10.10을 사용하고 있습니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# ip -c addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
    link/ether 02:ca:b4:99:6a:93 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    inet 192.168.10.10/24 metric 100 brd 192.168.10.255 scope global dynamic ens5
       valid_lft 2658sec preferred_lft 2658sec
    inet6 fe80::ca:b4ff:fe99:6a93/64 scope link
       valid_lft forever preferred_lft forever

  • cilium-envoy Pods:
    • 각 cilium-envoy Pod는 Cilium이 관리하는 네트워크 내에서 실행됩니다.
    • 이들은 Cilium의 정책을 적용하여 서비스 간의 L7 트래픽을 처리합니다.
    • 각 노드(k8s-w1, k8s-s, k8s-w2)에 배포되어 있으며, 해당 노드에서 실행되는 서비스의 트래픽을 관리합니다.
  • Cilium Pods:
    • Cilium의 다른 구성 요소는 네트워크 정책, 패킷 처리 및 클러스터 상태를 관리합니다.
    • cilium-hknxr, cilium-mvngg, cilium-operator, cilium-vrsv6 등은 Cilium의 기능을 지원하는 데 필요한 데이터 플레인과 제어 플레인 구성 요소입니다.
NAME 기능 설명
pod/cilium-envoy-8452p Cilium의 Envoy 프록시로, 서비스 메쉬 기능을 제공하며, L7 트래픽 관리를 담당합니다.
pod/cilium-envoy-fmnzd Cilium의 Envoy 프록시로, 다른 Pod와의 통신을 위한 L7 트래픽 관리를 수행합니다.
pod/cilium-envoy-kr9pf Cilium의 Envoy 프록시로, 외부와의 통신을 처리하며 서비스 메시 역할을 합니다.
pod/cilium-hknxr Cilium의 네트워킹 기능을 담당하는 데이터 플레인 구성 요소로, 패킷 처리를 수행합니다.
pod/cilium-mvngg Cilium의 네트워크 정책을 적용하고 관리하는 역할을 하는 구성 요소입니다.
pod/cilium-operator-76bb588dbc-rwflv Cilium의 운영자 Pod로, Cilium의 상태를 모니터링하고 관리하는 역할을 합니다.
pod/cilium-vrsv6 Cilium의 가상 라우팅 및 서브넷 관리를 위한 구성 요소로, 네트워크 트래픽 라우팅을 최적화합니다.
pod/hubble-relay-88f7f89d4-jgwk2 Hubble의 데이터 수집 및 전달을 담당하는 구성 요소로, 네트워크 트래픽 모니터링에 사용됩니다.
pod/hubble-ui-59bb4cb67b-vr67b Hubble의 웹 UI로, 네트워크 트래픽 데이터를 시각적으로 표시하고 모니터링 기능을 제공합니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# kubectl get node,pod,svc -A -o wide
NAME          STATUS   ROLES           AGE   VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION   CONTAINER-RUNTIME
node/k8s-s    Ready    control-plane   14m   v1.30.5   192.168.10.10    <none>        Ubuntu 22.04.5 LTS   6.8.0-1015-aws   containerd://1.7.22
node/k8s-w1   Ready    <none>          14m   v1.30.5   192.168.10.101   <none>        Ubuntu 22.04.5 LTS   6.8.0-1015-aws   containerd://1.7.22
node/k8s-w2   Ready    <none>          14m   v1.30.5   192.168.10.102   <none>        Ubuntu 22.04.5 LTS   6.8.0-1015-aws   containerd://1.7.22

NAMESPACE     NAME                                   READY   STATUS    RESTARTS   AGE   IP               NODE     NOMINATED NODE   READINESS GATES
kube-system   pod/cilium-envoy-8452p                 1/1     Running   0          67s   192.168.10.101   k8s-w1   <none>           <none>
kube-system   pod/cilium-envoy-fmnzd                 1/1     Running   0          67s   192.168.10.10    k8s-s    <none>           <none>
kube-system   pod/cilium-envoy-kr9pf                 1/1     Running   0          67s   192.168.10.102   k8s-w2   <none>           <none>
kube-system   pod/cilium-hknxr                       1/1     Running   0          67s   192.168.10.101   k8s-w1   <none>           <none>
kube-system   pod/cilium-mvngg                       1/1     Running   0          67s   192.168.10.10    k8s-s    <none>           <none>
kube-system   pod/cilium-operator-76bb588dbc-rwflv   1/1     Running   0          67s   192.168.10.102   k8s-w2   <none>           <none>
kube-system   pod/cilium-vrsv6                       1/1     Running   0          67s   192.168.10.102   k8s-w2   <none>           <none>
kube-system   pod/coredns-55cb58b774-2xvk2           1/1     Running   0          14m   172.16.1.210     k8s-w1   <none>           <none>
kube-system   pod/coredns-55cb58b774-7v788           1/1     Running   0          14m   172.16.1.221     k8s-w1   <none>           <none>
kube-system   pod/etcd-k8s-s                         1/1     Running   0          14m   192.168.10.10    k8s-s    <none>           <none>
kube-system   pod/hubble-relay-88f7f89d4-jgwk2       0/1     Running   0          67s   172.16.1.78      k8s-w1   <none>           <none>
kube-system   pod/hubble-ui-59bb4cb67b-vr67b         2/2     Running   0          67s   172.16.1.79      k8s-w1   <none>           <none>
kube-system   pod/kube-apiserver-k8s-s               1/1     Running   0          14m   192.168.10.10    k8s-s    <none>           <none>
kube-system   pod/kube-controller-manager-k8s-s      1/1     Running   0          14m   192.168.10.10    k8s-s    <none>           <none>
kube-system   pod/kube-scheduler-k8s-s               1/1     Running   0          14m   192.168.10.10    k8s-s    <none>           <none>

NAMESPACE     NAME                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                  AGE   SELECTOR
default       service/kubernetes       ClusterIP   10.10.0.1       <none>        443/TCP                  14m   <none>
kube-system   service/cilium-envoy     ClusterIP   None            <none>        9964/TCP                 67s   k8s-app=cilium-envoy
kube-system   service/hubble-metrics   ClusterIP   None            <none>        9965/TCP                 67s   k8s-app=cilium
kube-system   service/hubble-peer      ClusterIP   10.10.92.90     <none>        443/TCP                  67s   k8s-app=cilium
kube-system   service/hubble-relay     ClusterIP   10.10.203.229   <none>        80/TCP                   67s   k8s-app=hubble-relay
kube-system   service/hubble-ui        ClusterIP   10.10.201.143   <none>        80/TCP                   67s   k8s-app=hubble-ui
kube-system   service/kube-dns         ClusterIP   10.10.0.10      <none>        53/UDP,53/TCP,9153/TCP   14m   k8s-app=kube-dns

🧿 NAT 테이블 구조

  • PREROUTING: 들어오는 패킷에 대해 NAT 변환을 적용합니다. 패킷이 라우팅 되기 전에 처리됩니다.
  • INPUT: 로컬 프로세스가 수신한 패킷에 대한 규칙입니다.
  • OUTPUT: 로컬 프로세스가 생성한 패킷에 대한 규칙입니다.
  • POSTROUTING: 패킷이 송신될 때 NAT 변환을 적용합니다. 이 체인은 라우터가 패킷을 보내기 전에 처리됩니다.

 

-P PREROUTING ACCEPT PREROUTING 체인의 기본 정책을 ACCEPT로 설정합니다. 즉, 이 체인을 통과하는 패킷은 기본적으로 허용됩니다.
-P INPUT ACCEPT INPUT 체인의 기본 정책을 ACCEPT로 설정합니다. 즉, 이 체인을 통과하는 패킷은 기본적으로 허용됩니다.
-P OUTPUT ACCEPT OUTPUT 체인의 기본 정책을 ACCEPT로 설정합니다. 즉, 이 체인을 통과하는 패킷은 기본적으로 허용됩니다.
-P POSTROUTING ACCEPT POSTROUTING 체인의 기본 정책을 ACCEPT로 설정합니다. 즉, 이 체인을 통과하는 패킷은 기본적으로 허용됩니다.
-N CILIUM_OUTPUT_nat 새로운 체인(CILIUM_OUTPUT_nat)을 생성합니다. 이 체인은 Cilium에 의해 관리되는 NAT 규칙을 포함합니다.
-N CILIUM_POST_nat 새로운 체인(CILIUM_POST_nat)을 생성합니다. 이 체인은 Cilium에 의해 관리되는 POSTROUTING NAT 규칙을 포함합니다.
-N CILIUM_PRE_nat 새로운 체인(CILIUM_PRE_nat)을 생성합니다. 이 체인은 Cilium에 의해 관리되는 PREROUTING NAT 규칙을 포함합니다.
-A PREROUTING -m comment --comment "cilium-feeder: CILIUM_PRE_nat" -j CILIUM_PRE_nat PREROUTING 체인에 대한 규칙을 추가하여 CILIUM_PRE_nat 체인으로 패킷을 전달합니다. 이 패킷은 Cilium의 NAT 처리를 위해 지정됩니다.
-A OUTPUT -m comment --comment "cilium-feeder: CILIUM_OUTPUT_nat" -j CILIUM_OUTPUT_nat OUTPUT 체인에 대한 규칙을 추가하여 CILIUM_OUTPUT_nat 체인으로 패킷을 전달합니다. Cilium의 NAT 처리를 위해 지정됩니다.
-A POSTROUTING -m comment --comment "cilium-feeder: CILIUM_POST_nat" -j CILIUM_POST_nat POSTROUTING 체인에 대한 규칙을 추가하여 CILIUM_POST_nat 체인으로 패킷을 전달합니다. Cilium의 NAT 처리를 위해 지정됩니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# iptables -t nat -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-N CILIUM_OUTPUT_nat
-N CILIUM_POST_nat
-N CILIUM_PRE_nat
-N KUBE-KUBELET-CANARY
-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

  • filter 테이블의 현재 규칙을 나열한 것입니다. 이 규칙들은 패킷 필터링을 위한 것입니다. 
-P INPUT ACCEPT INPUT 체인의 기본 정책을 ACCEPT로 설정 (받는 모든 패킷을 허용).
-P FORWARD ACCEPT FORWARD 체인의 기본 정책을 ACCEPT로 설정 (포워딩되는 모든 패킷을 허용).
-P OUTPUT ACCEPT OUTPUT 체인의 기본 정책을 ACCEPT로 설정 (보내는 모든 패킷을 허용).
-N CILIUM_FORWARD CILIUM_FORWARD라는 새로운 체인 생성.
-N CILIUM_INPUT CILIUM_INPUT라는 새로운 체인 생성.
-N CILIUM_OUTPUT CILIUM_OUTPUT라는 새로운 체인 생성.
-N KUBE-FIREWALL KUBE-FIREWALL라는 새로운 체인 생성.
-N KUBE-KUBELET-CANARY KUBE-KUBELET-CANARY라는 새로운 체인 생성.
-A INPUT -m comment --comment "cilium-feeder: CILIUM_INPUT" -j CILIUM_INPUT INPUT 체인에 CILIUM_INPUT 체인으로 패킷을 전달하는 규칙 추가.
-A INPUT -j KUBE-FIREWALL INPUT 체인에서 KUBE-FIREWALL 체인으로 패킷을 전달하는 규칙 추가.
-A FORWARD -m comment --comment "cilium-feeder: CILIUM_FORWARD" -j CILIUM_FORWARD FORWARD 체인에서 CILIUM_FORWARD 체인으로 패킷을 전달하는 규칙 추가.
-A OUTPUT -m comment --comment "cilium-feeder: CILIUM_OUTPUT" -j CILIUM_OUTPUT OUTPUT 체인에서 CILIUM_OUTPUT 체인으로 패킷을 전달하는 규칙 추가.
-A OUTPUT -j KUBE-FIREWALL OUTPUT 체인에서 KUBE-FIREWALL 체인으로 패킷을 전달하는 규칙 추가.
-A CILIUM_FORWARD -o cilium_host -m comment --comment "cilium: any->cluster on cilium_host forward accept" -j ACCEPT cilium_host 인터페이스에서 클러스터로 가는 모든 패킷 허용.
-A CILIUM_FORWARD -i cilium_host -m comment --comment "cilium: cluster->any on cilium_host forward accept (nodeport)" -j ACCEPT 클러스터에서 cilium_host 인터페이스로 가는 모든 패킷 허용 (NodePort 서비스용).
-A CILIUM_FORWARD -i lxc+ -m comment --comment "cilium: cluster->any on lxc+ forward accept" -j ACCEPT lxc+ 인터페이스에서 클러스터로 가는 모든 패킷 허용.
-A CILIUM_FORWARD -i cilium_net -m comment --comment "cilium: cluster->any on cilium_net forward accept (nodeport)" -j ACCEPT cilium_net 인터페이스에서 클러스터로 가는 모든 패킷 허용 (NodePort 서비스용).
-A CILIUM_FORWARD -o lxc+ -m comment --comment "cilium: any->cluster on lxc+ forward accept" -j ACCEPT lxc+ 인터페이스로 가는 모든 패킷 허용.
-A CILIUM_FORWARD -i lxc+ -m comment --comment "cilium: cluster->any on lxc+ forward accept (nodeport)" -j ACCEPT lxc+ 인터페이스에서 클러스터로 가는 모든 패킷 허용 (NodePort 서비스용).
-A CILIUM_INPUT -m comment --comment "cilium: ACCEPT for proxy traffic" -j ACCEPT CILIUM_INPUT 체인에서 프록시 트래픽을 허용하는 규칙 추가.
-A CILIUM_OUTPUT -m comment --comment "cilium: ACCEPT for proxy traffic" -j ACCEPT CILIUM_OUTPUT 체인에서 프록시 트래픽을 허용하는 규칙 추가.
-A CILIUM_OUTPUT -m comment --comment "cilium: ACCEPT for l7 proxy upstream traffic" -j ACCEPT L7 프록시의 업스트림 트래픽을 허용하는 규칙 추가.
-A CILIUM_OUTPUT -m comment --comment "cilium: host->any mark as from host" -j MARK --set-xmark 0xc00/0xf00 호스트에서 나가는 패킷을 표시하여, 호스트에서 나오는 트래픽으로 마크함.
-A KUBE-FIREWALL ! -s 127.0.0.0/8 -d 127.0.0.0/8 -m comment --comment "block incoming localnet connections" -m conntrack ! --ctstate RELATED,ESTABLISHED,DNAT -j DROP 로컬 네트워크(127.0.0.0/8)와의 연결을 차단하는 규칙 추가.
(⎈|CiliumLab:N/A) root@k8s-s:~# iptables -t filter -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N CILIUM_FORWARD
-N CILIUM_INPUT
-N CILIUM_OUTPUT
-N KUBE-FIREWALL
-N KUBE-KUBELET-CANARY
-A INPUT -m comment --comment "cilium-feeder: CILIUM_INPUT" -j CILIUM_INPUT
-A INPUT -j KUBE-FIREWALL
-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 OUTPUT -j KUBE-FIREWALL
-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
-A KUBE-FIREWALL ! -s 127.0.0.0/8 -d 127.0.0.0/8 -m comment --comment "block incoming localnet connections" -m conntrack ! --ctstate RELATED,ESTABLISHED,DNAT -j DROP

 

  • Kubernetes 클러스터에서 Cilium 관련 Custom Resource Definitions (CRDs) 의 목록
ciliumcidrgroups.cilium.io CIDR(범위) 그룹을 정의하여 네트워크 정책에서 IP 주소의 범위를 관리할 수 있습니다.
ciliumclusterwidenetworkpolicies.cilium.io 클러스터 전체에 적용되는 네트워크 정책을 정의합니다. 이 정책은 클러스터 내 모든 Pod에 적용됩니다.
ciliumendpoints.cilium.io Cilium이 관리하는 엔드포인트(예: Pod, 서비스)의 정보를 포함합니다.
ciliumexternalworkloads.cilium.io Kubernetes 클러스터 외부의 워크로드(예: VM 또는 다른 클러스터)를 관리합니다.
ciliumidentities.cilium.io Cilium에서 사용되는 네트워크 정책과 관련된 정체성을 관리합니다. Pod의 레이블이나 속성을 기반으로 합니다.
ciliuml2announcementpolicies.cilium.io L2 브로드캐스트 네트워크에서 사용되는 정책을 정의합니다.
ciliumloadbalancerippools.cilium.io Cilium에서 사용되는 로드 밸런서의 IP 풀을 정의합니다.
ciliumnetworkpolicies.cilium.io Cilium의 네트워크 정책을 정의하여, 어떤 트래픽이 허용되거나 차단되는지를 제어합니다.
ciliumnodeconfigs.cilium.io Cilium 노드의 설정을 정의합니다.
ciliumnodes.cilium.io Cilium에서 관리하는 노드의 정보를 포함합니다.
ciliumpodippools.cilium.io Pod에 할당되는 IP 주소 풀을 관리합니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# kubectl get crd
NAME                                         CREATED AT
ciliumcidrgroups.cilium.io                   2024-10-21T10:12:55Z
ciliumclusterwidenetworkpolicies.cilium.io   2024-10-21T10:12:56Z
ciliumendpoints.cilium.io                    2024-10-21T10:12:55Z
ciliumexternalworkloads.cilium.io            2024-10-21T10:12:55Z
ciliumidentities.cilium.io                   2024-10-21T10:12:55Z
ciliuml2announcementpolicies.cilium.io       2024-10-21T10:12:55Z
ciliumloadbalancerippools.cilium.io          2024-10-21T10:12:55Z
ciliumnetworkpolicies.cilium.io              2024-10-21T10:12:56Z
ciliumnodeconfigs.cilium.io                  2024-10-21T10:12:55Z
ciliumnodes.cilium.io                        2024-10-21T10:12:55Z
ciliumpodippools.cilium.io                   2024-10-21T10:12:55Z

  • Kubernetes 클러스터 내에서 Cilium이 관리하는 노드에 대한 정보
CILIUMINTERNALIP Cilium에서 사용되는 내부 IP 주소입니다. Cilium이 네트워크 기능을 제공하기 위해 각 노드에 할당한 IP 주소입니다.
INTERNALIP 노드의 실제 내부 IP 주소입니다. Kubernetes에서 사용되는 기본 IP 주소로, 주로 Pod와 통신에 사용됩니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# kubectl get ciliumnodes
NAME     CILIUMINTERNALIP   INTERNALIP       AGE
k8s-s    172.16.0.12        192.168.10.10    113s
k8s-w1   172.16.1.198       192.168.10.101   113s
k8s-w2   172.16.2.116       192.168.10.102   105s

 

  • Kubernetes 클러스터 내의 모든 네임스페이스에서 Cilium Endpoints에 대한 정보
SECURITY IDENTITY Cilium이 해당 Endpoint에 할당한 보안 식별자입니다. 이는 정책 적용 및 트래픽 필터링에 사용됩니다.
ENDPOINT STATE Endpoint의 현재 상태를 나타냅니다. ready는 Endpoint가 정상적으로 준비되었음을 의미합니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# kubectl get ciliumendpoints -A
NAMESPACE     NAME                           SECURITY IDENTITY   ENDPOINT STATE   IPV4           IPV6
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

  • 네트워크 인터페이스 카드(NIC) ens5에 대한 정보
driver 네트워크 인터페이스 카드에 사용되는 드라이버의 이름입니다. 여기서는 ena라는 드라이버가 사용되고 있습니다. ena는 AWS에서 제공하는 Elastic Network Adapter를 위한 드라이버입니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# ethtool -i ens5
driver: ena
version: 6.8.0-1015-aws
firmware-version:
expansion-rom-version:
bus-info: 0000:00:05.0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: no
supports-priv-flags: no

  • installNoConntrackIptablesRules=true:
    • 이 설정은 Cilium이 conntrack 관련 iptables 규칙을 설치하지 않도록 지시합니다.
    • 기본적으로 Cilium은 네트워크 연결을 추적하기 위해 conntrack을 사용할 수 있습니다. 하지만 이 설정을 사용하면, Cilium이 conntrack을 사용하지 않게 되어 iptables 규칙이 설치되지 않습니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# helm upgrade cilium cilium/cilium --namespace kube-system --reuse-values --set installNoConntrackIptablesRules=true
Release "cilium" has been upgraded. Happy Helming!
NAME: cilium
LAST DEPLOYED: Mon Oct 21 19:16:37 2024
NAMESPACE: kube-system
STATUS: deployed
REVISION: 2
TEST SUITE: None
NOTES:
You have successfully installed Cilium with Hubble Relay and Hubble UI.

Your release version is 1.16.3.

For any further help, visit https://docs.cilium.io/en/v1.16/gettinghelp

  • notrack 규칙을 통해 Cilium은 특정 네트워크 패킷에 대해 연결 추적을 하지 않도록 구성
-A CILIUM_OUTPUT_raw - CILIUM_OUTPUT_raw 체인에 규칙 추가. Cilium이 패킷을 처리하는 데 사용됨.
-d 192.168.0.0/16 - 목적지 IP가 192.168.0.0/16인 패킷을 위한 규칙. Kubernetes 내의 Pod들이 사용하는 IP 범위.
-s 192.168.0.0/16 - 출발지 IP가 192.168.0.0/16인 패킷을 위한 규칙.
-m comment --comment "cilium: NOTRACK for pod traffic" - 규칙에 대한 주석 추가. "cilium: NOTRACK for pod traffic"라는 설명이 붙어 있음.
-j CT --notrack - 이 규칙이 적용되는 패킷에 대해 conntrack(연결 추적)을 하지 않겠다는 의미. 성능 향상에 기여.

성능 개선 - NOTRACK을 사용하면 Cilium이 패킷의 연결 상태를 추적하지 않으므로, 리소스를 절약할 수 있음.
네트워크 단순화 - conntrack을 사용하지 않음으로써, 네트워크 정책과 규칙이 더 간단해질 수 있음. Cilium의 eBPF 기능과 함께 사용될 때 더욱 효과적임.
(⎈|CiliumLab:N/A) root@k8s-s:~# iptables -t raw -S | grep notrack
-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
...

  • 리눅스 시스템에서 활성화된 모든 연결 추적 정보를 삭제
(⎈|CiliumLab:N/A) root@k8s-s:~# conntrack -F
conntrack v1.4.6 (conntrack-tools): connection tracking table has been emptied.

Cilium CLI 설치

CILIUM_CLI_VERSION=$(curl -s https://...) 최신 Cilium CLI 버전을 가져와 변수에 저장
CLI_ARCH=amd64 기본 CLI 아키텍처를 amd64로 설정
if [ "$(uname -m)" = "aarch64" ]; then CLI_ARCH=arm64; fi 아키텍처에 따라 CLI_ARCH를 arm64로 변경
curl -L --fail --remote-name-all https://... Cilium CLI 바이너리와 해시 파일 다운로드
sha256sum --check cilium-linux-${CLI_ARCH}.tar.gz.sha256sum 다운로드한 파일의 무결성을 확인
sudo tar xzvfC cilium-linux-${CLI_ARCH}.tar.gz /usr/local/bin Cilium CLI 파일을 /usr/local/bin에 추출
rm cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum} 다운로드한 파일 삭제
(⎈|CiliumLab:N/A) root@k8s-s:~# CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)
(⎈|CiliumLab:N/A) root@k8s-s:~# CLI_ARCH=amd64
(⎈|CiliumLab:N/A) root@k8s-s:~# if [ "$(uname -m)" = "aarch64" ]; then CLI_ARCH=arm64; fi
(⎈|CiliumLab:N/A) root@k8s-s:~# curl -L --fail --remote-name-all https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100 46.8M  100 46.8M    0     0  18.3M      0  0:00:02  0:00:02 --:--:-- 23.3M
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100    92  100    92    0     0     74      0  0:00:01  0:00:01 --:--:--     0
(⎈|CiliumLab:N/A) root@k8s-s:~# sha256sum --check cilium-linux-${CLI_ARCH}.tar.gz.sha256sum
cilium-linux-amd64.tar.gz: OK
(⎈|CiliumLab:N/A) root@k8s-s:~# sudo tar xzvfC cilium-linux-${CLI_ARCH}.tar.gz /usr/local/bin
cilium
(⎈|CiliumLab:N/A) root@k8s-s:~# rm cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}

  • Cilium: 네트워크 정책과 보안을 담당하는 Cilium이 정상적으로 작동하고 있음을 나타냅니다.
  • Operator: Cilium을 관리하는 Operator가 정상입니다.
  • Envoy DaemonSet: Envoy 프록시가 정상적으로 작동하고 있습니다.
  • Hubble Relay: Hubble Relay가 정상 작동 중입니다.
  • ClusterMesh: 클러스터 간 연결을 위한 ClusterMesh가 비활성화 상태입니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# cilium status --wait
    /¯¯\
 /¯¯\__/¯¯\    Cilium:             OK
 \__/¯¯\__/    Operator:           OK
 /¯¯\__/¯¯\    Envoy DaemonSet:    OK
 \__/¯¯\__/    Hubble Relay:       OK
    \__/       ClusterMesh:        disabled

DaemonSet              cilium             Desired: 3, Ready: 3/3, Available: 3/3
DaemonSet              cilium-envoy       Desired: 3, Ready: 3/3, Available: 3/3
Deployment             cilium-operator    Desired: 1, Ready: 1/1, Available: 1/1
Deployment             hubble-relay       Desired: 1, Ready: 1/1, Available: 1/1
Deployment             hubble-ui          Desired: 1, Ready: 1/1, Available: 1/1
Containers:            cilium             Running: 3
                       cilium-envoy       Running: 3
                       cilium-operator    Running: 1
                       hubble-relay       Running: 1
                       hubble-ui          Running: 1
Cluster Pods:          4/4 managed by Cilium
Helm chart version:    1.16.3
Image versions         cilium             quay.io/cilium/cilium:v1.16.3@sha256:62d2a09bbef840a46099ac4c69421c90f84f28d018d479749049011329aa7f28: 3
                       cilium-envoy       quay.io/cilium/cilium-envoy:v1.29.9-1728346947-0d05e48bfbb8c4737ec40d5781d970a550ed2bbd@sha256:42614a44e508f70d03a04470df5f61e3cffd22462471a0be0544cf116f2c50ba: 3
                       cilium-operator    quay.io/cilium/operator-generic:v1.16.3@sha256:6e2925ef47a1c76e183c48f95d4ce0d34a1e5e848252f910476c3e11ce1ec94b: 1
                       hubble-relay       quay.io/cilium/hubble-relay:v1.16.3@sha256:feb60efd767e0e7863a94689f4a8db56a0acc7c1d2b307dee66422e3dc25a089: 1
                       hubble-ui          quay.io/cilium/hubble-ui-backend:v0.13.1@sha256:0e0eed917653441fded4e7cdb096b7be6a3bddded5a2dd10812a27b1fc6ed95b: 1
                       hubble-ui          quay.io/cilium/hubble-ui:v0.13.1@sha256:e2e9313eb7caf64b0061d9da0efbdad59c6c461f6ca1752768942bfeda0796c6: 1

  • Cilium 에이전트가 실행 중인 특정 노드(k8s-s)의 파드 이름을 CILIUMPOD0라는 환경 변수에 저장합니다.
  • c0라는 간단한 명령어를 만들어, Cilium 에이전트가 실행 중인 파드에서 Cilium CLI를 실행할 수 있도록 합니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# export CILIUMPOD0=$(kubectl get -l k8s-app=cilium pods -n kube-system --field-selector spec.nodeName=k8s-s  -o jsonpath='{.items[0].metadata.name}')
(⎈|CiliumLab:N/A) root@k8s-s:~# alias c0="kubectl exec -it $CILIUMPOD0 -n kube-system -c cilium-agent -- cilium"

🧿 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: 2/254 allocated from 172.16.0.0/24,
Allocated addresses:
  172.16.0.12 (router)
  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   [ens5]   192.168.0.0/16 [IPv4: Enabled, IPv6: Disabled]
Clock Source for BPF:   ktime
Controller Status:      19/19 healthy
  Name                                  Last success   Last error   Count   Message
  cilium-health-ep                      12s ago        never        0       no error
  ct-map-pressure                       21s ago        never        0       no error
  daemon-validate-config                12s ago        never        0       no error
  dns-garbage-collector-job             23s ago        never        0       no error
  endpoint-11-regeneration-recovery     never          never        0       no error
  endpoint-1541-regeneration-recovery   never          never        0       no error
  endpoint-gc                           4m23s ago      never        0       no error
  ep-bpf-prog-watchdog                  21s ago        never        0       no error
  ipcache-inject-labels                 22s ago        never        0       no error
  k8s-heartbeat                         23s ago        never        0       no error
  link-cache                            6s ago         never        0       no error
  node-neighbor-link-updater            1s ago         never        0       no error
  resolve-identity-11                   4m20s ago      never        0       no error
  resolve-identity-1541                 4m21s ago      never        0       no error
  sync-lb-maps-with-k8s-services        9m21s ago      never        0       no error
  sync-policymap-11                     9m12s ago      never        0       no error
  sync-policymap-1541                   9m18s ago      never        0       no error
  sync-utime                            22s ago        never        0       no error
  write-cni-file                        9m23s 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: 779/4095 (19.02%), Flows/s: 1.34   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
BPF Maps:   dynamic sizing: on (ratio: 0.002500)
...

  • KubeProxyReplacement: Cilium이 Kubernetes의 Kube-Proxy를 대체하고 있으며, 이는 Cilium의 BPF 기능을 통해 고성능의 네트워킹을 가능하게 합니다.
  • Direct Routing: Cilium은 패킷을 직접 라우팅함으로써 더 나은 성능을 제공하며, BPF를 통해 네트워크 트래픽을 더욱 효율적으로 처리할 수 있습니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# c0 status | grep KubeProxyReplacement
KubeProxyReplacement:    True   [ens5   192.168.10.10 fe80::ca:b4ff:fe99:6a93 (Direct Routing)]

  • BPF Masquerading: BPF를 활용하여 패킷의 소스 IP 주소를 변환하여 클러스터 내부의 IP 주소를 숨깁니다. 이를 통해 외부에서 접근할 때 내부 네트워크 구조를 보호할 수 있습니다.
  • IPv4 Masquerading: IPv4 주소에 대해 NAT를 적용하여 클러스터 외부와의 통신 시 보안성을 높이고, 내부 IP 주소를 외부에 노출하지 않도록 합니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# cilium config view | egrep 'enable-ipv4-masquerade|enable-bpf-masquerade'
enable-bpf-masquerade                             true
enable-ipv4-masquerade                            true

  • Masquerading: BPF 기술을 사용하여 패킷의 소스 IP 주소를 변경하여 외부 네트워크와의 통신에서 내부 IP 주소를 숨깁니다. 이를 통해 보안성을 높이고, 네트워크 트래픽을 더 안전하게 관리할 수 있습니다.
  • Interface: ens5 인터페이스에서 Masquerading 기능이 활성화되어 있으며, 이 인터페이스를 통해 외부와 통신합니다.
  • IP Range: 192.168.0.0/16는 Masquerading이 적용되는 IP 주소 범위를 나타냅니다. 이 범위 내의 IP 주소는 외부와의 통신 시 변환됩니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# c0 status --verbose | grep Masquerading
Masquerading:           BPF   [ens5]   192.168.0.0/16 [IPv4: Enabled, IPv6: Disabled]

  • IP Masquerade Agent 설정:
    • --set ipMasqAgent.enabled=true는 IP Masquerade Agent를 활성화하는 설정입니다. 이 에이전트는 Cilium이 NAT(Network Address Translation)을 사용하여 트래픽의 소스 IP를 변경하도록 도와줍니다. 이 설정을 활성화하면 외부에서 들어오는 트래픽이 내부 IP를 노출하지 않도록 합니다.
helm upgrade Helm 차트를 업그레이드하는 명령어입니다.
cilium 업그레이드할 릴리스의 이름입니다. 여기서는 Cilium을 의미합니다.
cilium/cilium Helm 차트의 위치를 지정합니다. Cilium의 공식 Helm 차트입니다.
--namespace kube-system Cilium이 설치된 Kubernetes 네임스페이스를 지정합니다.
--reuse-values 이전에 사용한 값들을 재사용하여 업그레이드합니다.
--set ipMasqAgent.enabled=true IP Masquerade Agent를 활성화하기 위해 설정을 변경합니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# helm upgrade cilium cilium/cilium --namespace kube-system --reuse-values --set ipMasqAgent.enabled=true
Release "cilium" has been upgraded. Happy Helming!
NAME: cilium
LAST DEPLOYED: Mon Oct 21 19:25:44 2024
NAMESPACE: kube-system
STATUS: deployed
REVISION: 3
TEST SUITE: None
NOTES:
You have successfully installed Cilium with Hubble Relay and Hubble UI.

Your release version is 1.16.3.

For any further help, visit https://docs.cilium.io/en/v1.16/gettinghelp

enable-bpf-masquerade BPF(Berkeley Packet Filter)를 사용한 IP Masquerading 기능을 활성화합니다.
enable-ip-masq-agent IP Masquerade Agent를 활성화하여 NAT를 통해 트래픽의 소스 IP를 변경하도록 설정합니다.
enable-ipv4-masquerade IPv4에 대한 Masquerading 기능을 활성화합니다.
enable-ipv6-masquerade IPv6에 대한 Masquerading 기능을 활성화합니다.
enable-masquerade-to-route-source 라우트 소스를 masquerading할지 여부를 설정합니다. 현재는 비활성화(false)되어 있습니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# cilium config view | grep -i masq
enable-bpf-masquerade                             true
enable-ip-masq-agent                              true
enable-ipv4-masquerade                            true
enable-ipv6-masquerade                            true
enable-masquerade-to-route-source                 false

  • CILIUMPOD0 변수를 설정하여 특정 노드에서 실행 중인 Cilium Pod의 이름을 저장하고,
  • c0라는 alias를 생성하여 이후에 c0만 입력함으로써 해당 Pod의 cilium-agent 컨테이너에서 cilium 명령어를 쉽게 실행할 수 있도록 합니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# export CILIUMPOD0=$(kubectl get -l k8s-app=cilium pods -n kube-system --field-selector spec.nodeName=k8s-s  -o jsonpath='{.items[0].metadata.name}')
(⎈|CiliumLab:N/A) root@k8s-s:~# alias c0="kubectl exec -it $CILIUMPOD0 -n kube-system -c cilium-agent -- cilium"

Masquerading 네트워크 트래픽의 출발지 IP 주소를 변경하여 클러스터 외부에서 실제 IP 주소를 숨기는 기능.
BPF (ip-masq-agent) - BPF: 패킷 필터링 및 패킷 처리 작업을 수행하는 기술.
- ip-masq-agent: Kubernetes 클러스터 내의 Pod에서 외부로 나가는 트래픽에 대해 IP 마스킹을 관리하는 에이전트.
[ens5] 마스커레이딩을 적용하는 네트워크 인터페이스 이름.
192.168.0.0/16 마스커레이딩이 적용되는 IP 주소 범위. (192.168.0.0부터 192.168.255.255까지)
[IPv4: Enabled] IPv4 마스커레이딩이 활성화됨을 나타냄.
[IPv6: Disabled] IPv6 마스커레이딩이 비활성화됨을 나타냄.
(⎈|CiliumLab:N/A) root@k8s-s:~# c0 status --verbose | grep Masquerading
Masquerading:           BPF (ip-masq-agent)   [ens5]   192.168.0.0/16 [IPv4: Enabled, IPv6: Disabled]

  • enable-ip-masq-agent: 이 설정이 true로 되어 있을 경우, Cilium은 IP 마스커레이딩 기능을 제공하는 ip-masq-agent를 활성화하여, 클러스터 내의 Pod들이 외부 네트워크에 접근할 때 출발지 IP 주소를 마스킹할 수 있도록 지원합니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# kubectl get cm -n kube-system cilium-config -o yaml  | grep ip-masq
  enable-ip-masq-agent: "true"
Comments