Комментарии 10
В наших кластерах для разработчиков главной проблемой является количество секретов с релизами хелма. Из за этого etcd распухает и начинаются проблемы. Правильным способом решения проблемы будет несомненно ограничение количества секретов на неймспейс, но нужно же еще и почистить. Написал как раз на днях "чистилку". Оставляет 2 последние версии каждого релиза helm
#!/bin/bash
for NS in $(kubectl get namespaces --output=jsonpath={.items..metadata.name})
do
# echo "Working with $NS namespace"
for RELEASE in $(kubectl -n "$NS" get secrets -l owner=helm -o jsonpath='{range .items[*]}{.metadata.labels.name}{"\n"}{end}' | sort | uniq)
do
echo "Processing $RELEASE in namespace $NS"
for OLD_VERSION in $(kubectl get secrets -n "$NS" -l owner=helm,name="$RELEASE" -o jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}' --sort-by=.metadata.creationTimestamp | head -n -2)
do echo "Time: $(date) Deleting $OLD_VERSION in namespace $NS"
# kubectl -n "$NS" get secrets "$OLD_VERSION" -o yaml > old-RELEASEs/"$NS"_"$OLD_VERSION".yaml
kubectl -n "$NS" delete secrets "$OLD_VERSION"
done
done
done
Но она на наших масштабах отрабатывала ооочень долго, пришлось переписать
#!/bin/bash
RELEASES=$(kubectl get secrets -A -l owner=helm -o jsonpath='{range .items[*]}{.metadata.namespace}{"\t"}{.metadata.labels.name}{"\n"}{end}' | sort | uniq -c)
while IFS= read -r RELEASE
do
COUNT=$(awk '{print $1}' <<<"$RELEASE")
RELEASE_NS=$(awk '{print $2}' <<<"$RELEASE")
RELEASE_NAME=$(awk '{print $3}' <<<"$RELEASE")
if (( COUNT > 2 ))
then
echo "Count of of versions for release $RELEASE_NAME in namespace $RELEASE_NS is greater than 2, then deleting all but 2 last"
OLD_VERSIONS=$(kubectl get secrets -n "$RELEASE_NS" -l owner=helm,name="$RELEASE_NAME" -o jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}' --sort-by=.metadata.creationTimestamp | head -n -2 | tr '\n' ' ')
kubectl -n "$RELEASE_NS" delete secrets $OLD_VERSIONS
fi
done <<< "$RELEASES"
Может пригодится кому
А при каком размере etcd начинаются проблемы?
Зависит от производительности файловой системы и железа/виртуалок.
Первые симптомы начинаются при размере базы больше гигабайта, ну и при достижении дефолтного максимального размера в 2 база разваливается. При том, что в нашем дев кластере более 50% объема занимают как раз секреты с релизами хелма
Чем опция --history-max
не подошла?
Тем, что нельзя принудить 200+ команд использовать ту или иную опцию у хелма.
Мы сами, внутри команды, которая поддерживает кластер отказались от хелма пару лет назад
Но можно попросить использовать некий степ в пайплайне, который создает нужные переменные среды, и добавляет переменную среды HELM_MAX_HISTORY
.
Если у вас один CI. Это не сложно сделать. Ну или пойти с другой стороны, и эту переменную среды устанавливать на стороне раннеров/билд-агентов.
Нет, CI так же пишут команды
А что мешает глобально для всех агентов CI выставить переменную среды HELM_MAX_HISTORY? Или же сделать степ "helm", внутри которого эта переменная определяется, а потом вызывается обычная команда "helm"? В jenkins например это делается просто.
Ваше утверждение, что CI выполняет команды, никак не опровергает мое предложение, вы прост озвучили факт. Ну да, CI умеет выполнять команды, кто же спорит с этим?
Сохраняем кластеры Kubernetes в чистоте и порядке