Можно ли преобразовать или привести целочисленный якорь к псевдониму строки в файле yaml? - PullRequest
0 голосов
/ 11 сентября 2018

Для моей настройки контейнера AKS я хотел бы передать запрошенное количество реплик заданного набора состояний для каждого модуля через переменные среды.

Я пытался сделать это без повторения (один раз в настройке «реплики» и один раз в настройке переменных среды).

Единственное реальное решение, которое я смог найти, - это использовать привязки и псевдонимы как таковые (на основе 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, обнаружена ошибка в # 10 байт ... |, "значение": 3}, {"имя": | ..., больше context ... |: "solr-config"}}}, {"name": "N_O_REPLICAS", "value": 3},

Я попытался привести к строке вручную, написав:

value: !!str *numReplicas

Но это также не работает и выдает следующую ошибку:

ошибка преобразования YAML в JSON: yaml: строка 52: не найден ожидаемый ключ

Есть ли способ создать YAML-файл Kubernetes, который позволяет повторно использовать целочисленные значения в виде строк? Или есть другое решение для этой конкретной ситуации?

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Хотя ваш подход интересен, !!str не является оператором приведения и спецификация YAML четко указывает, что то, что вы пытались, не сработает:

Когдаузел имеет более одного вхождения (используя псевдонимы), разрешение тега должно зависеть только от пути к первому (привязанному) вхождению узла.

Таким образом, в YAML это невозможно, если только синтаксический анализатор/ загрузчик не соответствует.

Лучшее решение вашей проблемы, IMO, заключается в том, что kubernetes явно преобразует все параметры, которые будут переменными среды, в строку перед добавлением их в среду.Таким образом, вы также можете использовать логические значения, даты и т. Д.

Вы также можете использовать любую систему шаблонов, которая вам нравится, для генерирования входных данных YAML для кубернетов, если такая система позволяет вам «строково» преобразовать целочисленный параметр.

0 голосов
/ 11 сентября 2018

Шлем - это то, что вам нужно.

На самом деле, Helm - это нечто большее, чем то, что вам нужно, но у него есть шаблонизатор (как в Ansible), который может помочь в вашем случае.Более того, сегодня использование Helm почти обязательно для Kubernetes, просто потому, что у него есть огромная библиотека диаграмм, которая может помочь вам очень быстро развернуть различное программное обеспечение, например, Elastic stack или Redis с помощью одной команды ... (почти),Так что, попробуйте, это может улучшить вашу работу с Kubernetes

...