K8S之创建cm指令create和 apply的区别

这两种命令都是用来创建或更新 ConfigMap 的,但它们的工作原理、适用场景和行为模式有本质区别 。简单来说,create --from-file 是从现有配置文件 直接生成一个 ConfigMap,而 apply -f 是向 Kubernetes 声明并应用一个期望的资源配置状态

下面这张表清晰地展示了两者的核心差异:

特性维度 kubectl create cm --from-file (命令式命令) kubectl apply -f (声明式对象配置)
核心理念 "做什么":执行一个具体的创建动作。 "要什么":声明资源的最终期望状态。
配置来源 本地文件系统 的配置文件(.properties, .txt, .conf 等)。 YAML/JSON 格式的 Kubernetes 资源定义清单。
操作性质 命令式:直接下达创建指令。 声明式:系统根据你的描述去确保状态一致。
幂等性 非幂等 :如果资源已存在,会报错 AlreadyExists 幂等:可以反复执行,用于创建或更新。
更新方式 无法直接更新,通常需要先 deletecreate,或使用 replace 可直接更新 :修改 YAML 文件后再次 apply 即可。
版本控制友好度 较低。命令本身不记录,需要额外保存生成命令或使用的源文件。 极高。YAML 文件本身就是配置的版本记录。

📝 详细解析与使用场景

1. kubectl create configmap --from-file

这种方式适用于快速从现有的、独立的配置文件(如应用打包目录里的配置文件)生成 ConfigMap。

  • 常见用法

    bash

    复制代码
    # 从单个文件创建,key 默认为文件名 “app.properties”
    kubectl create cm cube-config --from-file=./config/app.properties
    
    # 从单个文件创建,并自定义 key 名
    kubectl create cm cube-config --from-file=my-app-config=./config/app.properties
    
    # 从一个目录下的所有文件创建
    kubectl create cm cube-config --from-file=./config/
    
    # 混合创建:同时来自文件和字面值
    kubectl create cm cube-config \
      --from-file=./config/app.properties \
      --from-literal=environment=production
  • 典型场景 :在开发或 CI/CD 流水线中,你有一个现成的 application.properties,想直接把它放入集群作为配置使用,这时用 --from-file 非常快捷。

2. kubectl apply -f

这种方式是 Kubernetes 声明式管理的核心 。你首先需要编写一个描述 ConfigMap 资源完整状态的 YAML 文件。

  • YAML 文件示例 (correct-cube-config.yaml):

    yaml

    复制代码
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: cube-config
      namespace: default # 可指定命名空间
    data:
      # 方式1:直接嵌入多行文本 (使用 |)
      app.properties: |
        server.port=8080
        database.host=mysql
        logging.level=INFO
    
      # 方式2:直接定义键值对
      environment: production
      version: "1.0"
    
      # 方式3:嵌入另一个文件的单行内容
      some-key: this is a single line value
  • 典型操作流程

    bash

    复制代码
    # 1. 首次创建
    kubectl apply -f correct-cube-config.yaml
    
    # 2. 修改 correct-cube-config.yaml 文件内容后,再次执行以更新
    kubectl apply -f correct-cube-config.yaml
    
    # 3. 查看 apply 记录的历史配置
    kubectl rollout history configmap/cube-config

💡 如何选择与转换

  • 选择建议

    • 对于一次性、临时的、或配置与源码分离管理 的情况,create --from-file 很方便。

    • 对于生产环境、需要版本控制、持续维护和团队协作 的配置,apply -f 配合 YAML 文件是唯一推荐的方式。

  • 两者转换:你可以很容易地将一种方式生成的 ConfigMap 转换为另一种方式所需的格式。

    bash

    复制代码
    # 将集群中已有的 `cube-config` 导出为声明式的 YAML 文件,这正是 `apply` 所需的。
    kubectl get cm cube-config -o yaml > cube-config.yaml
    
    # 将本地配置文件转换为一个用于 `apply` 的 YAML 模板
    # 这里利用 `kubectl create` 的 dry-run 和 yaml 输出功能
    kubectl create cm cube-config --from-file=./config/app.properties --dry-run=client -o yaml > cube-config-template.yaml

📊 总结与最佳实践

简而言之,create 是一个一次性命令 ,而 apply 是一个持续管理流程

在现代 Kubernetes 的 GitOps 实践中,几乎总是使用 kubectl apply -f (或其背后的工具如 kustomize, helm) 配合 YAML 文件。这种方式能将所有基础设施配置代码化,便于审查、回滚和自动化,是实现可靠运维的基石。

相关推荐
爱学习的小可爱卢4 小时前
JavaEE进阶——SpringBoot统一功能处理全解析
java·spring boot·后端·java-ee
汤姆yu4 小时前
基于springboot的二手物品交易系统的设计与实现
java·spring boot·后端
java_logo4 小时前
Transmission Docker 容器化部署指南
运维·docker·容器·kubernetes·apache·rocketmq·transmission
中国胖子风清扬4 小时前
Spring AI Alibaba + Ollama 实战:基于本地 Qwen3 的 Spring Boot 大模型应用
java·人工智能·spring boot·后端·spring·spring cloud·ai
foundbug9995 小时前
Modbus协议C语言实现(易于移植版本)
java·c语言·前端
听风吟丶5 小时前
Java 反射机制深度解析:从原理到实战应用与性能优化
java·开发语言·性能优化
一缕猫毛5 小时前
Flink demo代码
java·大数据·flink
小安同学iter5 小时前
天机学堂-优惠券功能-day09(七)
java·spring cloud·微服务·jenkins·优惠券·天机学堂
it_czz5 小时前
MCP调用流程图
java