Pull to refresh

Comments 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% объема занимают как раз секреты с релизами хелма

У вас etcd на шпинделях что ли?

Нет, на флешовой полке, но кластер в опенстеке.

Чем опция --history-maxне подошла?

Тем, что нельзя принудить 200+ команд использовать ту или иную опцию у хелма.

Мы сами, внутри команды, которая поддерживает кластер отказались от хелма пару лет назад

Но можно попросить использовать некий степ в пайплайне, который создает нужные переменные среды, и добавляет переменную среды HELM_MAX_HISTORY.

Если у вас один CI. Это не сложно сделать. Ну или пойти с другой стороны, и эту переменную среды устанавливать на стороне раннеров/билд-агентов.

Нет, CI так же пишут команды

А что мешает глобально для всех агентов CI выставить переменную среды HELM_MAX_HISTORY? Или же сделать степ "helm", внутри которого эта переменная определяется, а потом вызывается обычная команда "helm"? В jenkins например это делается просто.

Ваше утверждение, что CI выполняет команды, никак не опровергает мое предложение, вы прост озвучили факт. Ну да, CI умеет выполнять команды, кто же спорит с этим?

Sign up to leave a comment.