别再乱用kubectl了!-f 和 -k 的区别,这一篇给你讲透

别再乱用kubectl了!-f 和 -k 的区别,这一篇给你讲透
别再乱用kubectl了-f 和 -k 的区别这一篇给你讲透同样是部署YAML为什么项目推荐用 -k 而不是 -f一、引子一个让你深夜崩溃的场景小张刚学Kubernetes照着教程写好了所有YAML文件执行bashkubectl apply -f k8s/然后他看到了这个报错textError from server (NotFound): error when creating k8s/backend-deployment.yaml: namespaces camp not found小张懵了明明namespace.yaml和deployment.yaml在同一个目录里为什么说找不到命名空间答案就藏在-f和-k的区别里。二、三秒钟记住核心区别命令一句话解释记忆口诀kubectl apply -f ./按文件名排序逐个发送“谁排在前面谁先跑”kubectl apply -k ./先读配置文件整理后再发送“先看清单再干活”记住-f file文件-k kustomize整理后再执行。三、一个例子让你彻底看懂你的k8s/目录长这样textk8s/ ├── namespace.yaml # 定义 namespace: camp ├── backend-deployment.yaml # 依赖 namespace: camp └── kustomization.yaml # 声明了上面两个文件方式一kubectl apply -f k8s/执行过程读取目录下所有文件名按字母顺序排序backend-deployment.yamlb排在了namespace.yamln前面先部署backend-deployment.yaml→ 找不到camp命名空间 → ❌报错再部署namespace.yaml→ 但已经晚了结论文件名决定了部署顺序不可控容易出错。方式二kubectl apply -k k8s/执行过程先读取kustomization.yaml看看里面写了哪些资源Kustomize自动分析依赖关系 → 发现backend-deployment.yaml依赖namespace.yaml自动调整顺序先创建namespace再创建deployment一次性全部成功 → ✅搞定结论Kustomize帮你处理了资源依赖顺序不再依赖文件名。四、最形象的比喻想象你要搬家有两种方式方式比喻-f没请搬家公司你自己一趟一趟跑先搬什么后搬什么全凭心情搬错了还得重新来。-k请了搬家公司你只需要列个清单kustomization.yaml搬家公司会按最优顺序帮你搬好不用你操心。你选哪种五、还有一个致命区别白名单 vs 黑名单方式行为风险-f目录下所有.yaml文件都会被部署如果你在目录里放了一个test.yaml做测试忘了删它也会被部署到生产环境-k只有kustomization.yaml里声明的文件才会被部署未声明的文件一律无视安全可控。这就是“白名单”思维我明确告诉你用哪些文件没列出来的你别动。六、实战命令对比表操作-f方式-k方式部署kubectl apply -f k8s/kubectl apply -k k8s/删除kubectl delete -f k8s/kubectl delete -k k8s/预览查看要部署什么kubectl apply -f k8s/ --dry-runclient -o yamlkubectl kustomize k8s/查看资源状态kubectl get pods -n campkubectl get pods -n camp更新镜像手动改YAML文件 kubectl apply -f修改kustomization.yaml或补丁文件 kubectl apply -k七、什么时候用-f什么时候用-k场景推荐方式理由快速测试一个单文件的YAML-f就一个文件没那么多事儿。临时查看某个资源-f快速验证用完就删。部署正式项目多文件-k依赖关系自动处理不容易翻车。管理多个环境dev/staging/prod-k支持“基础配置环境覆盖”模式不用复制整个目录。这个项目的生产部署-k项目里已经有kustomization.yaml直接用它。八、总结一张图记住全部text┌─────────────────────────────────────────────────────────────┐ │ │ │ kubectl apply -f k8s/ 按文件名顺序逐个发送 │ │ │ │ kubectl apply -k k8s/ 先看清单整理后再发送 │ │ │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 核心区别 │ │ ✅ -k 会处理资源依赖顺序先建namespace再建deployment │ │ ❌ -f 不会谁文件名排前面谁先跑 │ │ │ │ ✅ -k 只部署清单里声明的文件白名单 │ │ ❌ -f 部署目录下所有YAML不小心就部署了测试文件 │ │ │ └─────────────────────────────────────────────────────────────┘一句话记住-f是“乱序逐个发”-k是“整理后统一发”。有了-k你就不用再跟文件名较劲了。九、课后作业在你的项目里分别执行这两个命令看看输出有什么不同bash# 看传统的文件拼接结果 kubectl apply -f k8s/ --dry-runclient -o yaml | head -50 # 看Kustomize整理后的结果 kubectl kustomize k8s/ | head -50你会发现同样的文件-k输出的内容更有序、更合理。这就是Kustomize的价值所在。相关阅读《从零理解Kubernetes核心概念Pod、Service、Ingress》《别再手动写K8s YAML了Helm保姆级入门指南》《一个真实项目的k8s/目录全解析》