Cilium
Cilium
一、Cilium
介绍
Cilium
底层是基于Linux
内核的新技术eBPF
,可以在Linux
系统中动态注入强大的安全性、可见性和网络控制逻辑。Cilium
基于eBPF
提供了多集群路由、替代kube-proxy
实现负载均衡、透明加密以及网络和服务安全等诸多功能。- 除了提供传统的网络安全之外,
eBPF
的灵活性还支持应用协议和DNS
请求/响应安全。 - 同时
Cilium
与Envoy
紧密集成,提供了基于Go
的扩展框架。因为eBPF
运行在Linux
内核中,所以应用所有Cilium
功能,无需对应用程序代码或容器配置进行任何更改。
安装环境
主机 | IP |
---|---|
ubuntu | 172.16.94.141 |
软件 | 版本 |
---|---|
docker | 26.1.4 |
helm | v3.15.0-rc.2 |
kind | 0.18.0 |
kubernetes | 1.23.4 |
ubuntu os | Ubuntu 20.04.6 LTS |
kernel | 5.11.5 内核升级文档 |
本次安装以 1.13.0-rc5
的 cilium
为例
cilium
的各种高级特性需要依赖于 linux
内核版本。本试验均采用的 ubuntu20.04 os
内核版本为 5.11.5
,基本能满足试验所有的cilium特性
Cilium Feature | Minimum Kernel Version |
---|---|
Bandwidth Manager | >= 5.1 |
Egress Gateway | >= 5.2 |
VXLAN Tunnel Endpoint (VTEP) Integration | >= 5.2 |
WireGuard Transparent Encryption | >= 5.6 |
Full support for Session Affinity | >= 5.7 |
BPF-based proxy redirection | >= 5.7 |
Socket-level LB bypass in pod netns | >= 5.7 |
L3 devices | >= 5.8 |
BPF-based host routing | >= 5.10 |
IPv6 BIG TCP support | >= 5.19 |
IPv4 BIG TCP support | >= 6.3 |
二、cilium
安装模式介绍
cilium
安装大概可分为3种模式方式
-
cilium-kubeproxy-mode
- 最基础的方案,类似于传统
cni
,使用内核协议栈的方式进行数据包的分发; - 如果内核不支持
cilium
各种特性,仍然还要使用cilium
这个cni
,建议使用此种安装方案
- 最基础的方案,类似于传统
-
cilium-kubeproxy-replacement-mode
- 不使用
kube-proxy
提供service
网络发现和负载均衡,使用ebpf
提供kube-proxy
功能
- 不使用
-
cilium-kubeproxy-replacement-ebpf-mode
-
完全体
ebpf
能力 -
在
Cilium 1.9
中引入了基于eBPF
的Host Routing
,可以完全绕过iptables
和上层主机堆栈,并且与常规的veth
设备操作相比,实现了更快的网络命名空间切换 -
内核弊端:
- 中断处理: 当网络中大量数据包到来时,会频繁产生中断请求,频繁的中断会产生较高的性能开销,并造成上下文的切换产生时延
- 内存拷贝: 网络数据包到来时,网卡通过DMA 等拷贝到内核缓冲区,内核协议栈再从协议空间拷贝到用户态空间,在Linux内核协议栈中,这个耗时操作甚至占到了数据包整个处理流程的57.1%
- 局部性失效: 目前主流处理器都是多个CPU核心的,这意味着一个数据包的处理可能跨多个CPU核心;比如:一个数据包中断可能在cpu0,内核态处理是在cpu1,用户态处理是在cpu2,这样跨多个核心,容易造成CPU缓存失效,造成局部性失效
-
所以
cilium
通过eBFPF
实现了by pass
root内核
,提高了传输效率
三、安装 cilium
a | cilium-kubeproxy-mode
- direct-routing 安装脚本
$ cat install.sh
#!/bin/bash
date
set -v
# 1.prep noCNI env
cat <<EOF | kind create cluster --name=cilium-kubeproxy --image=kindest/node:v1.23.4 --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
# kind 默认使用 rancher cni,cni 我们需要自己创建
disableDefaultCNI: true
#kubeProxyMode: "none" # Enable KubeProxy
nodes:
- role: control-plane
- role: worker
- role: worker
containerdConfigPatches:
- |-
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."harbor.evescn.com"]
endpoint = ["https://harbor.evescn.com"]
EOF
# 2.remove taints
controller_node_ip=`kubectl get node -o wide --no-headers | grep -E "control-plane|bpf1" | awk -F " " '{print $6}'`
kubectl taint nodes $(kubectl get nodes -o name | grep control-plane) node-role.kubernetes.io/master:NoSchedule-
kubectl get nodes -o wide
# 3.install cni
helm repo add cilium https://helm.cilium.io > /dev/null 2>&1
helm repo update > /dev/null 2>&1
# Direct Routing Options(--set tunnel=disabled --set autoDirectNodeRoutes=true --set ipv4NativeRoutingCIDR="10.0.0.0/8")
helm install cilium cilium/cilium \
--set k8sServiceHost=$controller_node_ip \
--set k8sServicePort=6443 \
--version 1.13.0-rc5 \
--namespace kube-system \
--set debug.enabled=true \
--set debug.verbose=datapath \
--set monitorAggregation=none \
--set ipam.mode=cluster-pool \
--set cluster.name=cilium-kubeproxy \
--set tunnel=disabled \
--set autoDirectNodeRoutes=true \
--set ipv4NativeRoutingCIDR="10.0.0.0/8"
# 4.install necessary tools
for i in $(docker ps -a --format "table {{.Names}}" | grep cilium)
do
echo $i
docker cp /usr/bin/ping $i:/usr/bin/ping
docker exec -it $i bash -c "sed -i -e 's/jp.archive.ubuntu.com\|archive.ubuntu.com\|security.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list"
docker exec -it $i bash -c "apt-get -y update >/dev/null && apt-get -y install net-tools tcpdump lrzsz bridge-utils >/dev/null 2>&1"
done
这些参数用于通过 Helm 安装 Cilium 时进行配置,下面是每个参数的详细含义:
--set
参数解释
-
--set k8sServiceHost=$controller_node_ip
- 含义: 设置 Kubernetes API 服务器的主机地址。
$controller_node_ip
是控制节点的 IP 地址。 - 用途: 告诉 Cilium 如何连接到 Kubernetes API 服务器。
- 含义: 设置 Kubernetes API 服务器的主机地址。
-
--set k8sServicePort=6443
- 含义: 设置 Kubernetes API 服务器的端口号,通常是 6443。
- 用途: 与
k8sServiceHost
一起使用,指定 API 服务器的连接端口。
-
--version 1.13.0-rc5
- 含义: 安装指定版本的 Cilium,这里是 1.13.0-rc5(候选版本5)。
- 用途: 确保安装特定版本的 Cilium,以满足兼容性或功能需求。
-
--namespace kube-system
- 含义: 指定在
kube-system
命名空间中安装 Cilium。 - 用途: 确定 Helm chart 应安装到的 Kubernetes 命名空间。
- 含义: 指定在
-
--set debug.enabled=true
- 含义: 启用调试模式。
- 用途: 启用后,Cilium 将提供更多调试信息,有助于故障排除。
-
--set debug.verbose=datapath
- 含义: 设置调试的详细程度,这里指定为数据路径。
- 用途: 提供更详细的关于数据路径的信息,有助于深入分析数据流和故障排除。
-
--set monitorAggregation=none
- 含义: 禁用监控数据的聚合。
- 用途: 禁用后,所有监控数据将被收集,不进行聚合,有助于详细分析和调试。
-
--set ipam.mode=cluster-pool
- 含义: 设置 IP 地址管理模式为
cluster-pool
。 - 用途: 指定 Cilium 使用集群范围内的 IP 池来分配 IP 地址。
- 含义: 设置 IP 地址管理模式为
-
--set cluster.name=cilium-kubeproxy
- 含义: 设置集群的名称为
cilium-kubeproxy
。 - 用途: 为集群命名,便于识别和管理。
- 含义: 设置集群的名称为
-
--set tunnel=disabled
- 含义: 禁用隧道模式。
- 用途: 禁用后,Cilium 将不使用 vxlan 技术,直接在主机之间路由数据包,即 direct-routing 模式。
-
--set autoDirectNodeRoutes=true
- 含义: 启用自动直接节点路由。
- 用途: 使 Cilium 自动设置直接节点路由,优化网络流量。
-
--set ipv4NativeRoutingCIDR="10.0.0.0/8"
- 含义: 指定用于 IPv4 本地路由的 CIDR 范围,这里是
10.0.0.0/8
。 - 用途: 配置 Cilium 使其知道哪些 IP 地址范围应该通过本地路由进行处理,不做 snat , Cilium 默认会对所用地址做 snat。
- 含义: 指定用于 IPv4 本地路由的 CIDR 范围,这里是
安装服务
$ ./install.sh
Creating cluster "cilium-kubeproxy" ...
✓ Ensuring node image (kindest/node:v1.23.4) 🖼
✓ Preparing nodes 📦 📦 📦
✓ Writing configuration 📜
✓ Starting control-plane 🕹️
✓ Installing StorageClass 💾
✓ Joining worker nodes 🚜
Set kubectl context to "kind-cilium-kubeproxy"
You can now use your cluster with:
kubectl cluster-info --context kind-cilium-kubeproxy
Not sure what to do next? 😅 Check out https://kind.sigs.k8s.io/docs/user/quick-start/
检查集群,检测 cilium
模式
# kubectl -n kube-system exec -it ds/cilium -- cilium status
KVStore: Ok Disabled
Kubernetes: Ok 1.23 (v1.23.4) [linux/amd64]
Kubernetes APIs: ["cilium/v2::CiliumClusterwideNetworkPolicy", "cilium/v2::CiliumEndpoint", "cilium/v2::CiliumNetworkPolicy", "cilium/v2::CiliumNode", "core/v1::Namespace", "core/v1::Node", "core/v1::Pods", "core/v1::Service", "discovery/v1::EndpointSlice", "networking.k8s.io/v1::NetworkPolicy"]
KubeProxyReplacement: Disabled
Host firewall: Disabled
CNI Chaining: none
CNI Config file: CNI configuration file management disabled
Cilium: Ok 1.13.0-rc5 (v1.13.0-rc5-dc22a46f)
NodeMonitor: Listening for events on 128 CPUs with 64x4096 of shared memory
Cilium health daemon: Ok
IPAM: IPv4: 3/254 allocated from 10.0.0.0/24,
IPv6 BIG TCP: Disabled
BandwidthManager: Disabled
Host Routing: Legacy
Masquerading: IPTables [IPv4: Enabled, IPv6: Disabled]
Controller Status: 22/22 healthy
Proxy Status: OK, ip 10.0.0.211, 0 redirects active on ports 10000-20000
Global Identity Range: min 256, max 65535
Hubble: Ok Current/Max Flows: 3219/4095 (78.61%), Flows/s: 2.86 Metrics: Disabled
Encryption: Disabled
Cluster health: 3/3 reachable (2024-06-19T08:19:09Z)
KubeProxyReplacement: Disabled
- kube-proxy 替代功能是否启用,Cilium 不会尝试替代 kube-proxy。Kubernetes 集群将继续使用默认的 kube-proxy 进行服务负载均衡和网络策略管理。
# -- Configure the kube-proxy replacement in Cilium BPF datapath
# Valid options are "disabled", "partial", "strict".
# ref: https://docs.cilium.io/en/stable/gettingstarted/kubeproxy-free/
#kubeProxyReplacement: "disabled"
b | cilium-kubeproxy-replacement-mode
- direct-routing 安装脚本
$ cat install.sh
#!/bin/bash
date
set -v
# 1.prep noCNI env
cat <<EOF | kind create cluster --name=cilium-kubeproxy-replacement --image=kindest/node:v1.23.4 --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
# kind 默认使用 rancher cni,cni 我们需要自己创建
disableDefaultCNI: true
# kind 安装 k8s 集群需要禁用 kube-proxy 安装,是 cilium 代替 kube-proxy 功能
kubeProxyMode: "none"
nodes:
- role: control-plane
- role: worker
- role: worker
containerdConfigPatches:
- |-
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."harbor.evescn.com"]
endpoint = ["https://harbor.evescn.com"]
EOF
# 2.remove taints
controller_node_ip=`kubectl get node -o wide --no-headers | grep -E "control-plane|bpf1" | awk -F " " '{print $6}'`
kubectl taint nodes $(kubectl get nodes -o name | grep control-plane) node-role.kubernetes.io/master:NoSchedule-
kubectl get nodes -o wide
# 3.install cni
helm repo add cilium https://helm.cilium.io > /dev/null 2>&1
helm repo update > /dev/null 2>&1
# Direct Routing Options(--set kubeProxyReplacement=strict --set tunnel=disabled --set autoDirectNodeRoutes=true --set ipv4NativeRoutingCIDR="10.0.0.0/8")
helm install cilium cilium/cilium \
--set k8sServiceHost=$controller_node_ip \
--set k8sServicePort=6443 \
--version 1.13.0-rc5 \
--namespace kube-system \
--set debug.enabled=true \
--set debug.verbose=datapath \
--set monitorAggregation=none \
--set ipam.mode=cluster-pool \
--set cluster.name=cilium-kubeproxy-replacement \
--set kubeProxyReplacement=strict \
--set tunnel=disabled \
--set autoDirectNodeRoutes=true \
--set ipv4NativeRoutingCIDR="10.0.0.0/8"
# 4.install necessary tools
for i in $(docker ps -a --format "table {{.Names}}" | grep cilium)
do
echo $i
docker cp /usr/bin/ping $i:/usr/bin/ping
docker exec -it $i bash -c "sed -i -e 's/jp.archive.ubuntu.com\|archive.ubuntu.com\|security.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list"
docker exec -it $i bash -c "apt-get -y update >/dev/null && apt-get -y install net-tools tcpdump lrzsz bridge-utils >/dev/null 2>&1"
done
--set
参数解释
--set kubeProxyReplacement=strict
- 含义: 启用 kube-proxy 替代功能,并以严格模式运行。
- 用途: Cilium 将完全替代 kube-proxy 实现服务负载均衡,提供更高效的流量转发和网络策略管理。
# -- Configure the kube-proxy replacement in Cilium BPF datapath
# Valid options are "disabled", "partial", "strict".
# ref: https://docs.cilium.io/en/stable/gettingstarted/kubeproxy-free/
#kubeProxyReplacement: "disabled"
安装服务
$ ./install.sh
Creating cluster "cilium-kubeproxy-vxlan" ...
✓ Ensuring node image (kindest/node:v1.23.4) 🖼
✓ Preparing nodes 📦 📦 📦
✓ Writing configuration 📜
✓ Starting control-plane 🕹️
✓ Installing StorageClass 💾
✓ Joining worker nodes 🚜
Set kubectl context to "kind-cilium-kubeproxy-vxlan"
You can now use your cluster with:
kubectl cluster-info --context kind-cilium-kubeproxy-vxlan
Have a question, bug, or feature request? Let us know! https://kind.sigs.k8s.io/#community 🙂
检查集群,检测 cilium
模式
# kubectl -n kube-system exec -it ds/cilium -- cilium status
KVStore: Ok Disabled
Kubernetes: Ok 1.23 (v1.23.4) [linux/amd64]
Kubernetes APIs: ["cilium/v2::CiliumClusterwideNetworkPolicy", "cilium/v2::CiliumEndpoint", "cilium/v2::CiliumNetworkPolicy", "cilium/v2::CiliumNode", "core/v1::Namespace", "core/v1::Node", "core/v1::Pods", "core/v1::Service", "discovery/v1::EndpointSlice", "networking.k8s.io/v1::NetworkPolicy"]
KubeProxyReplacement: Strict [eth0 172.18.0.3 (Direct Routing)]
Host firewall: Disabled
CNI Chaining: none
CNI Config file: CNI configuration file management disabled
Cilium: Ok 1.13.0-rc5 (v1.13.0-rc5-dc22a46f)
NodeMonitor: Listening for events on 128 CPUs with 64x4096 of shared memory
Cilium health daemon: Ok
IPAM: IPv4: 2/254 allocated from 10.0.0.0/24,
IPv6 BIG TCP: Disabled
BandwidthManager: Disabled
Host Routing: Legacy
Masquerading: IPTables [IPv4: Enabled, IPv6: Disabled]
Controller Status: 19/19 healthy
Proxy Status: OK, ip 10.0.0.202, 0 redirects active on ports 10000-20000
Global Identity Range: min 256, max 65535
Hubble: Ok Current/Max Flows: 4095/4095 (100.00%), Flows/s: 0.80 Metrics: Disabled
Encryption: Disabled
Cluster health: 3/3 reachable (2024-06-19T09:03:09Z)
KubeProxyReplacement: Strict [eth0 172.18.0.3 (Direct Routing)]
- Cilium 完全接管所有 kube-proxy 功能,包括服务负载均衡、NodePort 和其他网络策略管理。这种配置适用于你希望最大限度利用 Cilium 的高级网络功能,并完全替代 kube-proxy 的场景。此模式提供更高效的流量转发和更强大的网络策略管理。
c | cilium-kubeproxy-replacement-ebpf-mode
- direct-routing 安装脚本
$ cat install.sh
#!/bin/bash
date
set -v
# 1.prep noCNI env
cat <<EOF | kind create cluster --name=cilium-kubeproxy-replacement --image=kindest/node:v1.23.4 --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
# kind 默认使用 rancher cni,cni 我们需要自己创建
disableDefaultCNI: true
kubeProxyMode: "none"
nodes:
- role: control-plane
- role: worker
- role: worker
containerdConfigPatches:
- |-
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."harbor.evescn.com"]
endpoint = ["https://harbor.evescn.com"]
EOF
# 2.remove taints
controller_node_ip=`kubectl get node -o wide --no-headers | grep -E "control-plane|bpf1" | awk -F " " '{print $6}'`
kubectl taint nodes $(kubectl get nodes -o name | grep control-plane) node-role.kubernetes.io/master:NoSchedule-
kubectl get nodes -o wide
# 3.install cni
helm repo add cilium https://helm.cilium.io > /dev/null 2>&1
helm repo update > /dev/null 2>&1
# Direct Routing Options(--set kubeProxyReplacement=strict --set tunnel=disabled --set autoDirectNodeRoutes=true --set ipv4NativeRoutingCIDR="10.0.0.0/8")
# Host Routing[EBPF](--set bpf.masquerade=true)
helm install cilium cilium/cilium \
--set k8sServiceHost=$controller_node_ip \
--set k8sServicePort=6443 \
--version 1.13.0-rc5 \
--namespace kube-system \
--set debug.enabled=true \
--set debug.verbose=datapath \
--set monitorAggregation=none \
--set ipam.mode=cluster-pool \
--set cluster.name=cilium-kubeproxy-replacement-ebpf \
--set kubeProxyReplacement=strict \
--set tunnel=disabled \
--set autoDirectNodeRoutes=true \
--set ipv4NativeRoutingCIDR="10.0.0.0/8" \
--set bpf.masquerade=true
# 4.install necessary tools
for i in $(docker ps -a --format "table {{.Names}}" | grep cilium)
do
echo $i
docker cp /usr/bin/ping $i:/usr/bin/ping
docker exec -it $i bash -c "sed -i -e 's/jp.archive.ubuntu.com\|archive.ubuntu.com\|security.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list"
docker exec -it $i bash -c "apt-get -y update >/dev/null && apt-get -y install net-tools tcpdump lrzsz bridge-utils >/dev/null 2>&1"
done
这些参数用于通过 Helm 安装 Cilium 时进行配置。每个参数的详细含义如下:
--set
参数解释
--set bpf.masquerade
- 含义: 启用 eBPF 功能。
- 用途: 使用 eBPF 实现数据路由,提供更高效和灵活的网络地址转换功能。
bpf:
# -- (bool) Enable native IP masquerade support in eBPF
# @default -- `false`
masquerade: ~
安装服务
$ ./install.sh
Creating cluster "cilium-kubeproxy-replacement-ebpf" ...
✓ Ensuring node image (kindest/node:v1.23.4) 🖼
✓ Preparing nodes 📦 📦 📦
✓ Writing configuration 📜
✓ Starting control-plane 🕹️
✓ Installing StorageClass 💾
✓ Joining worker nodes 🚜
Set kubectl context to "kind-cilium-kubeproxy-replacement-ebpf"
You can now use your cluster with:
kubectl cluster-info --context kind-cilium-kubeproxy-replacement-ebpf
Not sure what to do next? 😅 Check out https://kind.sigs.k8s.io/docs/user/quick-start/
检查集群,检测 cilium
模式
# kubectl -n kube-system exec -it ds/cilium -- cilium status
KVStore: Ok Disabled
Kubernetes: Ok 1.23 (v1.23.4) [linux/amd64]
Kubernetes APIs: ["cilium/v2::CiliumClusterwideNetworkPolicy", "cilium/v2::CiliumEndpoint", "cilium/v2::CiliumNetworkPolicy", "cilium/v2::CiliumNode", "core/v1::Namespace", "core/v1::Node", "core/v1::Pods", "core/v1::Service", "discovery/v1::EndpointSlice", "networking.k8s.io/v1::NetworkPolicy"]
KubeProxyReplacement: Strict [eth0 172.18.0.2 (Direct Routing)]
Host firewall: Disabled
CNI Chaining: none
CNI Config file: CNI configuration file management disabled
Cilium: Ok 1.13.0-rc5 (v1.13.0-rc5-dc22a46f)
NodeMonitor: Listening for events on 128 CPUs with 64x4096 of shared memory
Cilium health daemon: Ok
IPAM: IPv4: 5/254 allocated from 10.0.1.0/24,
IPv6 BIG TCP: Disabled
BandwidthManager: Disabled
Host Routing: BPF
Masquerading: BPF [eth0] 10.0.0.0/8 [IPv4: Enabled, IPv6: Disabled]
Controller Status: 31/31 healthy
Proxy Status: OK, ip 10.0.1.30, 0 redirects active on ports 10000-20000
Global Identity Range: min 256, max 65535
Hubble: Ok Current/Max Flows: 4095/4095 (100.00%), Flows/s: 5.25 Metrics: Disabled
Encryption: Disabled
Cluster health: 3/3 reachable (2024-06-19T09:22:54Z)
KubeProxyReplacement: Strict [eth0 172.18.0.3 (Direct Routing)]
- Cilium 完全接管所有 kube-proxy 功能,包括服务负载均衡、NodePort 和其他网络策略管理。这种配置适用于你希望最大限度利用 Cilium 的高级网络功能,并完全替代 kube-proxy 的场景。此模式提供更高效的流量转发和更强大的网络策略管理。
Host Routing: BPF
- 使用 BPF 进行主机路由。
Masquerading: BPF [eth0] 10.0.0.0/8 [IPv4: Enabled, IPv6: Disabled]
- 使用 BPF 进行 IP 伪装(NAT),接口 eth0,IP 范围 10.0.0.0/8。IPv4 伪装启用,IPv6 伪装禁用。