2
votes

Est-il possible d'utiliser un script bash pour faire le test de vivacité dans le pod?

Je mets actuellement en place un cluster kubernetes avec 3 nœuds sur 3 vm différents et chaque nœud est composé de 1 pod qui exécute l'image docker suivante: ethereum / client-go: stable

Le problème est que je veux faire un test de vérification de l'état à l'aide d'un script bash (car je dois tester beaucoup de choses) mais je ne comprends pas comment exporter ce fichier vers chaque conteneur déployé avec mon fichier de déploiement yaml.

J'ai essayé d'ajouter la commande wget dans le fichier yaml pour télécharger mon script de vérification de l'état de mon dépôt github mais ce n'était pas très propre de mon point de vue, il y a peut-être un autre moyen ?

Mon fichier de déploiement actuel:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: goerli
  name: goerli-deploy
spec:
  replicas: 3
  selector:
    matchLabels:
      app: goerli
  template:
    metadata:
      labels:
        app: goerli
    spec:
      containers:
        - image: ethereum/client-go:stable
          name: goerli-geth
          args: ["--goerli", "--datadir", "/test2"]
          env:
          - name: LASTBLOCK
            value: "0"
          - name: FAILCOUNTER
            value: "0"
          ports:
          - containerPort: 30303
            name: geth
          livenessProbe:
            exec:
              command:
              - /bin/sh
              - /test/health.sh
            initialDelaySeconds: 60
            periodSeconds: 100
          volumeMounts:
          - name: test
            mountPath: /test
      restartPolicy: Always
      volumes:
      - name: test
        hostPath:
          path: /test

Je prévois de mettre un script de vérification de l'état dans /test/health.sh

Des idées?


16 commentaires

salut, oui c'est possible de le faire, Le kubelet exécute la commande à l'intérieur du conteneur. La sortie de la vérification avec le statut 0 est considérée comme une réussite.


salut, votre commentaire n'explique pas comment je peux résoudre mon problème ... Peut-être que je dois changer le titre par "Comment puis-je utiliser un script bash pour faire le test de vivacité dans le pod?" ?


Corrigez-moi Si j'ai mal compris, vous voulez d'abord récupérer le fichier que vous voulez exécuter les fichiers pour démontrer la vérification de la vivacité?


Si oui, nous pouvons utiliser init Container pour télécharger le fichier à un certain chemin, puis effectuer la vérification de la vivacité


En fait, j'ai déjà essayé la méthode avec wget et cela semble très idiot et ensuite je cherche un moyen de faire correctement les mêmes choses. Quelque chose comme ajouter: copy: ./health.sh dans mon fichier yaml pour l'exporter dans tous les pod que je crée


Comme, la séquence des tâches est importante pour toute la situation, alors init Container est la bonne solution


Je suppose que vous voulez l'ajouter à l'image du docker, alors ce serait une solution hardcore, nous pourrions perdre la flexibilité. S'il ne s'agit que d'un fichier de script, nous pouvons l'intégrer dans le ConfigMap et le monter à un certain chemin


Ok, ça a l'air génial, je vais essayer ça maintenant merci!


oui bien sûr :) faites-moi savoir si cela a fonctionné


hum il semble que le paramètre initContainer n'applique pas la commande wget ... initContainers: - name: healthcheck image: ethereum / client-go: stable command: ["wget", "- O "," /health.sh "," http: // My-bash-script Désolé pour le mauvais rendu dans la section commentaire ...


vérifions les logs de celui-ci kubectl logs -c healthcheck


Les journaux Aaarf semblent bons mais ne voient aucun fichier ... Connexion à raw.githubusercontent.com (151.101.120.133:443) health.sh 100% | **************** **************** | 1069 0:00:00 ETA


Le conteneur init et le conteneur d'application ont un système de fichiers différent, vous devez utiliser emptydir pour partager le fichier dans le conteneur d'application


kubernetes.io/docs/tasks / access-application-cluster /… serait un bon début


Voici l'exemple kubernetes.io/docs/tasks/configure-pod-container/...


Oui !!! Ça marche ! : D Merci beaucoup!


3 Réponses :


2
votes

Merci à Suresh Vishnoi:

Une façon de résoudre mon problème est d'utiliser le conteneur d'initialisation de cette façon:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: goerli
  name: goerli-deploy
spec:
  replicas: 3
  selector:
    matchLabels:
      app: goerli
  template:
    metadata:
      labels:
        app: goerli
    spec:
      containers:
        - image: ethereum/client-go:stable
          name: goerli-geth
          args: ["--goerli", "--datadir", "/test2"]
          env:
          - name: LASTBLOCK
            value: "0"
          - name: FAILCOUNTER
            value: "0"
          ports:
          - containerPort: 30303
            name: geth
          livenessProbe:
            exec:
              command:
              - /bin/sh
              - /test/health.sh
            initialDelaySeconds: 60
            periodSeconds: 100
          volumeMounts:
          - name: test
            mountPath: /test
      initContainers: 
      - name: healthcheck
        image: ethereum/client-go:stable
        command: ["wget", "-O", "/test2/health.sh", "https://My-script-bash"]
        volumeMounts:
        - name: test
          mountPath: "/test"
      restartPolicy: Always
      volumes:
      - name: test
        emptyDir: {}

Le fichier téléchargé sera visible dans / test / health.sh


1 commentaires

Vous devrez toujours être root pour rendre le script téléchargé exécutable, par ex. via chmod + x . Si vous autorisez la racine à l'exécution du conteneur, pourquoi ne pas le faire à l'intérieur du conteneur?



2
votes

Cela pourrait être un cas d'utilisation parfait pour le conteneur d'initialisation, comme il pourrait y avoir différentes images pour le conteneur d'initialisation et le conteneur d'application, ils ont donc un système de fichiers différent à l'intérieur des pods, nous devons donc utiliser Emptydir afin de partager l'état.

pour plus de détails, suivez le lien init-containers < / p>


1 commentaires

Le but de ce conteneur d'initialisation est d'avoir le script shell et de le mettre dans le système de fichiers de l'application, puis ce fichier de script shell pourrait être utilisé pour la disponibilité et la vivacité



0
votes

Si vous utilisez Helm, regardez les tests de graphique: https: //github.com/helm/helm/blob/master/docs/chart_tests.md . Cela couvre la préparation, mais pas la vivacité.

Pour une sonde de vivacité avancée, j'exécuterais une sorte de side-car de contrôle de santé qui effectue tous les tests avancés en continu via localhost, et expose un seul point de terminaison / healthcheck . Utilisez ensuite le point de terminaison dans une sonde de vivacité.


0 commentaires