2

对于我的 AKS 容器设置,我想通过环境变量将给定 statefulset 的请求数量的副本传递给每个 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”值似乎必须是一个字符串,并且“replicas”的整数值不会被转换或转换。而是引发以下错误:

v1.EnvVar.v1.EnvVar.Value: ReadString: 需要 " 或 n,但找到了 3,在 ...|,"value":3},{"name":|...的#10 字节中发现错误更大的上下文 ...|:"solr-config"}}},{"name":"N_O_REPLICAS","value":3},

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

value: !!str *numReplicas

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

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

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

4

2 回答 2

1

Helm是您所需要的。

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

于 2018-09-11T10:24:21.703 回答
1

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

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

所以在 YAML 中这是不可能的,除非解析器/加载器不符合规范。

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

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

于 2018-09-11T10:48:46.430 回答