Используя "kubectl delete pods X" из Kubernetes - PullRequest
0 голосов
/ 01 июня 2018

Мы используем версию> 1.8 k8s на gcloud.К сожалению, EventStore прекращает отправку данных до тех пор, пока они не будут перезагружены.Таким образом, мы хотели бы запускать kubectl --namespace=$NAMESPACE delete pod eventstore-0 каждые 6 часов.Таким образом, у нас есть задание cron, например:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: eventstore-restart
spec:
  # Run every full hour, 15 past, 30 past, 45 past every other time-unit.
  schedule: "0,15,30,45 * * * *"
  concurrencyPolicy: Forbid
  successfulJobsHistoryLimit: 1
  failedJobsHistoryLimit: 5
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: eventstore-restart
            image: eu.gcr.io/$PROJECT_ID/kubectl:latest
            imagePullPolicy: Always
            command: [ "/bin/sh", "-c" ]
            args:
            - 'set -x; kubectl --namespace=$NAMESPACE get pods
               | grep -ho "eventstore-\d+"
               | xargs -n 1 -I {} kubectl --namespace=$NAMESPACE delete pod {}'
            env:
            - name: NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
          restartPolicy: OnFailure
          serviceAccount: restart-eventstore

Однако, похоже, что оно расширяется до kubectl get pods ..., переданного с помощью | { ... }, что приводит к сбою сценария "/bin/sh: syntax error: unexpected end of file (expecting "}").

Как мне написать команду для удаления модуля в расписании ?

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Я бы сделал это:

kubectl delete po $(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}' | grep eventstore) -n $NAMESPACE

или (по-вашему)

kubectl get pods -n $NAMESPACE -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}' | grep eventstore | xargs -n 1 -I {} kubectl delete po {}

Теперь, если вы знаете, что хотите удалить модуль "eventstore-0", почему бы неделать напрямую kubectl delete pod eventstore-0?

0 голосов
/ 01 июня 2018

Я предлагаю использовать селекторы меток для фильтрации результатов kubectl get и вывод jsonpath, чтобы получить только имя модуля.

Предполагая, что ваш модуль помечен app=eventstore, и вы хотитеудалить каждый модуль с этой меткой, вы можете использовать следующую команду:

k get po --namespace=$NAMESPACE --selector app=eventstore -o jsonpath="{.items[*].metadata.name}" | xargs -n 1 -I {} kubectl --namespace=$NAMESPACE delete po {}

Если вы хотите удалить только первый модуль, используйте jsonpath="{.items[0].metadata.name}"

...