Cilium
Cilium 可以说是当下最流行的基于 eBPF 的容器网络方案,基于eBPF 这种内核黑魔法 Cilium 极大地提升了容器网络的可玩性。
Cilium 的参数配置项都是通过 ConfigMapcilium-config
配置的 中,,下面我们来一个个的分析一下这个 ConfigMap 里面的参数都有何意义。
本文基于cilium 1.11版本进行分析。
Cilium Config
配置项 | 意义 |
---|---|
kvstore | 当使用 KV 数据库存储元信息而不是CRD时,需要设置此项申明具体的KV存储,原来支持 etcd 和 consul 两种选择,不过 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机制,节点之间会周期性地发送TCP 和ICMP 包互相探测用来进行连通性检测,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 | 设置 operator 的 metrics 地址 |
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 | 容器和宿主机网络空间连接的方式,支持 veth 和 ipvlan 两种选项,默认是 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 随机maglev Maglev 一致性哈希算法 |
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 |