资讯动态

基于K3s与Flux的GitOps实践:构建自动化Kubernetes集群

发布时间:2026/10/24 18:12:58 来源:尧图企业网站定制
1. 项目概述一个基于GitOps的轻量级K3s集群实践如果你和我一样厌倦了在Kubernetes集群上手动敲打kubectl apply每次部署都提心吊胆生怕哪条命令敲错导致服务中断那么GitOps可能就是你要找的答案。今天分享的是我用了一年多的一个生产级家庭/实验室K3s集群的完整GitOps实践。这个项目不是一个简单的Demo而是一个真正在跑着几十个应用包括媒体服务、监控告警、数据库和存储系统的实战环境。它的核心很简单用代码定义集群的一切用Git仓库作为唯一可信源所有变更都通过提交代码来自动化完成。整个体系建立在轻量级的K3s之上这比完整的K8s发行版节省了超过一半的资源却保留了绝大部分核心功能非常适合边缘计算、家庭实验室或资源有限的开发环境。而驱动这一切自动化的是Flux CD v2一个真正的GitOps原生工具。我的所有应用部署、配置更新、甚至密钥管理都通过这个仓库里的YAML文件和Helm Chart来声明。当你看到git push之后集群自动拉取变更并收敛到期望状态时那种“一切尽在掌控”的感觉是传统运维方式无法比拟的。这个项目适合所有正在或打算使用Kubernetes的开发者、运维和爱好者无论你是想搭建一个稳定的家庭媒体中心还是需要一个可复现的开发测试环境亦或是学习现代云原生运维理念这里面的思路和具体实现都能给你提供直接的参考。接下来我会拆解整个架构的设计思路、每一步的实操细节以及我踩过坑后总结出的宝贵经验。2. 核心架构与设计思路解析2.1 为什么选择K3s GitOps这个组合在决定技术栈时我主要权衡了资源消耗、功能完整性和运维复杂度。完整的Kubernetes发行版如kubeadm部署的集群功能强大但每个节点光是系统组件就要吃掉近1GB的内存这对于我那些只有8GB或16GB内存的迷你PC节点来说太过奢侈。K3s的出现完美解决了这个问题它将K8s组件打包成一个不到100MB的二进制文件默认使用轻量级的SQLite代替etcd并移除了一些非核心的云提供商驱动和过时的功能。实测下来一个纯计算节点仅需300-400MB内存即可稳定运行K3s这让我能把宝贵的资源留给实际的应用。而选择GitOps则是为了应对配置漂移和部署一致性的老大难问题。传统运维中通过Shell脚本或手动操作进行的变更很难被完整记录和回溯。GitOps将基础设施和应用都视为代码所有对生产环境的变更都必须通过Git提交来发起。这带来了几个核心好处版本控制所有变更都有清晰的提交历史、回滚能力一键回退到任意历史版本、审计追踪谁在什么时候改了什么都一目了然以及协作友好可以通过Pull Request进行代码审查。对于个人或小团队而言这意味着你可以在出差时用手机审查并合并一个PR集群就会自动完成部署既安全又高效。2.2 整体架构与组件选型考量我的集群架构遵循了“轻量控制平面高可用数据平面”的原则。整个集群由一个虚拟化的Master节点和四个物理的Worker节点组成。Master节点运行在TrueNAS Scale的虚拟机上主要负责集群调度和API服务。由于K3s默认的高可用模式对资源有一定要求我采用了更简单的单Master设计但通过定期备份K3s的SQLite数据库和关键配置文件到NAS来保证控制平面的可恢复性。四个Worker节点则承担了所有的应用负载和分布式存储任务。在组件选型上我紧紧围绕“声明式”和“自动化”两个核心Flux CD v2作为GitOps引擎。相比Argo CDFlux与Helm的集成更原生其多租户模型和依赖关系管理如Kustomization的依赖链非常适合管理复杂的应用栈。它的“通知控制器”还能在部署完成后向Slack或Discord发送消息非常实用。SOPS Age用于密钥管理。这是GitOps的一个关键挑战——如何安全地将密码、API密钥等敏感信息也放入Git仓库SOPSSecrets OPerationS允许你使用非对称加密我选用Age加密YAML文件中的敏感部分而解密密钥通过Flux安全地注入到集群中。这样加密后的秘密文件可以直接提交到代码库。Rook Ceph提供分布式块存储。为什么不用更简单的NFS或本地存储因为我想实现存储的高可用和弹性扩展。当某个节点宕机时运行在其上的Pod连同它的数据如果存储在Ceph RBD上可以快速在其它节点重建这对于数据库类应用至关重要。Rook将Ceph的部署和管理也Kubernetes化了完美契合GitOps哲学。Metallb在裸金属集群中提供LoadBalancer服务。家庭环境没有云厂商的负载均衡器Metallb通过ARP或BGP协议让特定节点对外宣告一个虚拟IP从而将外部流量引入集群这是暴露Ingress Controller等服务的基础。Renovate自动化依赖更新。它像一个智能机器人持续扫描仓库中的Helm Chart版本、容器镜像标签等并自动创建Pull Request来提醒或直接更新。这让我能轻松跟上安全补丁和功能更新是保持集群健康的关键一环。这个选型组合确保了从基础设施、应用到密钥管理的全栈声明式自动化形成了一个闭环的自治系统。3. 基础设施与集群初始化详解3.1 节点准备与操作系统抉择我的四个物理节点是Minisforum UN100C和BMax B4 Plus这类迷你PC它们功耗低、体积小但性能足够通常为Intel N系列处理器16GB RAM500GB NVMe。最初我使用Ubuntu Server但很快发现需要大量Shell脚本来维护节点的一致性配置如内核参数、软件包、防火墙规则。这引发了“配置漂移”问题。最终我转向了NixOS。这是一个声明式的Linux发行版其整个系统配置从内核模块到用户服务都由一个单一的configuration.nix文件定义。这意味着我的所有节点配置都作为代码存放在另一个独立的Git仓库中。当需要修改所有节点的SSH策略或时区时我只需修改一次代码然后推送到每个节点执行重建即可。这为底层基础设施也带来了GitOps的好处实现了从底层OS到上层K8s应用的完全代码化管理。节点的主机名如k3s-node-01和角色标签都在NixOS配置中定义确保了集群节点身份的清晰和一致。3.2 K3s集群的安装与关键配置K3s的安装极其简单一行命令即可。但为了适配GitOps和生产需求有几个关键配置项需要特别注意# 在Master节点上 curl -sfL https://get.k3s.io | INSTALL_K3S_VERSIONv1.35.0k3s1 \ sh -s - server \ --cluster-init \ --disable traefik \ --disable servicelb \ --write-kubeconfig-mode 644 \ --node-taint CriticalAddonsOnlytrue:NoExecute # 在Worker节点上 curl -sfL https://get.k3s.io | K3S_URLhttps://MASTER_IP:6443 \ K3S_TOKEN从Master节点/var/lib/rancher/k3s/server/node-token获取 \ sh -s -关键参数解析--disable traefikK3s默认安装Traefik作为Ingress Controller。但我更习惯使用功能更丰富的nginx-ingress-controller所以选择禁用默认的后续通过GitOps单独部署。--disable servicelb这是K3s自带的简单负载均衡器功能不如Metallb强大同样禁用由Metallb替代。--write-kubeconfig-mode 644这将kubeconfig文件的权限设置为对用户可读方便后续工具如Flux CLI直接使用。--node-taint CriticalAddonsOnlytrue:NoExecute给Master节点打上污点防止普通Pod调度到Master上确保控制平面的稳定性。像Flux、Rook Operator这类关键系统组件我会通过tolerations显式容忍这个污点让它们运行在Master上。注意生产环境中建议将K3S_TOKEN存储在密码管理器或通过安全的自动化流程传递避免在脚本中硬编码。我的做法是在NixOS配置的部署阶段通过临时环境变量注入。安装完成后首要任务是在本地配置好kubectl并验证集群状态kubectl get nodes -o wide。确保所有节点状态都是Ready并且具有正确的角色标签。4. GitOps核心引擎Flux CD v2的部署与配置4.1 Flux Bootstrap搭建GitOps的基石Flux的安装遵循一个“自举”过程你首先在本地用Flux CLI命令让它在你的集群里安装自己并配置好与你的Git仓库的连接。这个过程一旦完成后续对Flux自身的所有升级和配置也将通过Git仓库来管理实现了完美的“自托管”。# 1. 安装Flux CLI (以macOS为例) brew install fluxcd/tap/flux # 2. 准备Git仓库 # 确保你有一个空的Git仓库如本项目的GitHub仓库并克隆到本地。 # 3. 执行Bootstrap flux bootstrap github \ --ownerWRMilling \ --repositoryk3s-gitops \ --branchmaster \ --path./clusters/my-cluster \ # 配置文件在仓库中的路径 --personal这条命令会做以下几件关键事情在集群中创建flux-system命名空间。部署Flux的控制器source, kustomize, helm, notification等。在你的Git仓库指定路径下生成一个包含Flux自身配置的kustomization.yaml文件。配置一个GitRepository资源指向你的仓库并设置轮询间隔默认1分钟。配置一个Kustomization资源指向./clusters/my-cluster路径告诉Flux从这个目录开始协调集群状态。执行成功后你可以运行flux get sources git和flux get kustomizations来查看状态。当一切正常时Flux就成为了集群的“自动驾驶仪”开始监视你的Git仓库。4.2 组织结构如何优雅地管理上百个YAML文件随着应用增多YAML文件的管理会变得混乱。我采用了基于命名空间Namespace和功能分类的目录结构这也是k8s-at-home社区推崇的模式k3s-gitops/ ├── clusters/ │ └── my-cluster/ # 集群专属配置入口 │ ├── flux-system/ # Flux自身的配置由bootstrap生成 │ └── kustomization.yaml # 根Kustomization引用下面各个命名空间 ├── infrastructure/ # 跨命名空间的基础设施组件 │ ├── metallb/ │ ├── nginx-ingress/ │ └── kustomization.yaml ├── apps/ # 所有业务应用 │ ├── default/ # default命名空间下的应用 │ ├── media/ # media命名空间Plex, Sonarr等 │ ├── monitoring/ # monitoring命名空间Prometheus, Grafana │ └── .../ └── system/ # 集群系统组件 ├── cert-manager/ ├── rook-ceph/ └── .../每个命名空间目录下又按应用进一步划分。对于每个应用我优先使用HelmRelease来管理而不是裸的YAML。Helm Chart提供了版本化、参数化和依赖管理的能力。我的典型应用结构如下apps/media/plex/ ├── helmrelease.yaml # 定义HelmRelease资源指定Chart源、版本和Values ├── kustomization.yaml # 将此目录声明为一个Kustomization └── values/ # 可选的、覆盖的values配置 └── config.yaml根目录的kustomization.yaml则像一份索引通过resources字段引用所有子目录# clusters/my-cluster/kustomization.yaml apiVersion: kustomize.toolkit.fluxcd.io/v1 kind: Kustomization metadata: name: my-cluster namespace: flux-system spec: interval: 10m path: ./ prune: true sourceRef: kind: GitRepository name: flux-system validation: client dependsOn: # 定义依赖顺序确保基础设施先就绪 - name: infrastructure resources: - ../../infrastructure - ../../system - ../../apps这种结构清晰、模块化并且通过dependsOn确保了部署顺序例如nginx-ingress必须在metallb之后部署因为Ingress Controller需要一个LoadBalancer IP。5. 关键组件部署与集成实战5.1 存储基石Rook Ceph分布式存储部署在裸金属集群上提供动态持久化存储Rook Ceph是首选。部署它需要一些前置条件每个存储节点需要至少一块未分区的裸磁盘或分区并且内核需要启用必要的模块如rbd。在我的NixOS配置中我确保了这些模块的加载。部署过程本身通过GitOps完成。我创建了一个HelmRepository源指向Rook的官方Chart仓库然后定义一个HelmRelease来安装Rook Operator。Operator安装成功后再通过一个自定义的CephCluster资源文件来声明Ceph集群的期望状态# system/rook-ceph/ceph-cluster.yaml apiVersion: ceph.rook.io/v1 kind: CephCluster metadata: name: rook-ceph namespace: rook-ceph spec: dataDirHostPath: /var/lib/rook cephVersion: image: ceph/ceph:v18.2.0 mon: count: 3 # 建议为奇数我使用3个Monitor实现高可用 allowMultiplePerNode: false mgr: count: 2 storage: storageClassDeviceSets: - name: set1 count: 3 # 我有3个节点贡献存储每个节点一块盘 portable: false tuneDeviceClass: true volumeClaimTemplates: - metadata: name: data spec: resources: requests: storage: 400Gi # 每个节点上磁盘的容量 storageClassName: local-path # 临时使用待Ceph就绪后会被替换 volumeMode: Block accessModes: - ReadWriteOnce实操心得在Ceph集群初始化期间特别是PGs正在创建时IO性能会非常差甚至导致部署Pod超时失败。我的经验是先部署Ceph集群等待其状态完全健康kubectl -n rook-ceph get cephcluster显示HEALTH_OK再部署依赖存储的其他应用。可以通过在应用的Kustomization中设置dependsOn来实现这个顺序。Ceph集群就绪后它会自动创建几个StorageClass如rook-ceph-blockRBD块存储和rook-cephfsCephFS文件存储。之后任何PVC持久卷声明只要指定storageClassName: rook-ceph-block就能自动动态创建持久卷。5.2 网络与入口Metallb Nginx Ingress的配置在家庭网络环境中没有云服务商分配的公网IP或负载均衡器。Metallb通过在二层ARP或三层BGP网络宣告IP实现了LoadBalancer服务类型。我采用Layer 2模式因为它配置简单无需额外的路由器支持。配置的核心是定义一个IP地址池并分配给Metallb。# infrastructure/metallb/config.yaml apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: default-pool namespace: metallb-system spec: addresses: - 192.168.1.200-192.168.1.220 # 从家庭路由器DHCP范围外划定的一个IP段 --- apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: default-l2-advertisement namespace: metallb-system spec: ipAddressPools: - default-pool部署Nginx Ingress Controller时其Service的类型设为LoadBalancer。Flux协调后Metallb会从default-pool中分配一个IP如192.168.1.200给这个Service。之后我只需要将家庭路由器的端口如80, 443转发到这个IP外部流量就能到达Ingress Controller。Ingress Controller再根据Ingress资源中定义的规则主机名和路径将流量路由到后端对应的Service。这样我内部的所有Web服务都可以通过不同的子域名如grafana.home.lab,plex.home.lab来访问。5.3 密钥管理使用SOPS与Age实现安全GitOps将密码直接写在Git仓库里是绝对的安全禁忌。SOPS配合Age解决了这个问题。Age是一个简单、现代的加密工具我使用它生成一个密钥对。生成Age密钥对age-keygen -o age.agekey # 输出公钥将其配置到Flux中 cat age.agekey | grep \public\ | cut -d\ \ -f4在Flux中配置解密密钥创建一个Kubernetes Secret包含Age私钥。注意这个Secret本身需要通过安全的方式例如在Bootstrap时通过--secret参数注入到集群或者首次手动创建。kubectl create secret generic sops-age \ --namespaceflux-system \ --from-fileage.agekey在Flux的Kustomization中启用解密apiVersion: kustomize.toolkit.fluxcd.io/v1 kind: Kustomization metadata: name: apps namespace: flux-system spec: decryption: provider: sops secretRef: name: sops-age加密一个Secret文件# 假设有一个明文secret.yaml sops --encrypt --age 你的公钥 --encrypted-regex ^(data|stringData)$ secret.yaml secret.enc.yaml加密后的secret.enc.yaml文件可以安全地提交到Git仓库。Flux在同步时会自动使用集群中的私钥对其进行解密然后将明文Secret应用到集群。这种方式实现了“密钥的密钥”管理主密钥Age私钥被安全保管在集群中而具体的应用密钥则以加密形式存于Git兼顾了安全性和GitOps的自动化流程。6. 应用部署示例以媒体栈和监控栈为例6.1 部署完整的媒体服务栈Plex, Sonarr, Radarr媒体服务通常需要持久化存储、定期扫描和外部访问。我将其全部部署在media命名空间下。以Plex为例我使用k8s-at-home社区维护的Helm Chart因为它针对Kubernetes环境做了很多优化。# apps/media/plex/helmrelease.yaml apiVersion: helm.toolkit.fluxcd.io/v2beta1 kind: HelmRelease metadata: name: plex namespace: media spec: interval: 5m chart: spec: chart: plex version: 29.0.0 # 始终指定版本避免意外升级 sourceRef: kind: HelmRepository name: k8s-at-home namespace: flux-system valuesFrom: - kind: ConfigMap name: plex-common-values # 一些通用配置如时区 valuesKey: values.yaml - kind: Secret name: plex-secret # 加密的Plex Claim Token等 values: image: repository: plexinc/pms-docker tag: latest persistence: config: enabled: true type: pvc existingClaim: # 使用动态 provisioning storageClass: rook-ceph-block accessMode: ReadWriteOnce size: 10Gi transcode: enabled: true type: emptyDir # 转码临时文件无需持久化 ingress: enabled: true hosts: - host: plex.home.lab paths: - path: / pathType: Prefix tls: [] resources: limits: memory: 4Gi requests: memory: 2Gi对于Sonarr、Radarr等应用模式类似通过HelmRelease定义挂载Ceph RBD存储卷来保存配置和媒体库元数据并通过Ingress暴露Web界面。它们之间通过内部DNSservice-name.namespace.svc.cluster.local进行通信例如Sonarr下载完成后可以通过http://plex.media.svc.cluster.local:32400的API通知Plex刷新库。6.2 部署监控告警栈Prometheus, Grafana, Alertmanager一个可观测的集群是健康的集群。我使用Prometheus Operator通过prometheus-community的Helm Chart来管理整个监控生态。部署Prometheus Operator这个Operator会帮我们创建和管理Prometheus、Alertmanager实例以及相关的ServiceMonitor用于自动发现并监控K8s服务。配置数据持久化Prometheus的时序数据量很大必须持久化。我为其PVC指定storageClassName: rook-ceph-block并分配足够的容量如200Gi。服务发现为需要监控的服务如Nginx Ingress, Ceph集群甚至自定义应用创建ServiceMonitor资源。Prometheus Operator会自动配置Prometheus去抓取这些目标。部署Grafana同样通过Helm Chart部署将其数据源配置为指向Prometheus服务http://prometheus-operated.monitoring.svc.cluster.local:9090。Grafana的仪表盘配置可以通过ConfigMap挂载或者使用其Provisioning功能从Git仓库加载这也实现了仪表盘的代码化管理。配置告警规则在Prometheus中定义告警规则PrometheusRule资源例如节点内存使用率超过90%持续5分钟。当触发告警时Prometheus会将告警发送给Alertmanager。Alertmanager路由与通知配置Alertmanager将不同严重等级的告警路由到不同的接收器。我将其配置为通过Webhook发送通知到我的Slack频道这样我就能在手机上及时收到集群异常告警。这套监控栈部署完成后我就能在一个统一的Grafana界面上查看集群的CPU、内存、存储使用情况网络流量以及所有应用的运行状态实现了对集群的“全景洞察”。7. 高级主题自动化、备份与灾难恢复7.1 利用Renovate实现自动化依赖更新手动跟踪几十个Helm Chart和容器镜像的更新是项繁琐且易出错的工作。Renovate可以集成到GitHub仓库自动扫描依赖并创建更新PR。我在仓库根目录放置了一个renovate.json配置文件{ $schema: https://docs.renovatebot.com/renovate-schema.json, extends: [ config:recommended ], platformAutomerge: true, automergeType: pr, prHourlyLimit: 2, dependencyDashboard: true, labels: [dependencies], packageRules: [ { matchUpdateTypes: [minor, patch], groupName: all non-major dependencies, automerge: true }, { matchPackageNames: [k3s.io/k3s], matchUpdateTypes: [major], enabled: false // 主版本K3s升级需谨慎手动处理 } ] }这个配置意味着Renovate会每天扫描仓库发现非主版本minor, patch更新时会自动创建PR并合并对于K3s的主版本更新则禁用自动更新需要我手动审查。通过这种方式我的集群总能及时获得安全补丁和功能更新而无需我时刻关注版本动态。7.2 集群备份与灾难恢复策略即使有了GitOps备份依然至关重要。Git仓库备份了“期望状态”但一些动态数据如存储在Ceph里的媒体文件、数据库内容和Kubernetes集群自身的状态如CRD、非命名空间资源也需要备份。我采用Velero来完成这个任务。Velero的部署同样通过GitOps完成。它需要配置一个对象存储后端我使用TrueNAS上的S3兼容服务。定期备份任务通过一个Schedule资源来定义apiVersion: velero.io/v1 kind: Schedule metadata: name: daily-backup namespace: velero spec: schedule: \0 2 * * *\ # 每天凌晨2点 template: includedNamespaces: - media - monitoring - default storageLocation: default ttl: 720h # 保留30天这个备份策略会每天备份指定命名空间的所有资源包括PVC但需要存储插件支持CSI快照。当灾难发生时例如整个集群硬件故障恢复流程是在新的硬件上重新安装K3s和Flux。使用相同的Bootstrap命令指向同一个Git仓库。Flux会重新构建出基础架构Ceph, Metallb等。从Velero的备份中恢复应用和数据。由于PVC会被恢复并指向重新部署的Ceph存储数据得以保留。这种“GitOps定义环境Velero备份数据”的组合提供了从代码到数据的完整可恢复性将恢复时间目标RTO从数天缩短到数小时。8. 日常运维、问题排查与经验总结8.1 常用Flux命令与工作流日常工作中我几乎不需要直接登录服务器节点。所有操作都在本地和Git仓库中完成。查看同步状态flux get all -A查看所有资源状态。flux get kustomizations -A查看各个Kustomization的同步状态和健康情况。手动触发同步有时不想等轮询间隔可以执行flux reconcile kustomization name -n namespace。暂停与恢复同步在进行重大变更或调试时可以暂停某个应用的同步flux suspend kustomization name。完成后用flux resume kustomization name恢复。查看日志kubectl -n flux-system logs deployment/source-controller查看源码拉取日志。kubectl -n flux-system logs deployment/kustomize-controller查看协调和部署日志。标准工作流在本地修改某个应用的helmrelease.yaml比如升级镜像版本。git add . git commit -m \feat: upgrade app-x to v2.1.0\git push origin master等待约1分钟Flux轮询间隔或手动触发同步。使用flux get helmrelease app-x -n namespace观察升级进度和状态。8.2 常见问题与排查技巧即使自动化程度很高依然会遇到问题。以下是我总结的排查清单问题现象可能原因排查步骤Flux同步失败提示reconciliation failed1. Git仓库无法访问网络、密钥问题。2. YAML语法错误。3. Helm Chart版本不存在或拉取失败。4. 资源依赖未就绪如StorageClass不存在。1.flux get sources git检查仓库状态。2.flux reconcile source git flux-system手动重试。3. 检查失败Kustomization/HelmRelease的详细事件kubectl describe kustomization name -n flux-system。4. 查看对应控制器的日志。Pod处于Pending状态1. 资源不足CPU/内存。2. 节点Selector或亲和性不匹配。3. 污点Taint不容忍。4. PVC无法绑定StorageClass问题或容量不足。1.kubectl describe pod pod-name查看Events部分通常有明确提示。2.kubectl get nodes查看节点资源分配情况。3.kubectl get pvc查看PVC是否处于Bound状态。Pod处于CrashLoopBackOff状态1. 应用启动命令或参数错误。2. 配置文件错误。3. 依赖服务如数据库未就绪。4. 权限问题SecurityContext。1.kubectl logs pod-name --previous查看上一次崩溃的日志。2.kubectl describe pod pod-name检查容器配置和环境变量。3. 检查livenessProbe或readinessProbe配置是否过于严格。Ingress无法访问1. Ingress Controller Pod未运行。2. Service类型或端口错误。3. Ingress资源中的主机名或路径规则错误。4. 防火墙或网络策略NetworkPolicy阻止。1.kubectl -n ingress-nginx get pods确认Ingress Controller状态。2.kubectl get svc -n ingress-nginx确认Service有外部IP由Metallb分配。3.kubectl describe ingress ingress-name查看Ingress状态和事件。4. 在集群内用curl测试Service是否可达以排除外部网络问题。Ceph集群健康状态不是HEALTH_OK1. OSD存储守护进程磁盘故障或未启动。2. Monitor节点间网络问题。3. PG归置组状态异常。1.kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- ceph status查看详细状态。2.kubectl -n rook-ceph get pods查看所有Ceph Pod状态。3. 检查ceph osd tree查看OSD分布和状态。8.3 个人实践中的关键经验循序渐进分阶段实施不要试图一次性将所有应用都迁移到GitOps。先从一两个非核心应用开始熟悉Flux的工作流程和调试方法。然后逐步迁移基础设施组件如Ingress、存储最后迁移核心应用。严格区分环境即使在家庭实验室也建议使用不同的分支或目录来区分dev和prod环境。可以通过Flux的Kustomization覆盖来实现配置差异化。这能避免在测试时影响生产服务。善用kustomize的补丁对于需要根据不同环境进行微调的资源如副本数、资源请求量不要直接修改原始的HelmRelease而是使用Kustomize的patchesStrategicMerge或patchesJson6902在环境目录中进行覆盖。这保持了基础配置的干净。监控你的GitOps流程本身为flux-system命名空间也配置ServiceMonitor让Prometheus监控Flux控制器的各项指标如同步延迟、错误次数。这能让你在GitOps引擎自身出现问题时及时得到告警。文档化你的决策在仓库的README或专门的docs目录下记录你为什么选择某个特定的Chart版本、某个配置参数的含义、以及遇到并解决过的复杂问题。这对未来的自己或协作的伙伴是无价之宝。经过一年多的运行这套基于K3s和Flux的GitOps体系已经成为了我基础设施中无声且可靠的基础。它极大地减少了日常维护的琐碎工作将我的精力从“如何部署和修改”解放出来更多地投入到“部署什么和优化什么”上。当所有的配置都化为代码所有的变更都有迹可循时你对整个系统的掌控感和信心会达到一个全新的高度。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑