Andrei
Алексей
Коллеги приветствую. Подскажите по шаблону HELM пожалуйста.
Сделал такой вот сложный range c вложенными range соответственно. Но проблема с переменными.
{{- range $key, $val := .Values.deployment }}
{{- $ServiceName := $key }}
{{- if eq $key "worker" }}
{{- $ServiceNameEnv := "sentry" }}
{{- else }}
{{- $ServiceNameEnv := $key }}
{{- end }}
# первый вложенный range
{{- range $key, $val := $item.volumes }}
- name: sentry-postgresql-data
persistentVolumeClaim:
claimName: sentry-postgresql
{{- end }}
# второй вложенный range
{{- range $key, $val:= $env }}
{{/*$ServiceNameEnv*/}}
{{- if eq $key $ServiceName }}
{{- range $key, $val := . }}
- name: {{$key}}
{{- if . }}
value: {{ . }}
{{- end }}
{{- end }}
{{- end }}
{{- end }}
{{end}}
Проблема в том, что одна перменная во вложенных range видится, в вторая нет.
Видится $ServiceName
не видится $ServiceNameEnv
Можете подсказать с чем может быть связано?
Вне вложенных range $ServiceNameEnv выводится без ошибок.
Pavel
{{- range $key, $val := . }}
Пееропределение переменных
Алексей
Алексей
Переопределение работает только внутри range
Pavel
можно полны текст
Алексей
можно полны текст
{{- $fullName := include "sentry.fullname" . -}}
{{- $ChartName := include "sentry.chart" . -}}
{{- $ReleaseName := .Release.Name -}}
{{- $ReleaseService := .Release.Service -}}
{{- $env := .Values.env -}}
{{- $secret_env := .Values.secret_env -}}
{{- range $key, $val := .Values.deployment }}
{{- $item := . -}}
{{- $servicePort := $item.service.port -}}
{{- $ServiceName := $key }}
{{- if eq $key "worker" }}
{{$key}}
{{- $ServiceNameEnv := "sentry" }}
$ServiceNameEnv == sentry - {{ $ServiceNameEnv }}
{{- else }}
{{$key}} {{$key}} {{$key}}
{{- $ServiceNameEnv := $key }}
$ServiceNameEnv: {{ $ServiceNameEnv }}
{{- end }}
---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: {{ $fullName }}-{{ $key }}
labels:
app: {{ $fullName }}
chart: {{ $ChartName }}
release: {{ $ReleaseName }}
heritage: {{ $ReleaseService }}
service: {{ $ServiceName }}
spec:
replicas:
template:
metadata:
labels:
app: {{ $fullName }}
chart: {{ $ChartName }}
release: {{ $ReleaseName }}
heritage: {{ $ReleaseService }}
service: {{ $ServiceName }}
spec:
volumes:
{{- range $k1, $v1 := $item.volumes }}
{{/*$ServiceNameEnv*/}}
- name: sentry-postgresql-data
persistentVolumeClaim:
claimName: sentry-postgresql
{{- end }}
containers:
- name: sentry-postgresql
image: {{.image.repository}}
ports:
- name: {{$ServiceName}}
containerPort: {{.service.port}}
env:
- name: POD_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
{{- range $k2, $v2:= $env }}
{{/* $ServiceNameEnv */}}
{{- if eq $k2 $ServiceName }}
{{- range $k2, $val := . }}
- name: {{$k2}}
{{- if . }}
value: {{ . }}
{{- end }}
{{- end }}
{{- end }}
{{- end }}
# From Secret
{{- range $k3, $v3 := $secret_env }}
{{- $secretName := $k3 }}
{{- if eq $k3 $ServiceName }}
{{- range . }}
- name: {{ . }}
valueFrom:
secretKeyRef:
name: {{ $secretName }}
key: {{ . }}
{{- end }}
{{- end }}
{{- end }}
volumeMounts:
{{- if .volumeMounts }}
{{- range $key, $val := .volumeMounts }}
- name: {{$key}}
mountPath: {{.path}}
{{- if .subPath }}
subPath: {{ .subPath }}
{{- end }}
{{- end }}
{{ end }}
{{- end }}
Алексей
Вот внутри range $k1 $k2 $k3 $ServiceNameEnv недоступна, а $ServiceName видна
Artem
/report
Pavel
{{- if eq $key "worker" }}
{{$key}}
{{- $ServiceNameEnv := "sentry" }}
$ServiceNameEnv == sentry - {{ $ServiceNameEnv }}
{{- else }}
{{$key}} {{$key}} {{$key}}
{{- $ServiceNameEnv := $key }}
$ServiceNameEnv: {{ $ServiceNameEnv }}
{{- end }}
У Вас в записи if два формата,
Pavel
Вы либо назначайте значение либо это шаблонное значение
Алексей
Pavel
этот блок весь можно выкинуть?
Pavel
{{- if eq $key "worker" }}
{{- $ServiceNameEnv := "sentry" }}
{{- else }}
{{- $ServiceNameEnv := $key }}
{{- end }}
Pavel
или так оставить
Rainbow
@twwlf @shursh Спасибо 👍
Pavel
Алексей
Pavel
В теории вы внутри блока определил новую переменную и область видимости у нее внутри этого блока.
Andrei
Ребят, а есть возможность прибить pod в statefulset к ноде? Чтобы, к примеру, pod-N всегда запускался на той ноде где был. Было бы очень полезно при использовании local volumes
Andor
разумеется
Andrei
Как? Сейчас, к примеру, 6 нод с нужной меткой и replicaCount == 6. Но если удалить два пода, то они легко меняются местами
Pavel
Affinity
Pavel
+ метки НОД. Если не зачто зацепиться
Andrei
Эм, сейчас они с topologyKey hostname
Andrei
А можно ткнуть в пример как pod-3 привязать к node-3?
Pavel
Интересный пример. Домой приеду, поищу рншение
Andrei
Вот ишью https://github.com/kubernetes/kubernetes/issues/65267
Я надеялся на смекалку нашего брата)
Pavel
Влоб и не универсально: добавить метку pod-3 на хост node-3 и по не й сделать афинити
Pavel
Метки у хостов ест?
Pavel
В афинити говорим что запускаться только на узле у которой есть метка
Andrei
Есть, и? Да, допустим у нас 6 хостов с метками, nodeSelector натравлен на них и replicaCount == 6. Теперь мы удаляем 2 пода и они перезапускаются, к примеру, 5 на ноде где был 6 и наоборот.
Pavel
Метки node-1: pod-1, node-2: pod-2. В афинити вы указывает что выборка идёт по метками и там где метка равна имени рода, можно запустить под.
Михаил
Всем привет. Контейнер ушёл в рестарт и теперь пишет в статусе restarting
Михаил
Что можно сделать?
Михаил
Docker restart
Andrei
Посмотреть логи?
Pavel
kubectl describe
Михаил
Чистый докер
Михаил
Не курьер
Михаил
Кубер
Andrei
Pavel
Да
Andor
а разве стейтфулсет не будет запускаться на том же хосте где его клайм выделил волюм?
Pavel
Хм или нет... Сейчас дойду проверю
Andor
иначем зачем вот эти все локалволюмы
Andrei
Andor
ты точно нигде не ошибся?
Andrei
Да где там можно ошибиться. Тут вопрос не в перезапуске пода/ноды с подом. А трабл когда две ноды перезапускаются: поды могут легко перепрыгнуть
Andrei
Т.е. при RollingUpdate c maxUnavailable 1, все ок
Я там ишью выше скинул, говорят пока не завезли такого функционала (хотя там немного о другом)
В общем, нужно лепить шедулер
V
Andrei
И нет и да
Andrei
partitiion позволяет оставлять часть подов в repicaset со старой версией
V
И нет и да
Да - это в каких случаях? Если не секрет :)
𝚔𝚟𝚊𝚙𝚜
Правильное решение - это проставить nodeAffinity для каждого local volume
V
Andrei
𝚔𝚟𝚊𝚙𝚜
Нет
𝚔𝚟𝚊𝚙𝚜
Аффинити нужно не для подов добавлять а для president volume
V
Ведь если, в общем случае, между pod в StatefullSet нет разницы, кроме, пожалуй, имени, то не имеет значения, по всей видимости, где какой pod запущен. Или имеет?
Andrei
Если это кластер clickhouse, то имеет) Живет прекрасно, но вот это не дает мне покоя
𝚔𝚟𝚊𝚙𝚜
А каждый под в StatefulSet должен иметь свой pvc слинкованный с этим pv
𝚔𝚟𝚊𝚙𝚜
Andrei
𝚔𝚟𝚊𝚙𝚜
https://github.com/kvaps/docker-linstor#complex-solution-with-postgresql-database
Andor
может есть просто оператор для кх?
V
Andor
оно
Andor
о других кликхаусах лично я не слышал
Andrei
Andrei
В общем, завтра кастомный шедулер запилю, велосепидить так до конца
Andrei
Просто кто-то тут хвалился монгой в кубе, а там же теже проблемы всплывают
Andor
что-то не гуглится оператор, да
Andor
для монги сходу можно найти штуки три
Andrei
Я про вариант на StatefulSet, а операторов, да, хватает
Andor
а зачем руками делать стейтфулсет если есть оператор?