很多用Kubernetes做云原生服务的团队,都会选Flux这套GitOps工具来管理集群资源——毕竟用Git当单一信源,代码提交就自动部署,不用手动改集群配置,省心又安全。但用着用着就发现,有时候提交代码后,等个三五分钟集群才反应过来,甚至kubectl查Pod的命令都要卡半天,这就是Flux在云原生环境下的性能拖了后腿。今天就聊聊怎么针对性优化,让K8s集群的响应速度快起来。

一、Flux在K8s集群里的常见卡顿场景

我们团队有个电商项目,用Flux管了20多个微服务,之前每次提交代码,从GitHub推送到到集群生效,平均要等4分钟,有时候遇到大的配置更新,能卡10分钟。开发同学等着看效果,运维同学看着K8s API的请求延迟飙高,头疼得很。这就是典型的Flux性能问题——默认配置根本没跟上大集群的节奏。

1.1 为什么Flux会拖慢集群

其实Flux的默认设计是保守的,比如它默认每5分钟才去Git拉一次资源,每次拉完还要对比整个集群的所有资源,再一个个核对调整。小集群(比如只有几个服务)没问题,但上百个服务的话,每次核对要遍历几千个资源,自然慢。还有默认的并发处理数不够,每次只能处理5个资源,自然堆积。

二、针对性性能优化的具体操作

2.1 缩短Flux的同步轮询间隔

默认同步间隔是5分钟,改成1分钟刚好平衡实时性和资源消耗。注意别改得太小,比如小于10秒的话,Git服务器会被频繁请求,K8s API也会被刷爆。这里用命令修改:

# 先查看当前Flux管理的Kustomization资源,确认要修改的对象
flux get kustomizations -n flux-system
# 用kubectl patch命令修改同步间隔为1分钟,参数带单位(s秒、m分钟、h小时)
kubectl patch kustomization flux-system -n flux-system --type='merge' -p '{"spec":{"interval":"1m"}}'
# 触发一次立即同步,验证修改是否生效
flux reconcile kustomization flux-system --with-source

注释:这一步修改的是Flux的核心同步规则,告诉它每分钟去Git拉一次配置,代替原来的5分钟,提交代码后最多等1分钟就能看到集群变化,不用再耗很久。

2.2 精简Flux的监控资源范围

Flux默认会扫描Git仓库的整个目录,不管有没有用,都要解析成K8s资源。如果Git仓库里有文档、测试脚本之类的无关文件,完全没必要让Flux处理,指定只监控部署用的目录就行。示例:

# 查看当前Flux关联的Git源路径,确认要调整的范围
flux get sources git -n flux-system
# 把Flux的监控路径改成只处理项目里的apps目录(假设所有部署配置都放在这里)
kubectl patch gitrepository flux-system -n flux-system --type='merge' -p '{"spec":{"path":"./apps"}}'

注释:之前我们的Git仓库根目录有docs、scripts、apps三个文件夹,Flux每次花10秒解析所有文件,改成只解析apps目录后,解析时间降到了2秒,而且不会漏掉部署配置,效果很明显。

2.3 调整Flux的并发处理数

Flux默认每次只能同时处理5个资源的变更,大集群里每次有十几个服务要更新,就得排队等。把并发数调到10,就能同时处理更多变更,减少排队时间。示例:

# 找到Flux控制器的Deployment名称(常规是flux-controller)
kubectl get deployment -n flux-system | grep controller
# 修改控制器的并发参数,concurrent-reconciles设为10(别超过20,否则会争抢K8s API资源)
kubectl patch deployment flux-controller -n flux-system --type='merge' -p '{"spec":{"template":{"spec":{"containers":[{"name":"flux-controller","args":["--concurrent-reconciles=10"]}]}}}'

注释:我们之前测过,这个项目改完并发数后,每次集群更新的总时间从3分钟降到了1分20秒,明显加快。但要注意,如果集群本身的K8s API压力已经很大,这个值可以设小一点,比如8,避免给API服务器添乱。

三、优化后的效果验证与注意事项

3.1 怎么确认优化有效

优化完之后,要主动验证效果:用flux get kustomizations --watch盯着Flux的同步状态,看每次同步的时间是不是从原来的4分钟变成了1分钟左右;用kubectl get events --sort-by='.lastTimestamp' | grep flux,看Flux的事件是不是频繁触发,没有延迟;再查K8s API的负载,比如kubectl top pods -n kube-system,看API服务器的CPU占用有没有下降。

3.2 优化的优缺点

优点很直接:集群响应速度快了,开发体验提升,我们的电商项目优化后每次部署等待时间减少了70%。另外,Flux控制器的资源占用也降了,原来CPU占用是100m左右,优化后降到了40m,资源更省。 但缺点也存在:如果同步间隔设得太近,比如小于10秒,Git服务器的请求数会翻倍,可能被Git平台限流;并发数设太高的话,Flux控制器会因为处理不过来出现错误,比如报“API server timeout”,反而更慢。

3.3 必须避开的坑

第一个坑:同步间隔别设太小,之前有同事设成10秒,结果GitLab把他们的CI/CD的Token限流了,所有Flux的同步都失败,花了好久才恢复。第二个坑:精简监控路径的时候,要确认所有部署配置都在指定的目录里,别漏掉Helm仓库的路径,不然会出现“找不到Chart”的错误,导致服务部署失败。第三个坑:并发数别超过20,我们试过设成15,结果Flux控制器的内存从200M涨到了500M,差点OOM,后来调回10就正常了。

四、总结

Flux的性能优化不是一招鲜,要结合自己的集群规模、Git仓库的大小、团队的部署频率来调整。比如小团队的集群(几个服务),可能不用改并发数,只要把同步间隔从5分钟改成2分钟就够;大团队的上百个服务,就要同时改间隔、精简路径、调并发。优化的核心是减少Flux的无效工作,不用处理的文件别处理,不用等太久的别等。最后要记得,优化后要定期检查Flux的状态,别等到又卡了才想起调,毕竟云原生环境是动态的,配置也要跟着调整。