<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Tricks on Zwindler's Reflection</title><link>https://blog.zwindler.fr/tags/tricks/</link><description>Recent content in Tricks on Zwindler's Reflection</description><generator>Hugo -- gohugo.io</generator><language>fr-fr</language><copyright>Licensed under CC BY-SA 4.0</copyright><lastBuildDate>Mon, 22 Jun 2020 06:35:00 +0000</lastBuildDate><atom:link href="https://blog.zwindler.fr/tags/tricks/index.xml" rel="self" type="application/rss+xml"/><item><title>kubectl tips and tricks 3</title><link>https://blog.zwindler.fr/2020/06/22/kubectl-tips-and-tricks-3/</link><pubDate>Mon, 22 Jun 2020 06:35:00 +0000</pubDate><guid>https://blog.zwindler.fr/2020/06/22/kubectl-tips-and-tricks-3/</guid><description>&lt;img src="https://blog.zwindler.fr/2019/10/kubectl2.webp" alt="Featured image of post kubectl tips and tricks 3" /&gt;&lt;h2 id="déjà-le-numéro-3-pour-les-kubectl-tips-and-tricks-"&gt;Déjà le numéro 3 pour les &lt;em&gt;kubectl tips and tricks&lt;/em&gt; !
&lt;/h2&gt;&lt;p&gt;Vous le savez peut être car j’en parle abondamment, mais j’utilise Kubernetes quotidiennement, en particulier kubectl` ! Certes il y a des UI sympas pour améliorer l’expérience utilisateur de la ligne de commande avec Kubernetes, mais j’aime bien savoir exactement ce que je fais et souvent je préfère reste au plus proche de l’outil (c’est personnel). Je collecte donc de petites astuces qu’on ne trouve pas toujours quand on débute dans kube, que je vous partage ici.&lt;/p&gt;
&lt;p&gt;Note: numéro 3 signifie bien entendu un n°1 et un n°2, que vous pourrez retrouver ici :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2019/10/30/kubectl-tips-tricks-1/" &gt;kubectl tips and tricks n°1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2020/01/20/kubectl-tips-and-tricks-n2/" &gt;kubectl tips and tricks n°2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Et aussi dans la même veine :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2018/08/28/utiliser-kubectx-kubens-pour-changer-facilement-de-context-et-de-namespace-dans-kubernetes/" &gt;kubectx et kubens&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2020/03/23/supprimer-un-namespace-bloque-a-terminating/" &gt;Supprimer un namespace bloqué à Terminating&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="quest-ce-qui-bouffe-mes-ressources-"&gt;Qu’est ce qui bouffe mes ressources !
&lt;/h2&gt;&lt;p&gt;Un inconditionnel lorsqu’on héberge des applications (et encore plus quand elles cohabitent) est savoir laquelle bouffe toutes les ressources et bloque les autres (ça marche aussi dans la vraie vie, en coloc) !&lt;/p&gt;
&lt;p&gt;L’idéal est bien entendu de pouvoir compter sur une supervision complète (allez voir cet article sur &lt;a class="link" href="https://blog.zwindler.fr/2020/04/13/decouvrir-prometheus-et-grafana-par-lexemple/" &gt;Prometheus et Grafana&lt;/a&gt; si vous voulez en savoir plus), mais des fois, pour aller vite (ou si votre cluster est vraiment par terre et que Prom répond plus, avoir des outils intégrés permet de gagner du temps dans l’analyse du problème.&lt;/p&gt;
&lt;p&gt;Heureusement pour nous, kubectl` intègre une commande &amp;ldquo;top&amp;rdquo;, qui, comme sa commande homonyme sous Linux, va nous permettre d’afficher les consommations de CPU et de RAM des objets dans notre cluster.&lt;/p&gt;
&lt;p&gt;Il existe deux modes pour ce &amp;ldquo;top&amp;rdquo;. Le premier permet de lister la consommation des nodes :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
zwindlerzzzz01-11111111-vmss000000 118m 3% 1274Mi 10%
zwindlerzzzz01-11111111-vmss000001 119m 3% 1777Mi 14%
zwindlerzzzz01-11111111-vmss000002 320m 8% 2611Mi 20%
zwindlermntr01-11111111-vmss000000 113m 2% 1653Mi 6%
zwindlerzone01-11111111-vmss000000 200m 5% 1559Mi 12%
zwindlerzone01-11111111-vmss000001 215m 5% 1510Mi 11%
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On a à la fois les infos en terme de CPU (en cores ou millicores et en pourcentage total) ainsi que la consommation RAM (en Mio et en %age total de ce qu’il y a sur la machine).&lt;/p&gt;
&lt;p&gt;Le second permet de lister les pods.&lt;/p&gt;
&lt;p&gt;Un point d’attention cependant : contrairement aux nodes, qui sont des objets visibles dans tous les namespaces Kubernetes, les pods sont liés à un namespace particulier. Il sera donc nécessaire de spécifier le namespace qui vous intéresse ou alors d’ajouter un &lt;code&gt;--all-namespaces&lt;/code&gt;.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl top pod --all-namespaces
NAMESPACE NAME CPU(cores) MEMORY(bytes)
default appli1-aaaaa 1m 36Mi
default appli2-aaaaa 1m 36Mi
default appli3-aaaaa 1m 36Mi
ingress traefik-v2-aaaaa-aaaaa 3m 17Mi
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;[Edit] Suite à une remarque de Thibault Le Reste, je me suis rappelé de 2 options dont je n’avais pas parlé initialement dans l’article &lt;code&gt;--sort-by=cpu&lt;/code&gt; et &lt;code&gt;--sort-by=memory&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;A y repenser, je me suis souvenu pourquoi je n’en ai par parlé&amp;hellip; c’est parce que cette option ne marchait pas quand j’ai écris l’article ;-)&lt;/p&gt;
&lt;p&gt;En fait il y a un bug, fixé dans la version 1.18 de &lt;code&gt;kubectl&lt;/code&gt; (&lt;a class="link" href="https://github.com/kubernetes/kubernetes/issues/81270" target="_blank" rel="noopener"
&gt;issue Github 81270&lt;/a&gt;), donc si vous êtes à jour, vous pouvez utiliser ces deux options !&lt;/p&gt;
&lt;h2 id="logs"&gt;Logs
&lt;/h2&gt;&lt;p&gt;Un autre must dans l’hébergement d’applications, c’est comprendre pourquoi une application plante. Et il peut y avoir tellement de causes (pas seulement liées à Kubernetes) qu’il est important de garder une vision complète de toutes les sources de debugging à votre portée.&lt;/p&gt;
&lt;p&gt;D’abord, l’application est peut être juste mal configurée. On pourrait simplement se connecter dessus mais il y a fort à craindre que le pod se kill tout seul le temps que vous tentiez de vous connecter.&lt;/p&gt;
&lt;p&gt;Heureusement pour nous, la plupart des images sont pensées de telle sorte que les logs importants sont envoyés sur la sortie standard, sortie que nous pouvons récupérer avec la commande &amp;ldquo;logs&amp;rdquo;, que vous connaissez sûrement.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl --namespace=monitoring logs thanos-query-7bc9986f59-c7njv
level=info ts=2020-05-06T15:23:35.600327763Z caller=main.go:168 msg=&amp;#34;Tracing will be disabled&amp;#34;
level=info ts=2020-05-06T15:23:35.656544832Z caller=main.go:288 component=query msg=&amp;#34;disabled TLS, key and cert must be set to enable&amp;#34;
level=info ts=2020-05-06T15:23:35.656572032Z caller=query.go:460 msg=&amp;#34;starting query node&amp;#34;
level=info ts=2020-05-06T15:23:35.956571601Z caller=query.go:430 msg=&amp;#34;Listening for query and metrics&amp;#34; address=0.0.0.0:10902
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Cependant, ce que vous ignorez peut être c’est qu’il existe plusieurs flags très utiles qui permettent de reproduire les fonctions indispensable de tout admin linux qui lit des logs.&lt;/p&gt;
&lt;p&gt;Par exemple, on peut faire l’équivalent d’un &amp;ldquo;tail -500&amp;rdquo; pour lister les 500 dernières lignes de log uniquement (très pratique si vous en avez des tartines) en ajoutant simplement le flag &lt;code&gt;--tail=500&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;On peut aussi faire l’équivalent du &amp;ldquo;tail -f&amp;rdquo; (suivre les lignes qui vont apparaître a posteriori en temps réel) avec le flag &lt;code&gt;-f&lt;/code&gt; (tout simplement)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl --namespace=monitoring logs thanos-query-7bc9986f59-c7njv --tail=1 -f
level=info ts=2020-05-06T15:26:18.048901191Z caller=storeset.go:266 component=storeset msg=&amp;#34;adding new store to query storeset&amp;#34; address=prom-thanos-sidecar-zwindlerk8s.monitoring.svc.cluster.local:10901
[et là le prompt attend jusqu&amp;#39;à ce qu&amp;#39;une nouvelle ligne apparaisse ou que vous Ctrl-C]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dans le cas d’un plantage en boucle, il arrive qu’on ait pas eu le temps de voir la trace du conteneur précédent avant que Kube en lance un nouveau. Vous pouvez accéder aux logs du conteneur précédent avec le &lt;code&gt;-p&lt;/code&gt; !&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl logs pod-qui-crashe-en-boucle -p
Content root path: /app
Now listening on: http://[::]:80
Application started. Press Ctrl+C to shut down.
Application is shutting down...
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dans le cas où vous avez besoin de voir rapidement la date a laquelle a été écrite une ligne de log et que vous n’avez pas l’information dans le log lui même, sachez qu’il existe un &lt;code&gt;--timestamps&lt;/code&gt;.
Lorsque vous ajoutez ce flag, il va &lt;em&gt;preppend&lt;/em&gt; un timestamp devant chaque ligne.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl --context=k8s11-euw-dev --namespace=cutting-room logs scanner-parameters-7bfd6b656d-cl2gl --timestamps
2020-06-23T08:00:08.578320749Z {&amp;#34;logType&amp;#34;:&amp;#34;Debug&amp;#34;,&amp;#34;timestamp&amp;#34;:&amp;#34;2020-06-23T08:00:08.575Z&amp;#34;,&amp;#34;level&amp;#34;:&amp;#34;Info&amp;#34;,[...]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Le mieux étant bien sûr d’externaliser toutes les lignes de log dans un système centralisé comme fluentd ou splunk pour faciliter les recherches, bien entendu&amp;hellip;&lt;/p&gt;
&lt;p&gt;Et enfin, un dernier flag très très cool : vous avez la possibilité de n’afficher que les messages les plus récents, mais sur un temps donné plutôt que sur un nombre de ligne de log. &lt;code&gt;--since=5m&lt;/code&gt; vous affichera les logs des 5 dernières minutes uniquement !&lt;/p&gt;
&lt;h2 id="events"&gt;Events
&lt;/h2&gt;&lt;p&gt;Je pense qu’on a fait le tour pour ce qui était des logs applicatif avec kubectl. Cependant, il existe une autre catégorie de logs dans Kubernetes : les Events. Les Events, c’est un peu les logs interne de l’API server. Ca va vous donner tout un tas d’informations sur ce qui se passe sur vos objets. Un Pod est créé, un Pod meurt car il répond pas à la Liveness Probe, une Image est pull&amp;hellip; la tuyauterie technique de kube en somme.&lt;/p&gt;
&lt;p&gt;Les Events sont des objets Kubernetes à part entière, comme les Pods, les Nodes, etc. Ils sont liés à un namespace et on les liste avec un &lt;code&gt;kubectl get events&lt;/code&gt;, on peut obtenir les informations complètes d’un Event avec un &lt;code&gt;kubectl describe events&lt;/code&gt;, etc.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl --namespace=kube-system get events
LAST SEEN TYPE REASON OBJECT MESSAGE
40s Warning Unhealthy pod/omsagent-rs-758cbf9987-fb5zf Liveness probe failed:
30m Normal Killing pod/omsagent-rs-758cbf9987-fb5zf Container omsagent failed liveness probe, will be restarted
10m Warning BackOff pod/omsagent-rs-758cbf9987-fb5zf Back-off restarting failed container
9s Warning Unhealthy pod/omsagent-v7w8w Liveness probe failed:
25m Normal Killing pod/omsagent-v7w8w Container omsagent failed liveness probe, will be restarted
5m45s Warning BackOff pod/omsagent-v7w8w Back-off restarting failed container
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Mais&amp;hellip; vous voyez pas un truc chelou ?&lt;/p&gt;
&lt;p&gt;C’est trié N’IMPORTE COMMENT !!!&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2020/05/rage.gif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Le mieux dans cette histoire, c’est que c’est &amp;ldquo;by design&amp;rdquo;. Donc vous allez devoir garder cette astuce là sous le coude car je l’utilise à peu près tout le temps.&lt;/p&gt;
&lt;p&gt;Pour modifier le comportement par défaut de kubectl get events pour que les événements soient triés par date de dernière occurrence (c’est souvent ce qu’on veut), retenez donc que vous allez devoir ajouter à chaque fois &lt;code&gt;--sort-by='{.lastTimestamp}'&lt;/code&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl get events --sort-by=&amp;#39;{.lastTimestamp}&amp;#39;
LAST SEEN TYPE REASON OBJECT MESSAGE
36m Normal Killing pod/omsagent-rs-758cbf9987-fb5zf Container omsagent failed liveness probe, will be restarted
16m Warning BackOff pod/omsagent-rs-758cbf9987-fb5zf Back-off restarting failed container
11m Warning BackOff pod/omsagent-v7w8w Back-off restarting failed container
6m27s Warning Unhealthy pod/omsagent-rs-758cbf9987-fb5zf Liveness probe failed:
5m56s Warning Unhealthy pod/omsagent-v7w8w Liveness probe failed:
85s Normal Pulled pod/omsagent-rs-758cbf9987-fb5zf Container image &amp;#34;mcr.microsoft.com/azuremonitor/containerinsights/ciprod:ciprod03022020&amp;#34; already present on machine
56s Normal Killing pod/omsagent-v7w8w Container omsagent failed liveness probe, will be restarted
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Voilà, j’arrête ici car j’en ai plein d’autres mais ça commence à faire beaucoup. La prochaine fois je parlerai très certainement de la façon dont vous allez pouvoir customiser les colonnes que vous voulez voir afficher, ainsi que des filtres.&lt;/p&gt;
&lt;p&gt;Mais en attendant, amusez vous bien avec ça ;-)&lt;/p&gt;</description></item><item><title>Supprimer un namespace bloqué à Terminating</title><link>https://blog.zwindler.fr/2020/03/23/supprimer-un-namespace-bloque-a-terminating/</link><pubDate>Mon, 23 Mar 2020 07:15:00 +0000</pubDate><guid>https://blog.zwindler.fr/2020/03/23/supprimer-un-namespace-bloque-a-terminating/</guid><description>&lt;img src="https://blog.zwindler.fr/2020/01/terminated.webp" alt="Featured image of post Supprimer un namespace bloqué à Terminating" /&gt;&lt;h2 id="forcer-la-suppression-dun-namespace-bloqué-à-terminating-dans-kubernetes"&gt;Forcer la suppression d’un namespace bloqué à &amp;ldquo;Terminating&amp;rdquo; dans Kubernetes
&lt;/h2&gt;&lt;p&gt;Il y a quelques mois, j’ai eu des soucis pour supprimer un namespace lorsque j’ai voulu démonter mon &lt;a class="link" href="https://blog.zwindler.fr/2019/09/10/du-ceph-dans-mon-kubernetes/" &gt;cluster Ceph (monté avec Rook)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;On aurait pu croire que ça m’a énervé (bon ok, si un peu quand même) mais ça m’a permis de mettre la main sur plusieurs commandes sympa avec kubectl donc tout n’est pas perdu ;-).&lt;/p&gt;
&lt;p&gt;Voyez ce récit comme une checklist des choses à vérifier si jamais vous avez du mal à supprimer des objets dans Kubernetes !&lt;/p&gt;
&lt;p&gt;Note: dans la même veine, n’hésitez pas à aller voir les articles que j’ai écris sur &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=kubectl" &gt;kubectl, notamment les tips and tricks !&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="la-base"&gt;La base
&lt;/h2&gt;&lt;p&gt;Pensant avoir correctement supprimé les objets Ceph dans mon cluster, j’ai donc terminé le nettoyage par une suppression toute bête du namespace :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl --context&lt;span class="o"&gt;=&lt;/span&gt;sandbox delete ns rook-ceph
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sauf que, patatra, en essayant de vérifier qu’il était bien supprimé :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl --context&lt;span class="o"&gt;=&lt;/span&gt;sandbox get ns rook-ceph
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NAME STATUS AGE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rook-ceph Terminating 88d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le namespace est toujours présent, et reste bloqué à l’état &amp;ldquo;Terminating&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Qu’à cela ne tienne, je tente de le re-supprimer. Ça ne marche pas :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl --context&lt;span class="o"&gt;=&lt;/span&gt;sandbox delete ns rook-ceph
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Error from server &lt;span class="o"&gt;(&lt;/span&gt;Conflict&lt;span class="o"&gt;)&lt;/span&gt;: Operation cannot be fulfilled on namespaces &lt;span class="s2"&gt;&amp;#34;rook-ceph&amp;#34;&lt;/span&gt;: The system is ensuring all content is removed from this namespace. Upon completion, this namespace will automatically be purged by the system
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="forcer-la-suppression"&gt;Forcer la suppression
&lt;/h2&gt;&lt;p&gt;Une rapide recherche sur le net me conseille d’ajouter les flags &lt;code&gt;--force&lt;/code&gt;, à obligatoirement associer avec le flag &lt;code&gt;--grace-period=0&lt;/code&gt; (si vous ne le mettez pas, il vous dira de le mettre de toute façon&amp;hellip;)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl --context&lt;span class="o"&gt;=&lt;/span&gt;sandbox delete ns rook-ceph --force --grace-period&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;warning: Immediate deletion does not &lt;span class="nb"&gt;wait&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; confirmation that the running resource has been terminated. The resource may &lt;span class="k"&gt;continue&lt;/span&gt; to run on the cluster indefinitely.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Error from server &lt;span class="o"&gt;(&lt;/span&gt;Conflict&lt;span class="o"&gt;)&lt;/span&gt;: Operation cannot be fulfilled on namespaces &lt;span class="s2"&gt;&amp;#34;rook-ceph&amp;#34;&lt;/span&gt;: The system is ensuring all content is removed from this namespace. Upon completion, this namespace will automatically be purged by the system.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Flute !&lt;/p&gt;
&lt;h2 id="vérifier-quil-ne-reste-pas-des-objets-kubernetes-dans-le-namespace-ou-associés"&gt;Vérifier qu’il ne reste pas des objets Kubernetes, dans le namespace ou associés
&lt;/h2&gt;&lt;p&gt;Bon, généralement quand j’arrive pas à supprimer un namespace, c’est qu’il reste un PVC qui traine, lui même attaché à un PV. Mais là non plus, rien :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl --namespace&lt;span class="o"&gt;=&lt;/span&gt;rook-ceph get pvc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;No resources found in rook-ceph namespace.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get pv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="vérifier-les-crd-aussi-"&gt;Vérifier les CRD aussi !
&lt;/h2&gt;&lt;p&gt;Un truc à vérifier aussi dans le cas de rook, c’est qu’il ne reste pas de CRD (CustomRessourceDefinition) que vous n’avez pas l’habitude de manipuler, qui seraient encore présentes et qui bloqueraient l’opération :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dgermain$ kubectl delete storageclass rook-ceph-block
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Error from server &lt;span class="o"&gt;(&lt;/span&gt;NotFound&lt;span class="o"&gt;)&lt;/span&gt;: storageclasses.storage.k8s.io &lt;span class="s2"&gt;&amp;#34;rook-ceph-block&amp;#34;&lt;/span&gt; not found
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dgermain$ kubectl delete storageclass rook-cephfs
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Error from server &lt;span class="o"&gt;(&lt;/span&gt;NotFound&lt;span class="o"&gt;)&lt;/span&gt;: storageclasses.storage.k8s.io &lt;span class="s2"&gt;&amp;#34;rook-cephfs&amp;#34;&lt;/span&gt; not found
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dgermain$ kubectl --context&lt;span class="o"&gt;=&lt;/span&gt;sandbox get crd
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;volumes.rook.io 2019-08-19T09:46:08Z
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dgermain$ kubectl --context&lt;span class="o"&gt;=&lt;/span&gt;sandbox delete crd volumes.rook.io
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="utiliser-des-scripts-pour-débloquer-les-objets-en-terminating"&gt;Utiliser des scripts pour débloquer les objets en &amp;ldquo;Terminating&amp;rdquo;
&lt;/h2&gt;&lt;p&gt;Là ça commence à devenir pénible. Comme je ne suis évidemment pas le premier à avoir le problème, des gens ont écris des scripts pour faciliter la suppression d’objets bloqués au stade Terminating. Ces scripts prennent en charge la plupart des cas courants. Attention cependant à ce que vous faites avec (soyez sûrs de vous) !&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dgermain:~/sources/knsk$ git clone https://github.com/thyarles/knsk/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dgermain:~/sources/knsk$ kubectl config use-context sandbox
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Switched to context &lt;span class="s2"&gt;&amp;#34;sandbox&amp;#34;&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dgermain:~/sources/knsk$ chmod +x knsk.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dgermain:~/sources/knsk$ ./knsk.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Deleting rook-ceph... &lt;span class="k"&gt;done&lt;/span&gt;!
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="lister-tous-les-objets-du-cluster-qui-sappellent-rook-ceph"&gt;Lister tous les Objets du cluster qui s’appellent rook-ceph
&lt;/h2&gt;&lt;p&gt;Last but not least. La solution j’ai fini par la trouver en utilisant la commande suivante, qui permet de lister TOUS les types objets existants dans votre cluster :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl api-resources --verbs=list --namespaced -o name
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A partir de là, j’ai rajouté un petit xargs pour rechercher, dans tout le cluster, tous les objets s’appelant rook-ceph parmis tous les types d’objets qui existent. Et là surprise :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get -n rook-ceph
No resources found in rook-ceph namespace.
No resources found in rook-ceph namespace.
No resources found in rook-ceph namespace.
[...]
No resources found in rook-ceph namespace.
NAME DATADIRHOSTPATH MONCOUNT AGE STATE HEALTH
rook-ceph /var/lib/rook 1 88d Created HEALTH_OK
No resources found in rook-ceph namespace.
[...]
No resources found in rook-ceph namespace.
Error from server (NotAcceptable): the server was unable to respond with a content type that the client supports (get pods.metrics.k8s.io)
No resources found in rook-ceph namespace.
[...]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;OUPS ! Il restait un CRD &amp;ldquo;cephcluster&amp;rdquo; que j’avais oublié de supprimer ! Sauf que cet objet n’apparaissait pas avec une requête d’affichage classique.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl -n rook-ceph get cephcluster
NAME DATADIRHOSTPATH MONCOUNT AGE STATE HEALTH
rook-ceph /var/lib/rook 1 88d Created HEALTH_OK
kubectl -n rook-ceph delete cephcluster rook-ceph
cephcluster.ceph.rook.io &amp;#34;rook-ceph&amp;#34; deleted
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="et-cest-pas-fini-"&gt;Et c’est pas fini !
&lt;/h2&gt;&lt;p&gt;Malheureusement, ce n’est pas totalement terminé ! Notre namespace n’a plus d’objets qui bloquent sa suppression. Pour autant, il est encore bloqué dans l’état Terminating.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl -n rook-ceph delete cephcluster rook-ceph
cephcluster.ceph.rook.io &amp;#34;rook-ceph&amp;#34; deleted
^C
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dans ce cas de figure, on peut soit relancer le script knsk, soit, à la main, patcher l’objet pour vider la metadata &amp;ldquo;finalizers&amp;rdquo; et débloquer le processus de suppression. Ca revient au même, mais je vous le met pour que vous compreniez ce que vous faites :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dgermain:~/sources/knsk$ kubectl -n rook-ceph patch cephclusters.ceph.rook.io rook-ceph -p &lt;span class="s1"&gt;&amp;#39;{&amp;#34;metadata&amp;#34;:{&amp;#34;finalizers&amp;#34;: []}}&amp;#39;&lt;/span&gt; --type&lt;span class="o"&gt;=&lt;/span&gt;merge
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cephcluster.ceph.rook.io/rook-ceph patched
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Et maintenant, votre namespace est supprimé !&lt;/p&gt;
&lt;h2 id="sources"&gt;Sources
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://medium.com/@newtondev/how-to-fix-kubernetes-namespace-deleting-stuck-in-terminating-state-5ed75792647e" target="_blank" rel="noopener"
&gt;How to fix Kubernetes namespace deleting stuck in Terminating State&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/thyarles/knsk/blob/master/knsk.sh" target="_blank" rel="noopener"
&gt;github.com/thyarles/knsk : Kubernetes namespace killer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://rook.io/docs/rook/latest/Getting-Started/ceph-teardown/" target="_blank" rel="noopener"
&gt;Documentation Ceph : Ceph Teardown&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>kubectl tips and tricks n°2</title><link>https://blog.zwindler.fr/2020/01/20/kubectl-tips-and-tricks-n2/</link><pubDate>Mon, 20 Jan 2020 07:30:00 +0000</pubDate><guid>https://blog.zwindler.fr/2020/01/20/kubectl-tips-and-tricks-n2/</guid><description>&lt;img src="https://blog.zwindler.fr/2019/10/kubectl2.webp" alt="Featured image of post kubectl tips and tricks n°2" /&gt;&lt;h2 id="kubectl"&gt;kubectl
&lt;/h2&gt;&lt;p&gt;Comme vous pouvez le voir, il s’agit du 2ème article d’une série sur la productivité quand on est dans un environnement Kubernetes. Et qui dit productivité dit forcément ligne de commande, donc kubectl :trollface:!&lt;/p&gt;
&lt;p&gt;Le premier article, si vous l’avez loupé, est toujours disponible ici : &lt;a class="link" href="https://blog.zwindler.fr/2019/10/30/kubectl-tips-tricks-1/" &gt;kubectl tips and tricks n°1&lt;/a&gt;. J’avais parlé du flag &amp;ldquo;wait&amp;rdquo;, de comment relancer un Job ou un CronJob et de comment utiliser les &lt;em&gt;selectors&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Et j’ai aussi &lt;a class="link" href="https://blog.zwindler.fr/2018/08/28/utiliser-kubectx-kubens-pour-changer-facilement-de-context-et-de-namespace-dans-kubernetes/" &gt;écris un article sur kubectx et kubens qui pourrait vous plaire&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Normalement, les astuces que je vais vous montrer ici ne sont pas dans la plupart des tutos que j’ai pu trouver sur le net. Cet article se concentre tout particulièrement sur les Secrets de Kubernetes.&lt;/p&gt;
&lt;p&gt;C’est parti pour du fun avec kubectl !&lt;/p&gt;
&lt;h2 id="encoderdécoder-facilement-en-base64-les-secrets"&gt;Encoder/décoder facilement en base64 les Secrets
&lt;/h2&gt;&lt;p&gt;Quelque chose qu’on a TOUT le temps à faire quand on manipule les objets de type Secrets dans Kubernetes, c’est d’afficher en clair les &amp;ldquo;secrets&amp;rdquo; contenus dans notre Secret (ou de les encoder).&lt;/p&gt;
&lt;p&gt;Car, pour ceux qui ne le savent pas, les Secrets dans Kubernetes ne sont malheureusement pas très secrets, puisqu’il s’agit ni plus ni moins que des strings encodées en base64 (ce qui est donc TOUT sauf secure). A vrai dire, je me demande même pourquoi s’être embêter à les encoder tout court. La seule sécurité qu’on ajoute par rapport aux ConfigMaps, c’est simplement que la string n’est pas lisible par un humain qui passerait sa tête par dessus votre épaule.&lt;/p&gt;
&lt;p&gt;Enfin bref, vous allez surement devoir encoder ou décoder des strings en base64 et c’est parfois un peu pénible. La méthode communément admise est simplement d’utiliser les binaires linux echo et base64.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;echo &amp;#34;ma string&amp;#34; | base64
bWEgc3RyaW5nCg==
echo bWEgc3RyaW5nCg== | base64 -d
ma string
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;C’est relou à taper, mais c’est relativement trivial.&lt;/p&gt;
&lt;h2 id="its-a-trap-"&gt;It’s a trap !
&lt;/h2&gt;&lt;p&gt;Sauf qu’il y a des pièges !&lt;/p&gt;
&lt;p&gt;Le premier vous l’aurez à l’encodage. Dans mon premier exemple, la string est très courte. Et parfois, la taille compte.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;echo &amp;#34;ma string très longue string pour montrer que ça va pas le faire&amp;#34; | base64
bWEgc3RyaW5nIHRyw6hzIGxvbmd1ZSBzdHJpbmcgcG91ciBtb250cmVyIHF1ZSDDp2EgdmEgcGFz
IGxlIGZhaXJlCg==
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ici, on se retrouve avec un saut de ligne dans notre string en sortie. Mais, si vous copiez collez ça dans votre YAML Kubernetes, vous allez vous prendre une bonne grosse erreur de syntaxe.&lt;/p&gt;
&lt;p&gt;Le YAML ne sera valide que si vous mettez la string complète, sur une seule ligne.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;echo &amp;#34;ma string très longue string pour montrer que ça va pas le faire&amp;#34; | base64 -w0
bWEgc3RyaW5nIHRyw6hzIGxvbmd1ZSBzdHJpbmcgcG91ciBtb250cmVyIHF1ZSDDp2EgdmEgcGFzIGxlIGZhaXJlCg==
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="et-cest-pas-fini-"&gt;Et c’est pas fini !
&lt;/h2&gt;&lt;p&gt;Le 2 ème piège est encore un souci de saut de ligne, mais dans la string en base64 cette fois.&lt;/p&gt;
&lt;p&gt;En fait, c’est hyper traitre car vous n’allez pas le voir à l’écran de prime abord, mais il faut savoir que echo rajoute un saut de ligne à la fin de votre string. Le retour que vous avez eu en base64 contient donc un saut de ligne, qui sera quasiment systèmatiquement non souhaité lorsqu’on gère des Secrets.&lt;/p&gt;
&lt;p&gt;La bonne commande n’est donc pas echo mais echo -n !&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;#Pas bien
echo &amp;#34;ma string&amp;#34; | base64
bWEgc3RyaW5nCg==
#Bien
echo -n &amp;#34;ma string&amp;#34; | base64 -w0
bWEgc3RyaW5n
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="ok-ça-commence-à-devenir-franchement-pénible"&gt;Ok ça commence à devenir franchement pénible&amp;hellip;
&lt;/h2&gt;&lt;p&gt;Pour décoder heureusement, c’est plus simple. La commande donnée au début suffit, même s’il sera plus safe de rajouter le &amp;ldquo;-n&amp;rdquo; au echo :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;echo -n bWEgc3RyaW5n | base64 -d
ma string
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="gagner-quelques-caractères"&gt;Gagner quelques caractères
&lt;/h2&gt;&lt;p&gt;Comme je suis fainéant, j’ai cherché une astuce pour gagner quelques caractères à taper en moins. Il existe une solution, mais qui ne marche malheureusement que pour decode, puisque dans le cas de l’encodage on risquera d’ajouter un saut de ligne non souhaité :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;echo bWEgc3RyaW5n | base64 -d
base64 -d &amp;lt;&amp;lt;&amp;lt; bWEgc3RyaW5n
ma string
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On vient de s’économiser 3 caractères (waaaah) mais surtout un &amp;ldquo;|&amp;rdquo;, bien plus pénible à faire sur un clavier azerty standard que 3 &amp;ldquo;&amp;lt;&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Je vous l’accorde, c’est pas foufou.&lt;/p&gt;
&lt;h2 id="un-peu-plus-simple"&gt;Un peu plus simple
&lt;/h2&gt;&lt;p&gt;Heureusement, mon collègue Julien (aka JUL, car il est fan de JUL, bien entendu) nous a écris un petit script pour nous faciliter la vie, donc je vous le partage :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;dgermain:~$ cat &amp;gt; b64 &amp;lt;&amp;lt;EOF
&amp;gt; #!/bin/bash
&amp;gt; echo -e &amp;#34;Base64 encoding.. \n&amp;#34;
&amp;gt; for arg in &amp;#34;\$@&amp;#34;; do
&amp;gt; echo &amp;#34;\$arg :&amp;#34;
&amp;gt; echo -n &amp;#34;\$arg&amp;#34; | base64
&amp;gt; echo
&amp;gt; done
&amp;gt; EOF
dgermain:~$ cat &amp;gt; b64d &amp;lt;&amp;lt;EOF
&amp;gt; #!/bin/bash
&amp;gt; echo -e &amp;#34;Base64 decoding.. \n&amp;#34;
&amp;gt; for arg in &amp;#34;\$@&amp;#34;; do
&amp;gt; echo &amp;#34;\$arg :&amp;#34;
&amp;gt; echo -n &amp;#34;\$arg&amp;#34; | base64 -d
&amp;gt; echo
&amp;gt; done
&amp;gt; EOF
dgermain:~$ sudo cp b64* /usr/local/bin/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Vous pouvez maintenant invoquer directement b64 suivi d’un certain nombre de strings pour avoir leur valeur encodée, ou b64d suivi d’un certain nombre de string pour les décoder.&lt;/p&gt;
&lt;h2 id="dernière-astuce-et-après-jarrête"&gt;Dernière astuce et après j’arrête
&lt;/h2&gt;&lt;p&gt;Si jamais vous voulez à l’écran toutes les strings encodées en base64 dans un Secret Kubernetes en une seule étape, j’ai également trouvé ce &lt;a class="link" href="https://stackoverflow.com/questions/56909180/decoding-kubernetes-secret" target="_blank" rel="noopener"
&gt;&lt;em&gt;oneliner&lt;/em&gt; pas piqué des hannetons sur Stackoverflow&lt;/a&gt; qui tire parti de la possibilité de faire des gotemplates directement dans kubectl :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl get secret name-of-secret -o go-template=&amp;#39;
{{range $k,$v := .data}}{{printf &amp;#34;%s: &amp;#34; $k}}{{if not $v}}{{$v}}{{else}}{{$v | base64decode}}{{end}}{{&amp;#34;\n&amp;#34;}}{{end}}&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Il faudra probablement que je fasse un article entier sur le go-templating avec kubectl car c’est juste ouf ce qu’on peut faire avec ;-)&lt;/p&gt;</description></item><item><title>kubectl tips and tricks n°1</title><link>https://blog.zwindler.fr/2019/10/30/kubectl-tips-tricks-1/</link><pubDate>Wed, 30 Oct 2019 07:00:44 +0000</pubDate><guid>https://blog.zwindler.fr/2019/10/30/kubectl-tips-tricks-1/</guid><description>&lt;img src="https://blog.zwindler.fr/2019/10/kubectl2.webp" alt="Featured image of post kubectl tips and tricks n°1" /&gt;&lt;h2 id="kubectl"&gt;kubectl
&lt;/h2&gt;&lt;p&gt;Ça fait un moment que je garde sous le coudes quelques petites tips pour améliorer votre productivité via la CLI de Kubernetes kubectl.&lt;/p&gt;
&lt;p&gt;Rassurez vous, je ne vais pas faire un énième article sur l’autocomplétion ou autre info triviale comme &amp;ldquo;vous savez que vous pouvez stocker plusieurs contexts dans votre kubectl ?&amp;rdquo; #shocking. (Si ce dernier point vous intéresse, &lt;a class="link" href="https://blog.zwindler.fr/2018/08/28/utiliser-kubectx-kubens-pour-changer-facilement-de-context-et-de-namespace-dans-kubernetes/" &gt;j’avais fais un article sur kubectx et kubens qui va surement vous plaire&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Normalement, les astuces que je vais vous montrer ici ne sont pas dans la plupart des tutos que j’ai pu trouver sur le net.&lt;/p&gt;
&lt;p&gt;C’est parti pour du fun avec kubectl !&lt;/p&gt;
&lt;h2 id="pour-les-accrocs-à-la-flèche-du-haut"&gt;Pour les accrocs à la flèche du haut
&lt;/h2&gt;&lt;p&gt;Si, comme moi, vous faites partie de ces gens impatients qui ne peuvent pas prendre un café le temps qu’une opération se termine toute seule et que vous appuyez frénétiquement une la combinaison &amp;ldquo;flèche du haut + entrée&amp;rdquo; pour rappeler la dernière commande &amp;ldquo;kubectl get monobjetquejattendavecimpatience&amp;rdquo;, ce paragraphe est pour vous.&lt;/p&gt;
&lt;p&gt;Lors d’une commande de type &amp;ldquo;get&amp;rdquo; avec &lt;em&gt;kubectl&lt;/em&gt;, il existe un flag &amp;ldquo;-w&amp;rdquo; qui fait&amp;hellip; oui vous l’avez deviné&amp;hellip; un genre de watch sur le (ou les) objet(s) que vous attendez.&lt;/p&gt;
&lt;p&gt;Par exemple, dans le cas où vous souhaiteriez créer un objet &lt;em&gt;Service&lt;/em&gt; de type &lt;em&gt;LoadBalancer&lt;/em&gt; et que vous avez hâte que votre cloud provider vous assigne une IP publique, utilisez la commande suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl --context=cephk8s get svc traefik-ingress-controller --namespace kube-system -w
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
traefik-ingress-controller LoadBalancer 10.0.21.75 &amp;lt;pending&amp;gt; 80:32347/TCP,443:30388/TCP 45s
traefik-ingress-controller LoadBalancer 10.0.21.75 40.89.187.183 80:32347/TCP,443:30388/TCP 56s
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dans un premier temps, seul la première ligne &lt;em&gt;LoadBalancer&lt;/em&gt; s’affichera (tant que l’état restera à &amp;ldquo;Pending&amp;rdquo;), puis dès qu’il y aura une modification, la dernière ligne, avec l’IP publique, s’affichera.&lt;/p&gt;
&lt;p&gt;C’est également pratique si vous avez des &lt;em&gt;Pods&lt;/em&gt; qui mettent du temps à s’initialiser dans un &lt;em&gt;Déploiement&lt;/em&gt; complexe.&lt;/p&gt;
&lt;h2 id="relancer-un-job"&gt;Relancer un job
&lt;/h2&gt;&lt;p&gt;Kubernetes, en bon orchestrateur qu’il est, est capable de lancer des tâches planifiées. C’est super pratique lorsque vous avez des tâches bien précises à réaliser mais qu’il n’y a pas de raison de laisser un container tourner H24 pour ça.&lt;/p&gt;
&lt;p&gt;On a donc la notion d’objet Kubernetes &lt;em&gt;Job&lt;/em&gt; et de &lt;em&gt;Cronjob&lt;/em&gt;. Sans rentrer dans les détails, le &lt;em&gt;Job&lt;/em&gt;, c’est celui qui exécute la tâche (il lance un Pod qui contient un ou plusieurs containers). Le &lt;em&gt;Cronjob&lt;/em&gt;, c’est une surcouche qui lance périodiquement le &lt;em&gt;Job&lt;/em&gt;. Rien de bien sorcier.&lt;/p&gt;
&lt;p&gt;Malheureusement pour nous, il arrive que nos Jobs échouent. Il n’y avait pas assez de ressources, ou alors on est tombé sur un bug, ou alors c’est &amp;ldquo;la faute à pas de chance&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Qu’à cela ne tienne, il faut que votre Job tourne aujourd’hui, vous voulez donc le relancer. Pas de chance pour vous, &amp;ldquo;by design&amp;rdquo;, les &lt;em&gt;Jobs&lt;/em&gt; ne peuvent pas être relancés dans Kubernetes.&lt;/p&gt;
&lt;p&gt;Jusqu’à récemment, il n’y avait pas de solution propre pour relancer un Job avec kubectl. Il fallait donc passer par un exposer du JSON du Job pour en recréer un nouveau identique en tout point. &amp;ldquo;Crude but effective&amp;rdquo; comme disent nos amis anglosaxons.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl --context=moncontext --namespace=monnamespace get job monjob -o json | jq &amp;#39;del(.spec.selector)&amp;#39; | jq &amp;#39;del(.spec.template.metadata.labels)&amp;#39; | kubectl --context=moncontext --namespace=monnamespace replace --force -f -
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Si vous voulez plus de détails sur ce que oneliner fait vraiment : la première partie dump en JSON la configuration du job, la partie du milieu retire les données spécifiques au Job qui a échoué (autogénéré à la création du Job) et la dernière partie réinjecte le job dans Kubernetes, ce qui a pour effet de le relancer.&lt;/p&gt;
&lt;p&gt;Pas mal hein ?&lt;/p&gt;
&lt;p&gt;Mais&amp;hellip; si vous avez une version plus récente, vous avez de la chance, cette option est maintenant disponible par défaut dans &lt;em&gt;kubectl&lt;/em&gt;, vous permettant de créer de manière unitaire un &lt;em&gt;Job&lt;/em&gt; à partir d’un template contenu dans un &lt;em&gt;Cronjob&lt;/em&gt;, ce qui revient au même.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl --context=moncontext --namespace=monnamespace create job --from=cronjob/lecronjobmaitre unnomuniquepourlejobrelancé
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="les-selecteurs-dans-vos-kubectl"&gt;Les selecteurs dans vos kubectl
&lt;/h2&gt;&lt;p&gt;Last but not least, il est possible de réaliser des opérations sur plusieurs objets d’un même type en même temps.&lt;/p&gt;
&lt;p&gt;La manière la plus simple de le faire est simplement d’ajouter les noms de tous les objets à la fin de votre commande. Par exemple, la commande suivante va supprimer les &lt;em&gt;Pods&lt;/em&gt; pod1, pod2 et pod1000 :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl --context=moncontexte --namespace==monnamespace delete pods pod1 pod2 pod1000
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Cependant, on va rarement supprimer des pods (ou autre objet) au hasard. Généralement, on va vouloir supprimer tous les pods d’un même déploiement, ou alors supprimer tous les objets de la même applications, ou encore scaler tous les déploiements d’un même client.&lt;/p&gt;
&lt;p&gt;Dans tous les cas, si vous avez bien fait votre travail, tous ces objets Kubernetes auront tous les labels cohérents les uns avec les autres. En partant du principe que les pods de l’exemple précédents ont tous le label app=blopiblop, je peux donc exécuter la commande suivante pour gagner du temps :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl --context=moncontexte --namespace==monnamespace delete pods --selector=app=blopiblop
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Attention à ne pas vous tromper dans les labels, c’est très puissant ;-)&lt;/p&gt;</description></item></channel></rss>