Cilium 配置详解

Cilium

Cilium 可以说是当下最流行的基于 eBPF 的容器网络方案,基于eBPF 这种内核黑魔法 Cilium 极大地提升了容器网络的可玩性。

Cilium 的参数配置项都是通过 ConfigMapcilium-config配置的 中,,下面我们来一个个的分析一下这个 ConfigMap 里面的参数都有何意义。

本文基于cilium 1.11版本进行分析。

Cilium Config

配置项 意义
kvstore 当使用 KV 数据库存储元信息而不是CRD时,需要设置此项申明具体的KV存储,原来支持 etcdconsul 两种选择,不过 1.11 版后 consul 存储已经废弃不再支持。
kvstore-opt KV 存储的参数,会透传给对应的 etcd 和 consul 的实现对象
etcd-config ETCD 配置文件,存储了 ETCD 的地址和证书等连接信息,格式是一个 yaml 文件,会被挂载到 cilium 实例的 /var/lib/etcd-config/etcd.config位置供读取
conntrack-gc-interval conntrack gc 间隔,默认五分钟
disable-envoy-version-check
identity-allocation-mode cilium id 存储结构,crd or kvstore,通常情况下直接使用 CRD 存储元信息会是一个更为便利的选择,不过在大规模集群下,拆分一组独立的 ETCD 给 cilium 单独使用会是一个更高效的选择。
identity-heartbeat-timeout Identity 失去心跳达到一定的时间之后就会在 GC 中被删除。
identity-gc-interval Identity 资源删除时只是标记删除,此参数指定了定期运行 GC 删除底层资源的周期,默认一分钟
cilium-endpoint-gc-interval Cilium Endpoint (CEP)资源定期删除周期,默认五分钟,会遍历所有 CEP 去检查其在 k8s 集群中是否存在,不存在就清除该资源;正常情况下是会直接 watch k8s 资源变更,然后删除的,CEP GC 算是一种补偿逻辑。
disable-endpoint-crd 关闭 CEP GC。
identity-change-grace-period
labels
debug 默认false,设置debug为true,将把日志级别从默认的 INFO 改为 DEBUG,输出更多的细节日志,同时会输出更多的 event,可以通过 cilium monitor 查看
debug-verbose 在debug的基础上,可以再单独开启某些模块的详细日志,输入模块名称通过逗号分隔,目前支持的模块有:flow,kvstore,envoy,datapath,policy
agent-health-port cilium daemonset agent 上的健康检查HTTP端口,供kubelet探测使用,默认是9876
cluster-health-port cilium 有一个 cilium-health机制,节点之间会周期性地发送TCPICMP包互相探测用来进行连通性检测,cluster-health-port参数就是用来申明该机制所使用的端口的。
enable-policy 网络策略执行模式,支持以下三种模式:
- default白名单模式,当一个容器没有任何网络策略时默认是无阻拦的,但是果一个容器如果申明开放了6789 ,那么其他端口就默认封禁了
- always 开放模式,上文申明的例子在开放模式下,其他端口也能访问,除非明确申明了禁止的规则
- never 关闭网络策略特性,即使申明了网络策略的CRD也不会执行
prometheus-serve-addr 默认是空,不暴露 agent 上的metrics,设置地址即可开启,例如: 0.0.0.0:9090,因为 cilium agent 的容器是共用宿主机网络的,所以要注意端口冲突
proxy-prometheus-port envoy metric 端口,不设置即不暴露metrics
metrics 参数为一个字符串数组,在默认启用的 metric 基础上可以额外启用或禁用一些 metric 来捕获关注的信息或者提升性能,+为启用,-为弃用,例:
+cilium_endpoint_state,-cilium_event_ts,-cilium_forward_count_total
operator-prometheus-serve-addr 设置 operatormetrics 地址
enable-metrics 启用 operator metrics
skip-crd-creation operator 启动的时候跳过自动创建 CRD 的阶段,当我们想要单独定制然后部署 CRD 的时候可以开启此选项
enable-ipv4 启用 ipv4,启用之后会为每个 pod 分配 ipv4 的地址以及处理对应的路由等配置
enable-ipv6 同 ipv4,启用 ipv6,之后会为每个 pod 都分配 ipv4 的地址,支持同时启用 v4 和 v6,如果不需要的话可以关闭以提高性能
clean-cilium-state 开启这个选项之后,agent 将会在启动时 initContainer 内清空机器上的所有 cilium 数据,包括 eBPF 相关、路由虚拟网卡等等,适用于重装或者卸载 cilium 等场景,会触发 clean-cilium-bpf-state
clean-cilium-bpf-state 同 clean-cilium-state,不过只清理 eBPF 相关状态
custom-cni-conf
enable-bpf-clock-probe 布尔值,自动嗅探使用的时钟,jiffies or ktime
enable-bpf-tproxy 布尔值,默认 false,基于 eBPF 实现 netfilter TPROXY 透明代理功能
monitor-aggregation
monitor-aggregation-interval
monitor-aggregation-flags
bpf-map-dynamic-size-ratio
enable-host-legacy-routing - true 走内核网络栈路由
- false 走 eBPF 路由,性能更好,但是需要内核 5.10 之后才支持,不然就算设置为 false 也会自动降级到内核路由
bpf-ct-global-tcp-max conntrack 最大跟踪 TCP 协议连接条目数,默认是524288,cilium 绕开了netfilter,所以基于 eBPF 自己实现了一套 conntrack,该参数的具体实现是存储 conntrack 的 bpf map 的最大长度
bpf-ct-global-any-max conntrack最大跟踪非TCP协议连接条目数,默认262144
bpf-nat-global-max 同 conntrack,cilium 也是基于自己实现的 conntrack 实现的 NAT,该参数限制了最大的 NAT 条目数,默认为: 524288
bpf-neigh-global-max ARP邻居表的最大条目数,默认524288
bpf-policy-map-max 最大网络策略条目数:默认16384
bpf-lb-map-max 最大LB数量:默认65536
bpf-lb-bypass-fib-lookup
bpf-lb-external-clusterip
preallocate-bpf-maps 布尔值,1.4之后默认为 false,设置为 true 代表启用,在 bpf map 定义的时候就分配好内存,可以降低包处理延迟,但是会提高内存占用
sidecar-istio-proxy-image
cluster-name 使用 cluster-mesh 特性时该集群的名称
cluster-id 使用 cluster-mesh 特性时该集群的 ID,1-255 中选一个数字
tunnel 对于在 node 之间传输的 pod 间流量启用 overlay 网络通信,当我们没有用 BGP 打通容器网络和物理网络时就需要开启此配置,可选的配置有:
- vxlan (默认)
- geneve (Generic Network Virtualization Encapsulation)
- disabled
tunnel-port 设置 tunnel 协议的端口,VXLAN 默认为 8472,Geneve 默认为 6081
auto-create-cilium-node-resource 布尔值,默认会自动创建 CiliumNode 资源,CiliumNode 代表了 k8s 中的一个节点,持有节点 CIDR 段,内部IP等信息,关闭该选项则在集群中加入新节点时需要手动管理和创建该资源
update-ec2-adapter-limit-via-api
aws-release-excess-ips
ec2-api-endpoint
eni-tags
subnet-ids-filter
subnet-tags-filter
enable-local-node-route
azure-user-assigned-identity-id
enable-endpoint-routes cilium 默认会通过 cilium_host 虚拟设备来实现路由,将此参数设置为 true 可以关闭该特性转而为每个 endpoint (即POD) 在路由表中创建相关条目来实现
enable-l7-proxy 启动 L7 策略的支持,开启后 cilium 会基于 enovy 实现对于 HTTP 报文级别的安全策略,比如
cni-chaining-mode 将 cilium 嵌套在其他 CNI 插件上使用,cilium 不处理基本的网络联通性配置和 IPAM,只提供可观测性和网络策略特性,支持配合如下 CNI 插件:
- none: 禁用
- aws-cni
- portmap
- generic-veth
- flannel
enable-identity-mark
enable-local-node-route
enable-ipv4-masquerade masquerading,跟 iptables 里面那个 masquerading 概念一样,对于 POD 访问外界的流量做源地址转换,如果使用 tunnel 模式需要开启此选项,如果是通过 BGP 等打通了物理网络则可以禁用
enable-ipv6-masquerade 同 IPv4
enable-bpf-masquerade 设置该参数为 true 之后,如果使用了 masquerading 特性,那么会基于 eBPF 来替代 iptables 的实现,需要内核 5.10 及之后版本,否则就算开启也会降级到 iptables 实现
egress-masquerade-interfaces
enable-ip-masq-agent
enable-ipsec
ipsec-key-file
encrypt-interface
encrypt-node
enable-wireguard
enable-wireguard-userspace-fallback
datapath-mode
ipvlan-master-device ipvlan 虚拟设备名称
enable-xt-socket-fallback
install-iptables-rules
install-no-conntrack-iptables-rules
iptables-random-fully
iptables-lock-timeout
auto-direct-node-routes
enable-bandwidth-manager
enable-local-redirect-policy 开启本地转发功能,开启之后可以通过配置 CRD CiliumLocalRedirectPolicy 将指定的 Service 或者 IP 流量优先劫持到本地的 Pod,比如 NodeLocalDNS 等组件就会依赖这个功能。
ipv4-native-routing-cidr 默认情况下所有 Pod 流量出主机都会被 masquerade 做 NAT 再转入宿主机网络,不过可以单独配置 native-routing-cidr来将这个变量定义的 CIDR 段不转换直接发送,不过如果全部 Pod 段路由都打通到了宿主机网络的话,其实可以直接将 enable-ipv4-masquerade 设置为 false 关闭地址转换,这样调整 PodCIDR 的时候就不用再额外维护这个字段了。
ipv6-native-routing-cidr 同 ipv4-native-routing-cidr。
enable-ipv4-fragment-tracking
enable-host-firewall 为宿主机 namespace 下的流量也启动网络策略,启用了之后我们就可以通过 CRD 配置一些 host 侧的网络规则。
devices 逗号分隔的字符串数组,宿主机出口网卡设备名。
kube-proxy-replacement cilium 基于 eBPF 完全实现了 kube-proxy 的 ClusterIP, NodePort, ExternalIP, HostPort 等功能,所以理论上可以直接替换掉 kube-proxy 组件,不过对于内核版本是有一定要求的,详见:https://docs.cilium.io/en/stable/gettingstarted/kubeproxy-free/#kubeproxy-free,参数可选值:
- strict 强制尝试替换,如果无法替换 cilium 会启动失败
- probe 自动嗅探判断能否替换,如果有些特性缺失,那么就会尽力替换掉能替换的功能
- partial 替换部分特性的实现,具体替换哪些特性需要通过参数手动指定:如 enable-node-port 等,如果指定了替换特性但是内核无法满足则会启动失败
- disabled 不替换
kube-proxy-replacement-healthz-bind-address 使用 cilium 替换了 kube-proxy 如果原有的健康检查机制不便调整的话,可以将该参数设置为跟原来的 kube-proxy 一样,默认为:”0.0.0.0:10256” ,让 cilium 也提供一个跟原来一样的健康检查接口
enable-host-reachable-services 替换 kube-proxy 实现 HostReachableServices 这个特性,顾名思义就是使得 K8S 的 ClusterIP 在 host namespace 下(即宿主机上)也能访问到,这个特性也是对内核版本有一定要求的
host-reachable-services-protos 启用 HostReachableServices 特性的协议,可选 tcp udp,因为 UDP 协议的该项特性会对于内核版本有较高的要求同时大部分人又用不到 UDP Service 的特性,所以可以通过这个选项只开启 TCP 协议的 HostReachableServices 特性
bpf-lb-sock-hostns-only
enable-host-port 替换 kube-proxy 实现 HostPort 特性,就是我们通常在 pod.spec.container.ports.hostPort 那个参数,将容器的端口映射到宿主机的某个端口
enable-external-ips
enable-node-port 代替 kube-proxy 来实现 NodePort 特性,需要内核版本不低于 4.17.0
node-port-range NodePort 的端口范围,同 K8S APIServer 的--service-node-port-range参数,Cilium 默认值和 K8S 的默认是保持一致的: 30000,32767
direct-routing-device
enable-health-check-nodeport
node-port-bind-protection 禁止其他应用程序 bind NodePort 范围内的端口
enable-auto-protect-node-port-range 将 NodePort 范围的端口加入到内核的 net.ipv4.ip_local_reserved_ports 参数内来避免其他应用程序占用
datapath-mode 容器和宿主机网络空间连接的方式,支持 vethipvlan 两种选项,默认是 veth,不过这个参数将在下一个版本废弃,因为 ipvlan 使用者少,维护者也少,所以 Cilium 团队计划停止对 ipvlan 的支持,只支持 veht pair 的方式,这个参数也就没有意义了
bpf-lb-mode NodePort 和 LoadBalancer 等服务转发特性具体的实现模式( 只有替换了 kube-proxy 该参数才有意义)
snat默认模式,普通的负载均衡流量代理
dsr Direct Server Return 模式,后端真实服务器返回的包不经过 Cilium 直接返回给客户端,性能更好,同时后端能准确的感知到客户端的 IP,不过 tunnel 模式下无法使用
hybird 对于 TCP 协议包使用 dsr 模式,UDP 包则使用 snat 模式
bpf-lb-algorithm 负载均衡使用的算法,支持:
random 随机
maglevMaglev 一致性哈希算法
bpf-lb-acceleration 通过 XDP 提升负载均衡性能
bpf-lb-dsr-dispatch 在 DSR 模式可以通过 IPIP 的模式将包传递给后端,支持选项:ipip opt
enable-service-topology 流量负载均衡时启用 K8S 拓扑感知功能,比如可以实现让流量就近访问等,详见:拓扑感知提示
bpf-lb-maglev-table-size Maglev 一致性哈希算法调优参数,每个 service 的哈希表大小
bpf-lb-maglev-hash-seed Maglev 一致性哈希算法调优参数,hash 种子
enable-session-affinity 启用替换 SessionAffinity,依赖内核版本 5.7.0
enable-svc-source-range-check 启用 Service 源地址检查,默认启用,启用后会根据 Service 中 LoadBalancerSourceRanges 字段来对流量来源进行检查
enable-l2-neigh-discovery
arping-refresh-period
pprof 启用 Go pprof 功能,可以帮助分析排查 Go 程序运行时问题,agent 的默认 pprof 端口为 6060,operator 的默认端口为 6061
log-system-load 布尔值,每隔五秒日志记录一次操作系统 Load
log-opt 一些额外的日志自定义参数
sockops-enable SOCK_OPS 是许多钟 eBPF 程序类型的一种,可以基于 socket 事件,比如:超时、建联、重传等,来设置一些回调逻辑
k8s-require-ipv4-pod-cidr 校验 v1.Node资源上的 CIDR 是否存在,不存在的话则阻塞 cilium 的启动,通常会配合 k8s 原生的 ipam 模式使用。
k8s-require-ipv6-pod-cidr k8s-require-ipv4-pod-cidr
endpoint-status
read-cni-conf
write-cni-conf-when-ready
k8s-kubeconfig-path
enable-endpoint-health-checking
enable-health-checking
enable-well-known-identities
enable-remote-node-identity
synchronize-k8s-nodes
policy-audit-mode
operator-api-serve-addr Operator API 服务监听地址,默认为:localhost:9234
enable-hubble 启用 Hubble gRPC 服务
hubble-socket-path Hubble gRCP 服务本地 UNIX domain socket 监听地址
hubble-listen-address Hubble 供 relay 服务跨机器调用的 gRPC 监听地址,默认: :4244
hubble-disable-tls Hubble gRPC 服务默认是开启 TLS 的,可以将此参数设置为 true 以关闭 TLS
hubble-tls-cert-file Hubble TLS 证书文件位置
hubble-tls-key-file Hubble TLS 私钥文件位置
hubble-tls-client-ca-files Hubble TLS CA证书文件位置
hubble-event-queue-size
hubble-flow-buffer-size
hubble-event-buffer-capacity
hubble-metrics-server Hubble 的 metrics 服务地址,默认:”:9091”,由于 Hubble 实现于 agent 内部,所以该端口也是需要在所有机器上都占用的,注意冲突
hubble-metrics 配置要采集哪些 metrics,为空则默认不采集,可选项如下:
dns
drop
tcp
flow
icmp
http
disable-iptables-feeder-rules
ipam ipam (IP Address Management), 选择 Cilium 的 IP 管理策略,支持如下选择:
- cluster-pool 默认的IP管理策略,会为每个节点分配一段 CIDR,然后分配 IP 时从这个节点的子网中选择IP,但是不如 calico 一点的是,这并不是动态分配的 IP 池,每个节点的 IP 之后不会自动补充新的 CIDR 进去
- **crd **用户手动通过 CRD 定义每个节点可用的 IP 池,方便扩展开发,自定义IP管理策略
- kubernetes 从 k8s v1.Node 对象的 podCIDR 字段读取可用 IP 池,不再自己维护 IP 池,在 1.11 使用 cilium 自己集成的 BGP Speaker 宣告 CIDR 时就只支持这种模式
- alibabacloud, azure, eni 各大公有云自己定制的 ipam 插件
cluster-pool-ipv4-cidr (如果申明了 ipam 策略为 cluster-pool,那么下面这几个 cluster-pool开头的参数才有意义)
整个集群的可用 IP CIDR大池子,数组格式,可以申明多个段,空格分隔,例:
‘10.1.0.0/16 10.2.0.0/16’
cluster-pool-ipv4-mask-size 每个 Node 分配的IPv4 CIDR 掩码长度,这决定了每个 Node 的 Pod 数量上限,默认是 24,即可以分配 2^(32-24) = 256 个 IP,稍稍有点大,可以试实际情况调整
cluster-pool-ipv6-cidr 同 IPv4, 集群 IP CIDR 池
cluster-pool-ipv6-mask-size 同 IPv4,每个 Node 分配的IPv6 CIDR 掩码长度
disable-cnp-status-updates
enable-ipv4-egress-gateway
enable-k8s-event-handover
crd-wait-timeout 系统初始化时等待 CRD 安装继续的时长,超过之后 Cilium 将自动退出,默认 5分钟
enable-k8s-endpoint-slice 启用对于 EndpointSlice 的支持,默认启用
k8s-service-proxy-name 默认情况下 cilium 会接管和转发所有的 Service,设置该选项之后,cilium 将只接管设置了service.kubernetes.io/service-proxy-name标签且值相同的 Service,其他的将被忽略
enable-custom-calls
bgp-announce-lb-ip 布尔值,Cilium 集成了 metallb 使其将 k8s 集群内部的路由通过 BGP 同步到外部去,bgp-announce-lb-ip 开启之后将会把 LoadBalancer 类型 Service 的 ExternalIP 宣告到宿主机网络,除了开启这个选项之外还需要配置一个 metallb 的 configmap 申明 BGP peer 和给其分配的 ippool,基于 BGP 的 multihop 特性,这样我们就能轻松拥有高可用的 VIP 了,是一个非常实用的高级功能
bgp-announce-pod-cidr 布尔值,同上,通过 BGP 同步 Pod CIDR 到外界,1.11 版本才加入的新特性,之后打通物理网络就不再需要安装 bird 之类的 BGP speaker 了
bpf-root BPF文件系统挂载的位置,BPF程序可以通过 BPF_OBJ_PIN指令将 map 固定到 BPF 文件系统的指定路径上,极大地方便了BPF程序之间以及和用户态程序交换数据,默认挂载位置为:/sys/fs/bpf,不过也可以自行挂载到其他位置
cgroup-root cgroup2 文件系统在宿主机上挂载的位置
vlan-bpf-bypass
enable-cilium-endpoint-slice
enable-k8s-terminating-endpoint 在 EndpointSlice 特性启用时,自动检测 terminating 状态的 endpoint