十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Podman ConfigMap 选项详解:从 `podman kube play --configmap` 到 Quadlet `ConfigMap=`

Podman ConfigMap 选项详解:从 `podman kube play --configmap` 到 Quadlet `ConfigMap=` Podman ConfigMap 选项详解从podman kube play --configmap到 QuadletConfigMap【免费下载链接】podmanPodman: A tool for managing OCI containers and pods.项目地址: https://gitcode.com/gh_mirrors/po/podman本文围绕 Podman 中 Kubernetes ConfigMap 的注入机制展开系统讲解podman kube play --configmap命令行选项与 Quadlet 单元文件ConfigMap键的完整用法、底层解析流程与实战注意事项。读完本文你将掌握如何通过本地 ConfigMap YAML 为 Pod 内容器注入环境变量、如何一次传入多个 ConfigMap、如何将相对路径用于 Quadlet 部署并能从源码层面理解 Podman 校验与合并 ConfigMap 的内部实现。一、选项概览同一功能的两种形态在 Podman 仓库中ConfigMap 选项由一份共享文档定义同时服务于两个入口CLI 命令podman kube play与 Quadlet 的.kube单元文件。该共享文档位于 docs/source/markdown/options/configmap.md其开头明确说明它被用于podman kube playpodman-kube.unit.5.md.inQuadlet 单元文件手册两者语义相同——使用指定的 Kubernetes ConfigMap YAML 文件为 Pod 内容器提供环境变量值——但语法与路径解析规则略有差异下文分别展开。形态语法多文件支持路径解析CLI 选项--configmap*path*可多次指定或逗号分隔列表相对当前工作目录Quadlet 键ConfigMap*path*仅支持单个路径相对单元文件所在目录二、CLI 用法podman kube play --configmap2.1 基本语法podman kube play --configmap /path/to/configmap.yaml /path/to/kube.yaml该选项的官方说明为使用指定路径的 Kubernetes ConfigMap YAML为 Pod 内容器提供环境变量值。注意文档特别标注此选项在远程 Podman 客户端remote client下不可用只能在本地执行podman kube play时使用。在命令行实现中该选项被注册为字符串数组可重复指定其定义位于 cmd/podman/kube/play.goconfigmapFlagName : configmap flags.StringArrayVar(playOptions.ConfigMaps, configmapFlagName, []string{}, Pathname of a YAML file containing a kubernetes configmap) _ cmd.RegisterFlagCompletionFunc(configmapFlagName, completion.AutocompleteDefault)从源码可以看到两点通过StringArrayVar注册因此该选项可以被重复指定多次注册了AutocompleteDefault补全函数交互式 Shell 下按 Tab 即可自动补全本地 YAML 文件路径。对应的领域模型字段在 pkg/domain/entities/play.go 中定义// ConfigMaps - slice of pathnames to kubernetes configmap YAMLs. ConfigMaps []string2.2 传入多个 ConfigMap官方文档明确说明--configmap选项可以多次使用也可以使用逗号分隔的路径列表来传入多个 Kubernetes ConfigMap YAML。两种等价写法# 方式一重复使用选项 podman kube play \ --configmap ./cm-app.yaml \ --configmap ./cm-db.yaml \ ./kube.yaml # 方式二逗号分隔 podman kube play --configmap ./cm-app.yaml,./cm-db.yaml ./kube.yaml在 bindingsREST API 客户端封装层同样以切片形式透传见 pkg/bindings/kube/kube.go 与 pkg/bindings/kube/types_play_options.go 中的WithConfigMaps/GetConfigMaps。2.3 YAML 格式要求--configmap指向的 YAML 文件需要满足以下要求必须是 ConfigMap 类型的对象kind: ConfigMap可以是多文档multi-docYAML 格式即一个文件内用---分隔多个 ConfigMap文件中只能包含 ConfigMap不能混入其他 Kubernetes 资源类型。一个合法的 ConfigMap 文件示例单一文档apiVersion: v1 kind: ConfigMap metadata: name: app-config data: LOG_LEVEL: debug APP_MODE: production DATABASE_URL: postgres://db.example.com:5432/app多文档格式示例一个文件内两个 ConfigMapapiVersion: v1 kind: ConfigMap metadata: name: app-config data: LOG_LEVEL: debug --- apiVersion: v1 kind: ConfigMap metadata: name: db-config data: DB_PORT: 5432 DB_POOL_SIZE: 10而在被kube play的 Pod/Deployment YAML 中通过标准的 Kubernetes 语义引用这些 ConfigMap 键如envFrom或valueFrom.configMapKeyRef即可把对应值注入容器环境变量。三、源码视角ConfigMap 的解析、校验与合并3.1 文件读取与多文档拆分在服务端实现 pkg/domain/infra/abi/play.go 中Podman 会遍历options.ConfigMaps中的每个路径打开文件并调用readConfigMapFromFile解析for _, p : range options.ConfigMaps { f, err : os.Open(p) if err ! nil { return nil, nil, err } defer f.Close() cms, cmWarnings, err : readConfigMapFromFile(f, options.Validate) if err ! nil { return nil, nil, fmt.Errorf(%q: %w, p, err) } ... }readConfigMapFromFile的实现位于同文件 pkg/domain/infra/abi/play.go其处理流程清晰可循读取全部内容io.ReadAll读取 YAML 数据拆分多文档调用splitMultiDocYAML借助yaml.v3解码器按---切分每个独立文档见 pkg/domain/infra/abi/play.go空文档会被跳过校验资源类型通过getKubeKind检查每个文档的kind若不为ConfigMap直接报错if kind ! ConfigMap { return nil, nil, fmt.Errorf(invalid YAML kind: %q. [ConfigMap] is the only supported by --configmap, kind) }这印证了文档中YAML 文件可以多文档但必须只包含 ConfigMaps的限制——任何非 ConfigMap 文档都会导致整个文件解析失败。3.2 与 YAML 内嵌 ConfigMap 的冲突检测值得注意的是Pod YAML 自身也可以内嵌定义 ConfigMap。当--configmap传入的 ConfigMap 与 YAML 内嵌的 ConfigMap同名时Podman 会拒绝执行返回明确的歧义错误pkg/domain/infra/abi/play.goconfigMapIndex : make(map[string]struct{}) for _, configMap : range configMaps { configMapIndex[configMap.Name] struct{}{} } ... for _, cm : range cms { if _, present : configMapIndex[cm.Name]; present { return nil, nil, fmt.Errorf(ambiguous configuration: the same config map %s is present in YAML and in --configmaps %s file, cm.Name, p) } configMaps append(configMaps, cm) }因此实践中应避免同一 ConfigMap 既写在 Pod YAML 里、又通过--configmap传入保持单一来源。3.3 ConfigMap 驱动卷挂载除了环境变量ConfigMap 还可以被 Pod 中的卷引用。解析得到的 ConfigMaps 会连同 Pod YAML 中的spec.volumes一起传给kube.InitializeVolumespkg/domain/infra/abi/play.go。对于KubeVolumeTypeConfigMap类型的卷Podman 会为每个非可选!v.Optional的 ConfigMap 卷创建一个本地 libpod 卷并依据卷的items定义把键值写入挂载点文件pkg/domain/infra/abi/play.go。若卷已存在则直接复用不会重复创建。四、Quadlet 用法.kube单元文件中的ConfigMap4.1 语法与路径规则在 Quadlet 场景下ConfigMap是[Kube]小节的有效键对应关系在 docs/source/markdown/podman-kube.unit.5.md.in 的选项映射表中有明确记载[Kube] 选项podman kube play 等价命令ConfigMap/tmp/config.map--configmap /tmp/config.map与 CLI 形态不同Quadlet 版本文档特别强调了两条约束值只能包含一个路径不能逗号分隔、不能重复指定该路径可以是绝对路径也可以是相对路径相对基准是单元文件unit file所在的位置。这与Yaml键的路径解析规则一致整个.kube单元由podman-system-generator在开机或systemctl daemon-reload时解析生成调用podman kube play的 systemd 服务。4.2 完整示例[Unit] DescriptionA kubernetes yaml based service with configmap Beforelocal-fs.target [Kube] Yaml/opt/k8s/deployment.yml ConfigMapconfigmap/app-config.yml [Install] # Start by default on boot WantedBymulti-user.target default.target上面的ConfigMapconfigmap/app-config.yml是相对路径Quadlet 会以.kube单元文件所在目录为基准解析它最终生成类似ExecStartpodman kube play --configmap /path/to/unit/configmap/app-config.yml /opt/k8s/deployment.yml的服务。如果你需要保证路径在不同工作目录下都可正确解析也可以考虑配合SetWorkingDirectory使用。该键支持yaml工作目录设为 YAML 文件所在位置与unit工作目录设为单元文件所在位置两个取值用于辅助podman kube play正确解析相对路径docs/source/markdown/podman-kube.unit.5.md.in。生成服务后用常规 systemd 命令管理即可systemctl --user daemon-reload systemctl --user start name.service五、注意事项与限制汇总本选项的边界条件供实际部署时参考远程客户端不可用--configmap仅在本地podman kube play中生效远程 Podmanpodman --remote/ podman-remote无法使用该选项仅接受 ConfigMap 类型传入的 YAML 文件包括多文档格式中的每个文档kind必须为ConfigMap混入其他资源会导致解析失败同名冲突会报错同一 ConfigMap 名同时出现在 Pod YAML 内嵌定义与--configmap文件中时Podman 以ambiguous configuration错误拒绝执行Quadlet 单路径限制.kube单元中的ConfigMap只接受一个路径且相对路径以单元文件位置为基准环境变量注入依赖 Kubernetes 语义ConfigMap 的值需要 Pod YAML 通过envFrom或valueFrom.configMapKeyRef等标准字段引用才会进入容器环境变量。六、延伸阅读选项共享文档docs/source/markdown/options/configmap.mdQuadlet.kube单元完整手册docs/source/markdown/podman-kube.unit.5.md.inCLI 参数注册cmd/podman/kube/play.go服务端解析与冲突检测pkg/domain/infra/abi/play.goConfigMap 文件解析实现pkg/domain/infra/abi/play.goREST bindings 封装pkg/bindings/kube/kube.go 与 pkg/bindings/kube/types_play_options.go【免费下载链接】podmanPodman: A tool for managing OCI containers and pods.项目地址: https://gitcode.com/gh_mirrors/po/podman创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表