Trève de blabla, si vous êtes venu sur ce post, c’est que vous voulez une solution rapide, je pense même que 90% des gens ne liront pas ces quelques mots, donc passons :D
Ces ressources créent un ServiceAccount dédié. Le RBAC est là pour lui donner seulement les droits de lecture et suppression de pods. Le cronjob définit quelques variables d’environnement pour définir le namespace courant, et surtout le selector permettant de définir les pods allant être supprimés pour redémarrage.
Le selector utilise un label, donc si vous n’êtes pas 100% sûrs de ce qui vous faites, vous devriez lancer la commande suivante pour vous assurer que vous ciblez bien les bons pods avec le labelSelector que vous avez en tête:
# Exemple
SELECTOR=app=myapp
kubectl get pods -l $SELECTOR
Voici donc quelques ressources à importer dans votre cluster, une fois adaptés à vos besoins.
En effet, n’oubliez pas de changer l’env SELECTOR ainsi que le schedule, par défaut spécifié à une execution de job tous les jours à minuit.
apiVersion: v1
kind: ServiceAccount
metadata:
name: restarter
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: delete-pods
rules:
- apiGroups:
- ""
resources:
- pods
- namespaces
verbs:
- get
- list
- watch
- delete
- deletecollection
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: restarter-delete-pods
subjects:
- kind: ServiceAccount
name: restarter
roleRef:
kind: Role
name: delete-pods
apiGroup: rbac.authorization.k8s.io
---
apiVersion: batch/v1beta1
kind: CronJob
metadata:
labels:
app-type: cronjob
app: restarter
name: restarter
spec:
concurrencyPolicy: Forbid
jobTemplate:
metadata:
creationTimestamp: null
labels:
app: restarter
app-type: cronjob
spec:
template:
metadata:
creationTimestamp: null
labels:
app: restarter
app-type: cronjob
spec:
containers:
- command:
- sh
- -c
- "curl -s -XDELETE -H \"Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)\" --cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt https://kubernetes.default/api/v1/namespaces/${NAMESPACE}/pods?labelSelector=${SELECTOR} -o /dev/null && echo 'Pods with label '${SELECTOR}' were deleted'"
env:
- name: TZ
value: Pacific/Noumea
- name: NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: SELECTOR
value: app=myapp # CHANGEME
image: curlimages/curl
imagePullPolicy: IfNotPresent
name: restarter
resources:
limits:
cpu: 10m
memory: 64Mi
requests:
cpu: 10m
memory: 8Mi
dnsPolicy: ClusterFirst
serviceAccount: restarter
restartPolicy: Never
schedule: '0 0 * * *' # CHANGEME
startingDeadlineSeconds: 300
successfulJobsHistoryLimit: 1
suspend: false