是否可以将整数锚点转换或转换为 yaml 文件中的字符串别名?



对于我的 AKS 容器设置,我想通过环境变量将给定状态集的请求副本数传递给每个 pod。

我试图在不重复自己的情况下执行此操作(一次在"副本"设置中,一次在环境变量设置中(。

我能找到的关于如何做到这一点的唯一真正的解决方案是使用锚点和别名(基于 Kubernetes StatefulSet - 在配置中的其他地方获取 spec.replicas 元数据和引用(:

apiVersion: apps/v1
kind: StatefulSet
metadata:
name: solr
spec:
selector:
matchLabels:
app: solr
serviceName: solr-hs
replicas: &numReplicas 3
updateStrategy:
type: RollingUpdate
# Make sure pods get created sequentially
podManagementPolicy: OrderedReady
template:
metadata:
labels:
app: solr
spec:
containers:
- name: kubernetes-solr
imagePullPolicy: Always
image: "..."
resources:
requests:
memory: "8Gi"
cpu: "0.5"
ports:
- containerPort: 8983
env:
- name: N_O_REPLICAS
value: *numReplicas

不幸的是,似乎"env"值必须是一个字符串,并且"副本"的整数值不会被强制转换或转换。相反,将引发以下错误:

v1.EnvVar.v1.EnvVar.Value: ReadString: 期望 " 或 n,但找到 3, 在 #10 字节中发现错误 ...|,"值":3},{"名称":|..., 更大 context ...|:"solr-config"}}},{"name":"N_O_REPLICAS","value":3},

我尝试通过编写以下内容手动转换为字符串:

value: !!str *numReplicas

但这也不起作用,并引发以下错误:

将 YAML 转换为 JSON 时出错: yaml:第 52 行:未找到预期的键

有没有办法创建一个允许将整数值重用为字符串的 Kubernetes YAML 文件?或者对于这种特殊情况,是否有其他解决方案?

尽管您的方法很有趣,但!!str不是强制转换运算符,并且 YAML 规范清楚地表明您尝试的内容不起作用:

当节点有多个匹配项(使用别名(时,标记解析必须仅取决于节点首次出现(锚定(的路径。

因此,在 YAML 中,这是不可能的,除非解析器/加载器不符合要求。

IMO 是您的问题的最佳解决方案是 kubernetes 将所有将成为环境变量的参数显式转换为字符串,然后再将它们添加到环境中。这样你也可以使用布尔值、日期等。

您还可以使用任何您喜欢的模板系统为 kubernetes 生成 YAML 输入,只要这样的系统允许您"字符串化"您的整数参数。

Helm 是你需要的。

实际上,Helm比您需要的更多,但它有一个模板引擎(就像在 Ansible 中一样(,可以帮助您处理情况。此外,今天使用Helm它几乎是 Kubernetes 的强制性要求,只是因为它有一个庞大的图表库,可以帮助您非常快速地部署不同的软件,例如 Elastic 堆栈或 Redis 通过一个命令......(几乎(。所以,试试这个,它可以改善你对Kubernetes的工作

最新更新