Helm Hook для запуска команды kubectl - PullRequest
0 голосов
/ 22 октября 2019

Я хотел бы запустить команду kubectl из предварительного обновления helm hook, но я не могу найти какую-либо документацию о том, как этого добиться.

Нужно ли создавать образ докера, содержащий kubectl, чтобы добиться этого?

или есть какой-то способ добиться этого без использования контейнера?

У меня есть базовый helm hook, который выглядит следующим образом


apiVersion: batch/v1
kind: Job
metadata:
  name: {{ .Chart.Name }}-change-pvc-hook
  labels:
    app: {{ .Chart.Name }}
  annotations:
    "helm.sh/hook": pre-upgrade
    "helm.sh/hook-delete-policy": hook-succeeded, before-hook-creation
spec:
  template:
    metadata:
      name: "{{.Release.Name}}"
      labels:
        app: {{ .Chart.Name }}
    spec:
      restartPolicy: Never
      containers:
        - name: pre-upgrade-change-pvc

, если бы кто-то мог объяснить, как запустить kubectl без контейнера или как я могу этого добиться, это было быбольшой

Ответы [ 3 ]

0 голосов
/ 31 октября 2019

Нужно ли создавать образ докера, который содержит kubectl, чтобы достичь этого?

Да, вы должны создать его, потому что контейнеры обычно легкие и содержат самые простые вещи. ,Вы можете создать контейнер с kubernetes, используя Dockerfile .

Второй вариант - создать собственный мутирующий webhook , который будет изменять PVC (используя patch ).

Мутирующий доступ Сначала запускаются веб-хуки, которые могут изменять объекты, отправляемые на сервер API, для применения пользовательских настроек по умолчанию. После того, как все изменения объекта завершены, и после того, как входящий объект проверен сервером API, вызываются проверочные веб-зацепки и могут отклонять запросы для применения пользовательских политик.

Таким образом, вы можете изменить PVC до Helm install создаст релиз.

0 голосов
/ 31 октября 2019

Вы можете сделать это так, как оператор Prometheus выполняет очистку (хук предварительного удаления) в своей диаграмме управления: Использование kubectl оператора Prometheus

в основном, вы можете использовать изображение = k8s.gcr.io/hyperkube:v1.12.1 как-то так:

apiVersion: batch/v1
kind: Job
metadata:
  name:somename-operator-cleanup
  namespace: somenamespace
  annotations:
    "helm.sh/hook": pre-delete
    "helm.sh/hook-weight": "3"
    "helm.sh/hook-delete-policy": hook-succeeded
  labels:
    app: someapp-operator
spec:
  template:
    metadata:
      name: somename-operator-cleanup
      labels:
        app: someapp
    spec:
    {{- if .Values.global.rbac.create }}
      serviceAccountName: {{ template "prometheus-operator.operator.serviceAccountName" . }}
    {{- end }}
      containers:
        - name: kubectl
          image: "k8s.gcr.io/hyperkube:v1.12.1"
          imagePullPolicy: "IfNotPresent"
          command:
          - /bin/sh
          - -c
          - >
              kubectl your command here.
              kubectl delete alertmanager   --all;
              kubectl delete prometheus     --all;
              kubectl delete prometheusrule --all;
              kubectl delete servicemonitor --all;
              sleep 10;
              kubectl delete crd alertmanagers.monitoring.coreos.com;
              kubectl delete crd prometheuses.monitoring.coreos.com;
              kubectl delete crd prometheusrules.monitoring.coreos.com;
              kubectl delete crd servicemonitors.monitoring.coreos.com;
              kubectl delete crd podmonitors.monitoring.coreos.com;
      restartPolicy: OnFailure

Другой вариант - CURL для API Kubernetes, например здесь обратите внимание, что вам нужно automountServiceAccountToken: true, а затем вы можете использовать токен Barear из /var/run/secrets/kubernetes.io/serviceaccount/token

Вам просто нужно изображение с завитком для этого. Для этого вы можете использовать zakkg3 / opennebula-alpine-bootstrap.

Например, здесь я создаю секрет на основе файла, используя curl вместо kubectl:

url -s -X POST -k https://kubernetes.default.svc/api/v1/namespaces/${NAMESPACE}/secrets \
                -H "Authorization: Bearer $( cat /var/run/secrets/kubernetes.io/serviceaccount/token )" \
                -H "Content-Type: application/json" \
                -H "Accept: application/json" \
                -d "{ \"kind\": \"Secret\", \"apiVersion\": \"v1\", \"metadata\": { \"name\": \"{{ include "opennebula.fullname" . }}-ssh-keys\", \"namespace\": \"${NAMESPACE}\" }, \"type\": \"Opaque\", \"data\": { \"authorized_keys\": \"$( cat opennebula-ssh-keys/authorized_keys | base64 | tr -d '\n' )\", \"config\": \"$( cat opennebula-ssh-keys/config | base64 | tr -d '\n' )\", \"id_rsa\": \"$( cat opennebula-ssh-keys/id_rsa | base64 | tr -d '\n' )\", \"id_rsa.pub\": \"$( cat opennebula-ssh-keys/id_rsa.pub | base64 | tr -d '\n' )\" } }" > /dev/null

Обратите внимание, что рекомендуетсявывод в> / dev / null, иначе вы получите этот вывод в вашем управлении журналами (ELK / LOKI).

0 голосов
/ 23 октября 2019

Я собираюсь сделать что-то подобное с моими крючками.

Во время осмотра я нашел этот вопрос: Выполнение команд kubectl Helm после установки

Но это мало что дает, сейчас я смотрю на плагины шлемаhttps://helm.sh/docs/related/#helm-plugins

Надеюсь, вы найдете свой ответ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...