Helm: Выполнение команды в других контейнерах в Job - PullRequest
1 голос
/ 09 мая 2019

Я хочу использовать Charts Hooks post-install, чтобы выполнить какое-либо действие над контейнером моего развертывания.

Например, у меня есть php-fpm контейнер, который состоит из Laravel приложение, и я хочу запустить php artisan key:gen при установке.Поскольку это однократная команда, поэтому я не могу поместить ее в жизненный цикл postStart, в противном случае она будет перезаписывать APP_KEY.

Как я могу использовать Диаграммы-крючки чтобы достичь этого?Или есть лучший способ?

Ответы [ 3 ]

1 голос
/ 09 мая 2019

Если вы думаете о жизненном цикле этого ключа: если есть несколько реплик pod, они должны договориться о том, что это за ключ;и если вы удаляете и воссоздаете модуль, он должен использовать тот же ключ, который использовался ранее.(Быстрый поиск в Google дает несколько хороших описаний , для чего этот ключ фактически используется для ; например, если он шифрует сеансовые файлы cookie, каждая копия модуля действительно должна согласовываться.)

Это предполагает установку, в которой вы генерируете ключ один раз, сохраняете его в секрете Kubernetes и делаете его доступным для модулей.Для удобства "любая переменная в вашем файле .env может быть переопределена внешними переменными среды" , а вы можете установить переменную среды из секретного значения .Не существует отличного способа заставить Хелма сгенерировать сам секрет способом, который будет сохранен.

Итак, соединяя эти кусочки: в вашей спецификации модуля (в вашей спецификации развертывания) вам нужно получитьПеременная окружения из секрета.

env:
  - name: APP_KEY
    valueFrom:
      secretKeyRef:
        name: "{{ .Release.Name }}-{{ .Chart.Name }}"
        key: app-key

Затем необходимо создать секрет для хранения ключа.

apiVersion: v1
kind: Secret
metadata:
  name: "{{ .Release.Name }}-{{ .Chart.Name }}"
data:
  app-key: {{ printf "base64:%s" .Values.appKey | b64enc }}

И, наконец, создать файл, содержащий ключ.Это не должно быть отмечено как часть вашей диаграммы.

echo "appKey: $(dd if=/dev/urandom bs=32 count=1 | base64)" > values-local.yaml

Когда вы собираетесь установить свою диаграмму, используйте этот файл значений

helm install ./charts/myapp -f values-local.yaml

Есть несколько других разумных подходовэто включает в себя вставку всего файла .env как ConfigMap или Secret, или расширение вашего образа Docker для создания этого файла самостоятельно из значений, которые передаются в него, или использование контейнера init для генерации файла перед запуском основного контейнера.Дело в том, что стручки приходят и уходят и должны иметь возможность настраивать себя при запуске;использование kubectl exec так, как вы предлагаете, не является хорошей практикой.

0 голосов
/ 09 мая 2019

Ваша работа должна запускать контейнер, содержащий kubectl, и вы должны выполнить этот скрипт для выполнения в другом контейнере. Так как kubectl exec не поддерживает выбор по меткам , вам необходимо предварительно получить имя модуля:

$pod=$(kubectl get pods --no-headers -o custom-columns=":metadata.name" -l YOUR-LABELS=YOUR-VALUES)
kubectl exec $pod php artisan key:gen
0 голосов
/ 09 мая 2019

Вы можете определить задание, которое будет запускаться только один раз, когда установлена ​​диаграмма Helm:

apiVersion: batch/v1
kind: Job
metadata:
  name: "{{.Release.Name}}"
  labels:
    app.kubernetes.io/managed-by: {{.Release.Service | quote }}
    app.kubernetes.io/instance: {{.Release.Name | quote }}
    app.kubernetes.io/version: {{ .Chart.AppVersion }}
    helm.sh/chart: "{{.Chart.Name}}-{{.Chart.Version}}"
  annotations:
    # This is what defines this resource as a hook. Without this line, the
    # job is considered part of the release.
    "helm.sh/hook": post-install
    "helm.sh/hook-weight": "-5"
    "helm.sh/hook-delete-policy": hook-succeeded
spec:
  template:
    metadata:
      name: "{{.Release.Name}}"
      labels:
        app.kubernetes.io/managed-by: {{.Release.Service | quote }}
        app.kubernetes.io/instance: {{.Release.Name | quote }}
        helm.sh/chart: "{{.Chart.Name}}-{{.Chart.Version}}"
    spec:
      restartPolicy: Never
      containers:
      - name: post-install-job
        image: "alpine:3.3"
        command: ["/bin/sleep","{{default "10" .Values.sleepyTime}}"]

Если вы хотите запускать задание каждый раз при обновлении диаграммы - вы можете указать ловушку «после обновления»,Подробнее здесь: https://github.com/helm/helm/blob/master/docs/charts_hooks.md

...