Red Hat OKD -OpenShift Community Edition-
Certs Expirés - Comment Récupérer Le Cluster

RedHat logo

Ce matin, j'ai redémarré un cluster OKD qui était complètement down depuis quelques semaines. Ce que je j'anticipais s'est bien entendu produit : certificats expirés, plus rien ne fonctionne! Du déjà-vu avec kubeadm, un petit kubeadm certs renew all suivi de quelques redémarrages de services et c'est reparti. Shall be easy right? 🙄

On confirme l'hypothèse

Plusieurs minutes après le redémarrage du cluster, toujours incapable de rejoindre la console ou d'utiliser oc pour lui parler, rien ne répond. Allons faire un tour sur un des control planes pour explorer.

$ ssh core@cp0
[core@cp0 ~]$ sudo su -
[root@cp0 ~]# cd /var/log/kube-apiserver
[root@cp0 kube-apiserver]# tail audit.log
{"kind":"Event","apiVersion":"audit.k8s.io/v1","level":"Metadata","auditID":"08f25e10-4b5e-4ffa-a709-54654af4555f","stage":"ResponseComplete","requestURI":"/apis/groupsnapshot.storage.k8s.io/v1alpha1/volumegroupsnapshotclasses?limit=500\u0026resourceVersion=0","verb":"list","user":{"username":"system:serviceaccount:openshift-cluster-storage-operator:default","uid":"5bb68eb8-bfd0-4184-862c-0954f1ec8c9a","groups":["system:serviceaccounts","system:serviceaccounts:openshift-cluster-storage-operator","system:authenticated"],"extra":{"authentication.kubernetes.io/pod-name":["csi-snapshot-webhook-85d856ff4f-ctnwg"],"authentication.kubernetes.io/pod-uid":["283d9173-1e7a-4c29-8847-9796ab6afe7a"]}},"sourceIPs":["10.128.0.13"],"userAgent":"snapshot-validation-webhook/v0.0.0 (linux/amd64) kubernetes/$Format","objectRef":{"resource":"volumegroupsnapshotclasses","apiGroup":"groupsnapshot.storage.k8s.io","apiVersion":"v1alpha1"},"responseStatus":{"metadata":{},"status":"Failure","message":"volumegroupsnapshotclasses.groupsnapshot.storage.k8s.io is forbidden: User \"system:serviceaccount:openshift-cluster-storage-operator:default\" cannot list resource \"volumegroupsnapshotclasses\" in API group \"groupsnapshot.storage.k8s.io\" at the cluster scope","reason":"Forbidden","details":{"group":"groupsnapshot.storage.k8s.io","kind":"volumegroupsnapshotclasses"},"code":403},"requestReceivedTimestamp":"2024-05-23T08:21:27.301688Z","stageTimestamp":"2024-05-23T08:21:27.304146Z","annotations":{"authorization.k8s.io/decision":"forbid","authorization.k8s.io/reason":""}}
{"kind":"Event","apiVersion":"audit.k8s.io/v1","level":"Metadata","auditID":"c41e12fc-bfb5-4231-9287-85a5ab6df999","stage":"ResponseComplete","requestURI":"/apis/groupsnapshot.storage.k8s.io/v1alpha1/volumegroupsnapshotclasses?limit=500\u0026resourceVersion=0","verb":"list","user":{"username":"system:serviceaccount:openshift-cluster-storage-operator:default","uid":"5bb68eb8-bfd0-4184-862c-0954f1ec8c9a","groups":["system:serviceaccounts","system:serviceaccounts:openshift-cluster-storage-operator","system:authenticated"],"extra":{"authentication.kubernetes.io/pod-name":["csi-snapshot-webhook-85d856ff4f-dgfkn"],"authentication.kubernetes.io/pod-uid":["db608383-5220-4a30-acbc-5142724efd34"]}},"sourceIPs":["192.168.3.21"],"userAgent":"snapshot-validation-webhook/v0.0.0 (linux/amd64) kubernetes/$Format","objectRef":{"resource":"volumegroupsnapshotclasses","apiGroup":"groupsnapshot.storage.k8s.io","apiVersion":"v1alpha1"},"responseStatus":{"metadata":{},"status":"Failure","message":"volumegroupsnapshotclasses.groupsnapshot.storage.k8s.io is forbidden: User \"system:serviceaccount:openshift-cluster-storage-operator:default\" cannot list resource \"volumegroupsnapshotclasses\" in API group \"groupsnapshot.storage.k8s.io\" at the cluster scope","reason":"Forbidden","details":{"group":"groupsnapshot.storage.k8s.io","kind":"volumegroupsnapshotclasses"},"code":403},"requestReceivedTimestamp":"2024-05-23T08:21:53.194064Z","stageTimestamp":"2024-05-23T08:21:53.196702Z","annotations":{"authorization.k8s.io/decision":"forbid","authorization.k8s.io/reason":""}}
{"kind":"Event","apiVersion":"audit.k8s.io/v1","level":"Metadata","auditID":"75c5c22a-a78c-4eaa-9a05-eade76babca1","stage":"ResponseComplete","requestURI":"/apis/groupsnapshot.storage.k8s.io/v1alpha1/volumegroupsnapshotclasses?limit=500\u0026resourceVersion=0","verb":"list","user":{"username":"system:serviceaccount:openshift-cluster-storage-operator:default","uid":"5bb68eb8-bfd0-4184-862c-0954f1ec8c9a","groups":["system:serviceaccounts","system:serviceaccounts:openshift-cluster-storage-operator","system:authenticated"],"extra":{"authentication.kubernetes.io/pod-name":["csi-snapshot-webhook-85d856ff4f-ctnwg"],"authentication.kubernetes.io/pod-uid":["283d9173-1e7a-4c29-8847-9796ab6afe7a"]}},"sourceIPs":["10.128.0.13"],"userAgent":"snapshot-validation-webhook/v0.0.0 (linux/amd64) kubernetes/$Format","objectRef":{"resource":"volumegroupsnapshotclasses","apiGroup":"groupsnapshot.storage.k8s.io","apiVersion":"v1alpha1"},"responseStatus":{"metadata":{},"status":"Failure","message":"volumegroupsnapshotclasses.groupsnapshot.storage.k8s.io is forbidden: User \"system:serviceaccount:openshift-cluster-storage-operator:default\" cannot list resource \"volumegroupsnapshotclasses\" in API group \"groupsnapshot.storage.k8s.io\" at the cluster scope","reason":"Forbidden","details":{"group":"groupsnapshot.storage.k8s.io","kind":"volumegroupsnapshotclasses"},"code":403},"requestReceivedTimestamp":"2024-05-23T08:22:05.526294Z","stageTimestamp":"2024-05-23T08:22:05.528896Z","annotations":{"authorization.k8s.io/decision":"forbid","authorization.k8s.io/reason":""}}...

Première indication d'un probable problème de certificat, des 403. Allons voir un peu plus loin...

[root@cp0 ~]# date
Sat 29 Jun 2024 09:01 AM EDT

[root@cp0 ~]# openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -dates | grep notAfter
notAfter=Jun 01 07:58:30 2024 GMT

Difficile d'être plus clair que ça : ce certificat est expiré depuis bientôt 1 mois. (Wow, le temps passe vite, je n'avais pas réalisé que ce cluster était down depuis si longtemps!)

La doc de Red Hat

Dès que l'on interroge le web, on tombe rapidement sur une doc de Red Hat qui semble très prometteuse : Recovering from expired control plane certificates.

Selon cette doc, le cluster est en mesure de se relever tout seul suite à ce problème d'expirations à l'exception d'un détail : les nouveaux certificats qu'il va créer doivent être approuvés. La procédure semble simple, ça ne devrait pas être bien compliqué! 🙄

Approuvons ces certificats!

Le cluster étant non fonctionnel, oc ne peut évidemment pas le rejoindre à partir de ma workstation. On va donc aller directement sur un control plane et voir à le faire fonctionner. Je n'ai jamais essayé ça avant (je n'en ai jamais eu le besoin), voyons ce que ça va dire. Je vous partage un extrait de mon exploration.

$ ssh core@cp0.st.mcd
Fedora CoreOS 39.20240210.3.0

Tracker: https://github.com/coreos/fedora-coreos-tracker
Discuss: https://discussion.fedoraproject.org/tag/coreos

[core@cp0 ~]$ oc get csr
error: Missing or incomplete configuration info.  Please point to an existing, complete config file:


  1. Via the command-line flag --kubeconfig
  2. Via the KUBECONFIG environment variable
  3. In your home directory as ~/.kube/config

To view or setup config directly use the 'config' command.

[core@cp0 ~]$ export KUBECONFIG=/etc/kubernetes/kubeconfig
[core@cp0 ~]$ oc get csr
error: error loading config file "/etc/kubernetes/kubeconfig": open /etc/kubernetes/kubeconfig: permission denied

[core@cp0 ~]$ sudo su -
[root@cp0 ~]# export KUBECONFIG=/etc/kubernetes/kubeconfig
[root@cp0 ~]# oc get csr
NAME        AGE     SIGNERNAME                                    REQUESTOR                                                                   REQUESTEDDURATION   CONDITION
csr-2skg9   46m     kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Pending
csr-4fk27   55m     kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Pending
csr-4x6s7   5m8s    kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Pending
csr-5fzkd   20m     kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Pending
csr-7q747   16m     kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Pending
csr-d82rh   57s     kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Pending
csr-drxmf   31m     kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Pending
csr-hnt9c   55m     kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Pending
csr-lj4wk   36m     kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Pending
csr-sjpvp   20m     kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Pending
csr-sp9ql   5m12s   kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Pending
csr-t2dcm   36m     kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Pending

[root@cp0 ~]# oc adm certificate approve csr-2skg9
Error from server (Forbidden): certificatesigningrequests.certificates.k8s.io "csr-2skg9" is forbidden: User "system:serviceaccount:openshift-machine-config-operator:node-bootstrapper" cannot update resource "certificatesigningrequests/approval" in API group "certificates.k8s.io" at the cluster scope
[root@cp0 ~]# 

Donc, bonne nouvelle : les certificats ont bien été créés. Moins bonne nouvelle par contre : l'usager node-bootstrapper configuré dans notre kubeconfig n'a pas les droits requis pour les approuver.

À la recherche des droits

J'ai fait toutes sortes de recherche et tests sur le système dont je vous évite les détails, mais c'est finalement dans une discussion sur github que j'ai trouvé ce qui m'a débloqué : comment assembler un kubeconfig avec les droits requis pour approuver les certificats.

En résumé :

  • On prend une coquille de kubeconfig
  • On y fait pointer la configuration des certificats vers les fichiers qui sont montés dans le kube-apiserver qui roule présentement
  • On utilise l'option --insecure-skip-certificate pour nos appels à oc.

[root@cp0 ~]# cp /etc/kubernetes/static-pod-resources/kube-apiserver-certs/configmaps/control-plane-node-kubeconfig/kubeconfig /tmp/kubeconfig
[root@cp0 ~]# vi /tmp/kubeconfig

--> Mettre à jour les 3 lignes de configuration de certificats avec les valeurs suivantes puis sauvegarder :

certificate-authority: /etc/kubernetes/static-pod-resources/kube-apiserver-certs/configmaps/trusted-ca-bundle/ca-bundle.crt
client-certificate: /etc/kubernetes/static-pod-resources/kube-apiserver-certs/secrets/control-plane-node-admin-client-cert-key/tls.crt
client-key: /etc/kubernetes/static-pod-resources/kube-apiserver-certs/secrets/control-plane-node-admin-client-cert-key/tls.key

[root@cp0 ~]# export KUBECONFIG=/tmp/kubeconfig
[root@cp0 ~]# oc --insecure-skip-tls-verify whoami
system:control-plane-node-admin

[root@cp0 ~]# Yippie!!

Got it! :) On est maintenant control-plane-node-admin, on va avoir les droits requis.

Approuvons ces certificats - deuxième prise!

Let's do it again!

[root@cp0 ~]# oc get csr --insecure-skip-tls-verify
NAME        AGE    SIGNERNAME                                    REQUESTOR                                                                   REQUESTEDDURATION   CONDITION
csr-2skg9   73m    kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Pending
csr-4fk27   82m    kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Pending
csr-4x6s7   32m    kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Pending
csr-5458k   17m    kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Pending
csr-5fzkd   48m    kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Pending
csr-75jkd   107s   kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Pending
csr-7q747   43m    kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Pending
csr-8gwz5   17m    kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Pending
csr-d82rh   28m    kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Pending
csr-drxmf   58m    kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Pending
csr-f6jz6   13m    kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Pending
csr-hnt9c   82m    kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Pending
csr-lj4wk   63m    kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Pending
csr-sjpvp   48m    kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Pending
csr-sp9ql   32m    kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Pending
csr-t2dcm   63m    kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Pending
csr-wbkdg   111s   kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Pending

[root@cp0 ~]# oc get csr -o name --insecure-skip-tls-verify | xargs oc adm certificate approve --insecure-skip-tls-verify
certificatesigningrequest.certificates.k8s.io/csr-2skg9 approved
certificatesigningrequest.certificates.k8s.io/csr-4fk27 approved
certificatesigningrequest.certificates.k8s.io/csr-4x6s7 approved
certificatesigningrequest.certificates.k8s.io/csr-5458k approved
certificatesigningrequest.certificates.k8s.io/csr-5fzkd approved
certificatesigningrequest.certificates.k8s.io/csr-75jkd approved
certificatesigningrequest.certificates.k8s.io/csr-7q747 approved
certificatesigningrequest.certificates.k8s.io/csr-8gwz5 approved
certificatesigningrequest.certificates.k8s.io/csr-d82rh approved
certificatesigningrequest.certificates.k8s.io/csr-drxmf approved
certificatesigningrequest.certificates.k8s.io/csr-f6jz6 approved
certificatesigningrequest.certificates.k8s.io/csr-hnt9c approved
certificatesigningrequest.certificates.k8s.io/csr-lj4wk approved
certificatesigningrequest.certificates.k8s.io/csr-sjpvp approved
certificatesigningrequest.certificates.k8s.io/csr-sp9ql approved
certificatesigningrequest.certificates.k8s.io/csr-t2dcm approved
certificatesigningrequest.certificates.k8s.io/csr-wbkdg approved

[root@cp0 ~]# oc get csr --insecure-skip-tls-verify
csr-4x6s7   36m     kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Approved,Issued
csr-5458k   21m     kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Approved,Issued
csr-5fzkd   52m     kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Approved,Issued
csr-75jkd   5m45s   kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Approved,Issued
csr-7q747   47m     kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Approved,Issued
csr-8gwz5   21m     kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Approved,Issued
csr-d82rh   32m     kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Approved,Issued
csr-drxmf   62m     kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Approved,Issued
csr-f6jz6   17m     kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Approved,Issued
csr-hnt9c   86m     kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Approved,Issued
csr-lj4wk   67m     kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Approved,Issued
csr-sjpvp   52m     kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Approved,Issued
csr-sp9ql   36m     kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Approved,Issued
csr-t2dcm   67m     kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Approved,Issued
csr-wbkdg   5m49s   kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Approved,Issued

Looking really good, ça sent bon tout ça! Laissons quelques minutes et on essaie la console.

[A few minutes later] Ouin ben ça ne fonctionne toujours pas... Regardons un peu sous le hood.

[root@cp0 ~]# oc get csr --insecure-skip-tls-verify
csr-4mpl7   10s     kubernetes.io/kube-apiserver-client           system:node:cp1                                                             24h                 Pending
csr-4x6s7   36m     kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Approved,Issued
csr-5458k   21m     kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Approved,Issued
csr-5fzkd   52m     kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Approved,Issued
csr-75jkd   5m45s   kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Approved,Issued
csr-7q747   47m     kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Approved,Issued
csr-8gwz5   21m     kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Approved,Issued
csr-d82rh   32m     kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Approved,Issued
csr-drxmf   62m     kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Approved,Issued
csr-f6jz6   17m     kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Approved,Issued
csr-hnt9c   86m     kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Approved,Issued
csr-lj4wk   67m     kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Approved,Issued
csr-rh54p   32s     kubernetes.io/kubelet-serving                 system:node:cp2                                                             <none>              Pending
csr-sjpvp   52m     kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Approved,Issued
csr-sp9ql   36m     kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Approved,Issued
csr-t2dcm   67m     kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Approved,Issued
csr-wbkdg   5m49s   kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Approved,Issued
csr-xqn2m   31s     kubernetes.io/kube-apiserver-client           system:node:cp1                                                             24h                 Pending

Surprise, de nouveaux certificats à approuver! On répète la même poutine, attend quelques minutes, toujours non-fonctionnel... On vérifie encore une fois, surprise, un 3ième lot de certificats à approuver. Rince, repeat, patiente quelques minutes, essaie la console : ça marche! Woohoo!! Je récupère mon token de la console, oc login ... , tout fonctionne, problem solved! Ce fut un intéressant samedi matin :)

Conclusion

La petite aventure a été un peu plus compliquée que ce à quoi je m'attendais, mais finalement, j'ai mon cluster et j'ai appris. Pour utiliser la bonne vieille expression, je vais me coucher un peu moins niaiseux ce soir! :)

En espérant que cet article puisse être utile à quelqu'un. Sur ce, à la prochaine!

Références

Article écrit par :

Sylvain Tremblay

LinkedIn

mailstremblay@nationtech.io

Sylvain, co-fondateur et CTO de NationTech, a "été choisi" par l'informatique dès l'age de 9 ans. Passionné par tous les aspects du domaine, après quelques années de [gwbasic, turbo pascal, c, c++, asm] c'est particulièrement l'administration de systèmes et les infrastructures complexes qui ont captivé son intérêt. Nous sommes ici à l'époque des BBS, bien avant qu'internet soit disponible aux clients résidentiels.

Il a été parmi les premiers utilisateurs de Linux dès 1992, a ensuite travaillé sur différents systèmes Unix commerciaux à l'occasion de ses années de travail chez Bombardier [Transports, Aerospace], Ferrari F1 ou Hyundai-Kia Motor Corporation.

Il est ensuite revenu dans le monde de l'informatique pure après un séjour en tant qu'informaticien au millieu d'ingénieurs mécaniques. C'est alors qu'il occupe le poste de programmeur pendant plusieurs années, puis d'architecte cloud, spécialiste en infrastructures distribuée, etc. En plus de son travail dans le domaine, il s'affaire dans ses passes temps à des expérimentations poussées avec les technologies de l'heure soit OpenStack dans les années 2010 puis Kubernetes dont il développe une maîtrise avancée.

Effectivement, pour Sylvain toutes les raisons sont bonnes pour acheter un serveur à ajouter dans son homelab ou une imprimante 3D de plus et il les utilise à bon escient, toujours fidèle à sa grande générosité.

Reach us here :