🛠 Cilium как Container Network Interface k8s
Салют,
Сегодн я хочу поделиться с тобой описанием, относительно CNI контролей под Kubernetes. Мы посмотрим на CNI плагин Cilium. Но мы рассмотрим его в большей степени со стороны технички.
Служит для обеспечения сетевой связности, безопасности и наблюдаемости между рабочими нагрузками, как подами в Kubernetes. Работает на уровне ОС. Cilium использует eBPF для гибкого и эффективного управления сетевым трафиком и политиками безопасности путем настройки сети пода через eBPF-программы в ядре хоста. Тип лицензии: Open-source Apache 2.0.
Особенности:
- Сетевые возможности: CNI, LoadBalancer как CiliumClusterMesh
- Политики безопасности на основе identity-aware, шифрование трафика, защита от DDoS, фильтрация DNS, соответствие FIPS
- Может использоваться через minikube или kind для тестирования сетевых политик и поведения
- CiliumNetworkPolicy можно применять как манифесты
- Policy работают на уровне приложений L7 для HTTP, gRPC, Kafka и т.д., а не только на сетевом уровне L3/L4
- CiliumNetworkPolicy сами по себе являются декларативными правилами и можно настроить default-deny режим
Применение
helm repo add cilium https://helm.cilium.io/
# Установка Cilium в кластер Kubernetes
helm install cilium cilium/cilium --version 1.14.4 \
--namespace kube-system \
--set cluster.name=my-cluster \
--set cluster.id=1
Policy & Deploy
deploy_cilium:
stage: deploy
image:
name: alpine/helm:latest
entrypoint: ['']
script:
- helm repo add cilium https://helm.cilium.io/
- helm upgrade --install cilium cilium/cilium
--version 1.14.4
--namespace kube-system
--set cluster.name=${CLUSTER_NAME}
--set cluster.id=1
--set hubble.relay.enabled=true
--set hubble.ui.enabled=true
security_policies:
stage: deploy
image:
name: bitnami/kubectl:latest
entrypoint: ['']
script:
- kubectl apply -f manifests/cilium-network-policies/
dependencies: []
CiliumNetworkPolicy пример
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "l7-rule"
spec:
endpointSelector:
matchLabels:
app: myService
ingress:
- fromEndpoints:
- matchLabels:
app: frontend
toPorts:
- ports:
- port: '80'
protocol: TCP
rules:
http:
- method: "GET" # Разрешить только GET-запросы
path: "/api/v1/data.*" # ко всем путям, начинающимся с /api/v1/data
- method: "POST"
path: "/api/v1/upload" # и конкретно на этот путь
- method: "GET"
path: "/public/.*" # Разрешить доступ к публичным ресурсам
Политика "default-deny" для namespace
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: allow-dns
namespace: production
spec:
endpointSelector: {} # Все pod'ы
egress:
- toEndpoints:
- matchLabels:
k8s-app: kube-dns
toPorts:
- ports:
- port: "53"
protocol: UDP
- port: "53"
protocol: TCP
Итого:
- Cilium полностью заменяет kube-proxy, реализуя балансировку нагрузки на основе eBPF
- Для приложений с REST API или gRPC Cilium позволяет внедрить политику "наименьших привилегий"
- Cluster Mesh позволяет безопасно соединять несколько кластеров Kubernetes,
- Вместо фильтрации по IP-адресам присваивает идентификатор безопасности группам подов с одинаковыми метками, где встраивается в каждый сетевой пакет, что позволяет проверять права связи на узле-получателе, независимо от того, где запущен под
- Расширяет стандартные NetworkPolicy Kubernetes, позволяя описывать правила на основе протоколов HTTP, gRPC и Kafka. Это позволяет разрешать или запрещать конкретные API-вызовы, HTTP-методы (GET, POST) или пути URL
- Может автоматически шифровать весь трафик между подами в кластере или даже между кластерами с использованием IPsec или WireGuard
- Безопасность исходящего трафика может быть реализована через политики, привязанные к DNS-именам
#appsec #toolchain #containersecurity #reco #techsolution #paper
