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?
3 Réponses :
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
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?
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 strong > afin de partager l'état.
pour plus de détails, suivez le lien init-containers < / p>
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é
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é.
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.shdans mon fichier yaml pour l'exporter dans tous les pod que je créeComme, 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-scriptDé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 ETALe 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!