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

时间:2018-09-11 09:15:23

标签: kubernetes yaml azure-aks kubernetes-statefulset

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

我尝试不重复自己(一次在“副本”设置中,一次在环境变量设置中)。

我能找到的唯一真正的解决方案是使用锚和别名(基于Kubernetes StatefulSet - obtain spec.replicas metadata and reference elsewhere in configuration):

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”值必须是字符串,并且“ replicas”的整数值不会被转换或转换。而是抛出以下错误:

  

v1.EnvVar.v1.EnvVar.Value:ReadString:期望为“或n,但找到3,   在... |,“值”:3},{“名称”:| ...,的#10字节中发现错误   上下文... |:“ solr-config”}}},{“ name”:“ N_O_REPLICAS”,“ value”:3},

我尝试通过以下方式手动转换为字符串:

value: !!str *numReplicas

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

  

将YAML转换为JSON时出错:yaml:第52行:找不到预期的密钥

有什么方法可以创建一个Kubernetes YAML文件,该文件允许将整数值重新用作字符串?还是针对这种特殊情况有另一种解决方案?

2 个答案:

答案 0 :(得分:1)

Helm是您所需要的。

实际上,Helm远远超出了您的需求,但是它具有模板引擎(就像在Ansible中一样),可以为您的案例提供帮助。此外,今天使用Helm几乎是Kubernetes的强制性要求,因为它具有庞大的图表库,可以帮助您非常快速地部署不同的软件,例如通过一个命令来部署Elastic stack或Redis。几乎)。因此,尝试一下,它可以改善您使用Kubernetes的工作

答案 1 :(得分:1)

尽管您的方法很有趣,但是!!str不是强制转换运算符,YAML specification清楚地表明您尝试执行的操作无效:

  

当一个节点出现多个(使用别名)时,标签解析必须仅取决于该节点第一次(锚定)出现的路径。

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

对于您的问题,最好的解决方案是IMO,即kubernetes在将它们添加到环境之前,将所有将作为环境变量的参数显式转换为字符串。这样,您也可以使用布尔值,日期等。

您还可以使用任何想要为kubernetes生成YAML输入的模板系统,只要该系统允许您“字符串化”您的整数参数即可。