Можно ли преобразовать или привести целочисленный якорь к псевдониму строки в файле yaml?
Для настройки моего контейнера 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 из...|,"value":3},{"name":|..., больший контекст...|:"solr-config"}}},{"name":"N_O_REPLICAS","value":3},
Я попытался привести к строке вручную, написав:
value: !!str *numReplicas
Но это также не работает и выдает следующую ошибку:
ошибка преобразования YAML в JSON: yaml: строка 52: не найден ожидаемый ключ
Есть ли способ создать YAML-файл Kubernetes, который позволяет повторно использовать целочисленные значения в виде строк? Или есть другое решение для этой конкретной ситуации?
2 ответа
Хотя ваш подход интересен, !!str
не является оператором приведения, и спецификация YAML ясно указывает, что то, что вы пробовали, не сработает:
Когда у узла более одного вхождения (с использованием псевдонимов), разрешение тега должно зависеть только от пути к первому (привязанному) вхождению узла.
Так что в YAML это невозможно, если парсер / загрузчик не соответствует.
Лучшее решение для вашей проблемы, IMO, заключается в том, что kubernetes явно преобразует все параметры, которые будут переменными среды, в строку перед добавлением их в среду. Таким образом, вы также можете использовать логические значения, даты и т. Д.
Вы также можете использовать любую систему шаблонов, которая вам нравится, для генерирования входных данных YAML для kubernetes, если такая система позволяет вам "структурировать" ваш целочисленный параметр.
Шлем это то, что вам нужно.
На самом деле, Helm
это нечто большее, чем то, что вам нужно, но у него есть шаблонизатор (как в Ansible), который может помочь в вашем случае. Более того, сегодня с помощью Helm
это почти обязательно для Kubernetes, просто потому, что он имеет огромную библиотеку диаграмм, которая может помочь вам очень быстро развернуть различное программное обеспечение, например, Elastic stack или Redis с помощью одной команды...(почти). Так что попробуйте, это может улучшить вашу работу с Kubernetes