在k3s中安装cilium并使用eBPF路由
本文环境:
- k3s version v1.32.10+k3s1 (1c5d65ce)
go version go1.24.9- debian 13.2 (trixie)
6.12.57+deb13-amd64- Cilium
v1.18.4
安装 k3s 集群
根据 K3s 安装选项介绍、K3s Server 配置参考 和 Cilium 安装文档 得来
ARGS=(
--write-kubeconfig-mode=0644
--flannel-backend=none
--prefer-bundled-bin
--disable-network-policy
--disable-kube-proxy
--disable-cloud-controller
# 下面这些组件按需禁用
--disable=servicelb
--disable=traefik
--disable=metrics-server
--disable=local-storage
)
TOKEN=`dd if=/dev/urandom bs=4M count=1 | md5sum | xargs printf "%s\n" | head -1`
printf 'TOKEN=%s\n' $TOKEN
# 先下载安装脚本(对我就是一个apt包也不装)
wget https://get.k3s.io -O /tmp/getk3s.sh
# 第一个节点
env K3S_TOKEN=${TOKEN}\
INSTALL_K3S_EXEC="${ARGS[*]}"\
INSTALL_K3S_CHANNEL=v1.32\
sh /tmp/getk3s.sh --cluster-init
# 其他控制平面节点
env K3S_TOKEN=${TOKEN}\
INSTALL_K3S_EXEC="${ARGS[*]}"\
INSTALL_K3S_CHANNEL=v1.32\
sh /tmp/getk3s.sh --server https://${第一个节点IP}:6443
# Agent节点
env K3S_TOKEN=${TOKEN}\
INSTALL_K3S_EXEC="${ARGS[*]}"\
INSTALL_K3S_CHANNEL=v1.32\
K3S_URL=https://${第一个节点IP}:6443\
sh /tmp/getk3s.sh
安装完成后所有节点都是NotReady,这是正常现象,毕竟现在没有网络
| NAME | STATUS | ROLES | AGE | VERSION |
|---|---|---|---|---|
| k3s-1 | NotReady | control-plane,etcd,master | 1h | v1.32.10+k3s1 |
| k3s-2 | NotReady | control-plane,etcd,master | 1h | v1.32.10+k3s1 |
| k3s-3 | NotReady | control-plane,etcd,master | 1h | v1.32.10+k3s1 |
安装 Cilium
-
安装 Helm
参考 Installing Helm 安装 -
配置仓库
helm repo add cilium https://helm.cilium.io/ # 获取版本 helm search repo cilium -
安装 Cilium
helm install cilium cilium/cilium --version 1.18.4\ --set k8sServiceHost=${第一个节点IP}\ --set k8sServicePort=6443\ --set ipam.operator.clusterPoolIPv4PodCIDRList=10.42.0.0/16\ --set bpf.datapathMode=netkit\ --set bpf.masquerade=true\ --set bpf.distributedLRU.enabled=true\ --set bpf.mapDynamicSizeRatio=0.08\ --set ipv4.enabled=true\ --set enableIPv4BIGTCP=true\ --set kubeProxyReplacement=true\ --set bpfClockProbe=true\ --set routingMode=native\ --set autoDirectNodeRoutes=true\ --set ipv4NativeRoutingCIDR=10.42.0.0/16\ --set envoy.enabled=false\ --set socketLB.enabled=true每一项的作用
项目 值 作用 k8sServiceHost172.21.1.1指定 K8s API 服务地址 k8sServicePort6443指定 K8s API 服务端口 ipam.operator.clusterPoolIPv4PodCIDRList10.42.0.0/16设定集群的Pod地址池与K3s配置一致 bpf.datapathModenetkit使用 netkit 网卡
需要Kernel >= 6.8bpf.masqueradetrue使用 eBPF 来做 NAT bpf.distributedLRU.enabledtrue启用分布式 LRU 后端内存 bpf.mapDynamicSizeRatio0.08设定动态映射内存百分比 ipv4.enabledtrue启用IPv4 enableIPv4BIGTCPtrue启用高吞吐模式 kubeProxyReplacementtrue替代 kube-proxy bpfClockProbetrue启用 eBPF 时钟源探测 routingModenative使用节点原生路由模式处理流量 ipv4NativeRoutingCIDR10.42.0.0/16指定可以进行路由的CIDR autoDirectNodeRoutestrue自动检测节点路由 socketLB.enabledtrue启用 socketLB 劫持入流量 envoy.enabledfalse禁用内嵌的envoy image.repositoryquay.io/cilium/ciliumcilium的镜像(国内可以对这个地址做代理) image.useDigestfalse不在镜像版本后面加上 digest 信息 operator.image.repositoryquay.io/cilium/operatorcilium-operator的镜像(国内可以对这个地址做代理)
需要两个镜像: operator 和 operator-genericoperator.image.useDigestfalse不在镜像版本后面加上 digest 信息 -
等待完成
用
现在所有节点都是Ready了
| NAME | STATUS | ROLES | AGE | VERSION |
|---|---|---|---|---|
| k3s-1 | Ready | control-plane,etcd,master | 1h | v1.32.10+k3s1 |
| k3s-2 | Ready | control-plane,etcd,master | 1h | v1.32.10+k3s1 |
| k3s-3 | Ready | control-plane,etcd,master | 1h | v1.32.10+k3s1 |
可以验证网络是否正常
执行 kubectl run --image alpine/kubectl -it --rm --wait --restart Never test --command /bin/sh
然后跑
nslookup kubernetes.default.svc.cluster.local
nslookup kubernetes.default.svc.cluster.local ${其中一个coredns的IP}
kubectl api-resources
是能出数据的