Guillaume Fenollar DevOps et SysAdmin Freelance

Guillaume FENOLLAR

Ingénieur Linux/DevOps Indépendant

− Montpellier −

Redémarrer automatiquement des pods facilement via un cronjob

En utilisant un cluster Kubernetes, on peut être amené à vouloir redémarrer des pods périodiquement et quelqu'en soit la raison, c'est une opération qui n'est pas possible de faire nativement via de la configuration de déploiement ou autre. C'est par contre facile à mettre en place avec un simple appel à l'API.

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