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

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 GMTDifficile 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
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 :