通过 kubectl 命令在 YAML 中使用环境变量

Posted

技术标签:

【中文标题】通过 kubectl 命令在 YAML 中使用环境变量【英文标题】:using env variables in YAML with kubectl command 【发布时间】:2019-08-03 11:41:48 【问题描述】:

如何在 YAML 文件中使用环境变量?

我正在使用 kubectl 创建一个命名空间,并且想知道如何使用变量而不是 testnamespace,例如 name: $var

apiVersion: v1
kind: Namespace
metadata:
  name: testnamespace
spec:
  finalizers:
  - kubernetes

【问题讨论】:

YAML 不知道环境变量,任何此类功能都必须构建到加载 YAML 的程序中。 【参考方案1】:

作为一种解决方法,您始终可以使用命令模式创建对象,而不是将变量合并到 yaml 文件中,即

kubectl create namespace $NAME [--dry-run] [options]

问题

YAML 本身不支持变量占位符 锚点和别名确实允许某种程度的抽象和间接,但它们不能用作可插入到整个 YAML 文本中的任意区域的变量占位符。它们必须作为单独的 YAML 节点放置 有一些附加库支持任意变量占位符,但它们不是本机 YAML 规范的一部分

示例

考虑以下示例 YAML。它是格式良好的 YAML 语法,但是它使用(非标准)花括号占位符和嵌入式表达式。

嵌入的表达式不会在 YAML 中产生所需的结果,因为它们不是本机 YAML 规范的一部分。不过,在此示例中使用它们只是为了帮助说明标准 YAML 中哪些可用,哪些不可用。

part01_customer_info:
  cust_fname:   "Homer"
  cust_lname:   "Himpson"
  cust_motto:   "I love donuts!"
  cust_email:   homer@himpson.org

part01_government_info:
  govt_sales_taxrate: 1.15

part01_purchase_info:
  prch_unit_label:    "Bacon-Wrapped Fancy Glazed Donut"
  prch_unit_price:    3.00
  prch_unit_quant:    7
  prch_product_cost:  "prch_unit_price * prch_unit_quant"
  prch_total_cost:    "prch_product_cost * govt_sales_taxrate"

part02_shipping_info:
  cust_fname:   "cust_fname"
  cust_lname:   "cust_lname"
  ship_city:    Houston
  ship_state:   Hexas

part03_email_info:
  cust_email:     "cust_email"
  mail_subject:   Thanks for your DoughNutz order!
  mail_notes: |
    We want the mail_greeting to have all the expected values
    with filled-in placeholders (and not curly-braces).
  mail_greeting: |
    Greetings cust_fname cust_lname!

    We love your motto "cust_motto" and we agree with you!

    Your total purchase price is prch_total_cost

    Thank you for your order!

说明

标记为 GREEN 的替换在标准 YAML 中很容易使用,使用锚点、别名和 merge keys。

标记为 YELLOW 的替换在技术上可以在标准 YAML 中使用,但不能没有 custom type declaration 或其他一些绑定机制。

RED 中标记的替换在标准 YAML 中不可用。然而,有一些变通方法和替代方案;比如通过string formatting或者字符串模板引擎(比如python的str.format)。

详情

YAML 的一个经常请求的功能是能够插入任意变量占位符,这些占位符支持任意交叉引用和与同一(或transcluded)YAML 文件中的其他内容相关的表达式。

YAML 支持锚点和别名,但此功能不支持在 YAML 文本中任意位置放置占位符和表达式。它们仅适用于 YAML 节点。

YAML 还支持 custom type declaration,但这些不太常见,如果您接受来自潜在不受信任来源的 YAML 内容,则会存在安全隐患。

YAML 插件库

有 YAML 扩展库,但这些不是本机 YAML 规范的一部分。

Ansible https://docs.ansible.com/ansible-container/container_yml/template.html (支持对 YAML 的许多扩展,但它是一个编排工具,如果你只想要 YAML,那就有点大材小用了) https://github.com/kblomqvist/yasha https://github.com/dreftymac/dynamic.yaml https://bitbucket.org/djarvis/yamlp

解决方法

将 YAML 与模板系统(例如 Jinja2 或 Twig)结合使用 使用 YAML 扩展库 使用托管语言中的 sprintfstr.format 样式功能

另见

String interpolation in YAML how to reference a YAML "setting" from elsewhere in the same YAML file? Use YAML with variables How can I include a YAML file inside another? Passing variables inside rails internationalization yml file Can one YAML object refer to another? is there a way to reference a constant in a yaml with rails? https://learnxinyminutes.com/docs/yaml/

【讨论】:

非常好的答案,有好的来源,谢谢

以上是关于通过 kubectl 命令在 YAML 中使用环境变量的主要内容,如果未能解决你的问题,请参考以下文章

kubectl命令应用

kubectl命令应用

kubectl命令应用

《三》kubectl命令行管理工具YAML配置详解

如何在 terraform 中运行 kubectl apply 命令

kubectl 命令详解:edit