[{"data":1,"prerenderedAt":352},["ShallowReactive",2],{"navigation":3,"blog-page":14,"blogs":24},[4],{"title":5,"path":6,"stem":7,"children":8,"page":13},"Blog","\u002Fblog","blog",[9],{"title":10,"path":11,"stem":12},"Kubernetes 101","\u002Fblog\u002Fkubernetes-introduction","blog\u002Fkubernetes-introduction",false,{"id":15,"title":16,"body":17,"description":18,"extension":19,"links":17,"meta":20,"navigation":21,"path":6,"seo":22,"stem":7,"__hash__":23},"pages\u002Fblog.yml","Writing",null,"Notes from building industrial systems that have to run in production. Mostly about data backbones, edge fleets, telemetry and planning — occasionally about why the obvious approach is wrong.","yml",{},true,{"title":16,"description":18},"l04APk_xJZiAOtbnuCqgXkRS2c014WYevKp2JtEt-TI",[25],{"id":26,"title":10,"body":27,"canonical":17,"date":340,"description":341,"draft":13,"extension":342,"featured":13,"format":343,"image":17,"meta":344,"minRead":336,"navigation":21,"path":11,"pillar":345,"seo":346,"series":17,"slides":21,"stem":12,"tags":347,"updated":17,"__hash__":351},"blog\u002Fblog\u002Fkubernetes-introduction.md",{"type":28,"value":29,"toc":322},"minimark",[30,34,39,42,46,75,78,98,102,105,108,111,115,118,121,125,128,131,135,138,152,155,158,162,173,227,231,236,260,264,290,294,312,316,319],[31,32,33],"p",{},"A short primer before anything edge-specific.",[35,36,38],"h2",{"id":37},"what-it-is","What it is",[31,40,41],{},"Kubernetes is an open-source container orchestrator. It joins several machines into one cluster and takes care of deploying, scaling and managing containerised applications through a standard API.",[35,43,45],{"id":44},"why-use-it-and-when-not-to-use-it","Why use it, and when not to use it",[47,48,49,57,63,69],"ul",{},[50,51,52,56],"li",{},[53,54,55],"strong",{},"Resilience."," With several nodes, workloads move elsewhere when a machine fails.",[50,58,59,62],{},[53,60,61],{},"Scaling."," An application runs as one or many containers behind the same API.",[50,64,65,68],{},[53,66,67],{},"Service discovery."," Workloads find each other by name, not by hand-managed IP addresses.",[50,70,71,74],{},[53,72,73],{},"Consistency."," The same manifests deploy on-premise, in the cloud, or across both.",[31,76,77],{},"And when not to:",[47,79,80,86,92],{},[50,81,82,85],{},[53,83,84],{},"One app on one box."," Docker Compose or systemd is simpler and enough.",[50,87,88,91],{},[53,89,90],{},"Nobody to run it."," Kubernetes is a platform to operate, not a tool to install. The learning curve is real, and so is the day-two work.",[50,93,94,97],{},[53,95,96],{},"Hard real time."," It schedules containers. It does not replace a PLC or a real-time OS.",[35,99,101],{"id":100},"brief-history","Brief history",[31,103,104],{},"Kubernetes grew out of a decade of running containers inside Google, went open source in 2014, and was handed to a vendor-neutral foundation a year later. That last move is what turned it into an industry standard rather than a Google product.",[106,107],"k8s-history",{},[31,109,110],{},"One of the 3 most mature projects in the CNCF.",[35,112,114],{"id":113},"an-extensible-product","An extensible product...",[31,116,117],{},"The API is the contract. Every object has a path on it, operators add their own kinds, and runtime, network and storage are swappable behind standard interfaces. Like Linux, it comes in many distributions.",[119,120],"k8s-api-path",{},[35,122,124],{"id":123},"based-on-a-reconciliation-principle","...based on a reconciliation principle",[31,126,127],{},"You tell Kubernetes what you want, not how to get there: \"two copies of this container, reachable on this port\". The cluster stores that desired state and keeps comparing it with what is actually running. When a pod crashes or a node disappears, the gap is noticed and closed without anyone being paged. The same loop applies your changes: edit the desired state, and the cluster converges to it.",[129,130],"k8s-reconcile",{},[35,132,134],{"id":133},"control-plane-and-data-plane","Control plane and data plane",[31,136,137],{},"A cluster has two halves.",[47,139,140,146],{},[50,141,142,145],{},[53,143,144],{},"The control plane"," holds the desired state. It is made of the API server, the scheduler, the controller managers, and a datastore (etcd, or SQLite in a default k3s install).",[50,147,148,151],{},[53,149,150],{},"The data plane"," is the worker nodes. They run the containers the control plane assigns to them.",[153,154],"k8s-architecture",{},[31,156,157],{},"Operators and tooling talk to the API server. End users never see it; they reach the applications running on the nodes.",[35,159,161],{"id":160},"hands-on","Hands-on",[31,163,164,165,172],{},"Exercises in ",[166,167,171],"a",{"href":168,"rel":169},"https:\u002F\u002Fgithub.com\u002Fmathieu-sabatier\u002Fk8s-101-exercices",[170],"nofollow","k8s-101-exercices",": a folder each, with README, manifests and a check script. Work in your own namespace on the shared k3s cluster.",[174,175,176,187,197,207,217],"ol",{},[50,177,178,186],{},[53,179,180,185],{},[166,181,184],{"href":182,"rel":183},"https:\u002F\u002Fgithub.com\u002Fmathieu-sabatier\u002Fk8s-101-exercices\u002Ftree\u002Fmain\u002F00-hello",[170],"Hello","."," Two replicas. Delete a pod by hand, watch it come back.",[50,188,189,196],{},[53,190,191,185],{},[166,192,195],{"href":193,"rel":194},"https:\u002F\u002Fgithub.com\u002Fmathieu-sabatier\u002Fk8s-101-exercices\u002Ftree\u002Fmain\u002F01-service",[170],"Service"," A NodePort in front, reached from outside and by name inside.",[50,198,199,206],{},[53,200,201,185],{},[166,202,205],{"href":203,"rel":204},"https:\u002F\u002Fgithub.com\u002Fmathieu-sabatier\u002Fk8s-101-exercices\u002Ftree\u002Fmain\u002F02-configmap",[170],"ConfigMap"," Config out of the image. Which changes need a rollout?",[50,208,209,216],{},[53,210,211,185],{},[166,212,215],{"href":213,"rel":214},"https:\u002F\u002Fgithub.com\u002Fmathieu-sabatier\u002Fk8s-101-exercices\u002Ftree\u002Fmain\u002F03-initcontainer",[170],"Init containers"," Wait for a dependency, seed a volume, then start.",[50,218,219,226],{},[53,220,221,185],{},[166,222,225],{"href":223,"rel":224},"https:\u002F\u002Fgithub.com\u002Fmathieu-sabatier\u002Fk8s-101-exercices\u002Ftree\u002Fmain\u002F04-break-it",[170],"Break it"," Wrong image tag, failing probe. Describe, logs, events, fix.",[35,228,230],{"id":229},"key-tools","Key tools",[232,233,235],"h3",{"id":234},"cli","CLI:",[47,237,238,246],{},[50,239,240,245],{},[166,241,244],{"href":242,"rel":243},"https:\u002F\u002Fkubernetes.io\u002Fdocs\u002Freference\u002Fkubectl\u002F",[170],"kubectl",", the go-to for quick debug and inspection.",[50,247,248,253,254,259],{},[166,249,252],{"href":250,"rel":251},"https:\u002F\u002Fk9scli.io\u002F",[170],"k9s",", ",[166,255,258],{"href":256,"rel":257},"https:\u002F\u002Flenshq.io\u002F",[170],"lens",", tool to visualise cluster state",[232,261,263],{"id":262},"application-packaging","Application packaging:",[47,265,266,274,282],{},[50,267,268,273],{},[166,269,272],{"href":270,"rel":271},"https:\u002F\u002Fkustomize.io\u002F",[170],"kustomize"," native templates",[50,275,276,281],{},[166,277,280],{"href":278,"rel":279},"https:\u002F\u002Fhelm.sh\u002Fdocs\u002F",[170],"helm"," app templating, client side",[50,283,284,289],{},[166,285,288],{"href":286,"rel":287},"https:\u002F\u002Fkro.run\u002F",[170],"kro"," app templating, server side",[232,291,293],{"id":292},"gitops","GitOps",[47,295,296,304],{},[50,297,298,303],{},[166,299,302],{"href":300,"rel":301},"https:\u002F\u002Ffluxcd.io\u002F",[170],"flux",", unix-style & lighweight controllers",[50,305,306,311],{},[166,307,310],{"href":308,"rel":309},"https:\u002F\u002Fargo-cd.readthedocs.io\u002Fen\u002Fstable\u002F",[170],"argocd",", dev friendly app & UI",[35,313,315],{"id":314},"what-gitops-is-exactly","What GitOps is exactly?",[31,317,318],{},"Instead of pointing kubectl at the cluster, you push manifests to a Git repository and an agent inside the cluster pulls them and applies them through the API server. The repository becomes the source of truth: every change is a reviewed commit, the whole cluster can be rebuilt from it, and rolling back is a revert.",[320,321],"k8s-gitops",{},{"title":323,"searchDepth":324,"depth":324,"links":325},"",2,[326,327,328,329,330,331,332,333,339],{"id":37,"depth":324,"text":38},{"id":44,"depth":324,"text":45},{"id":100,"depth":324,"text":101},{"id":113,"depth":324,"text":114},{"id":123,"depth":324,"text":124},{"id":133,"depth":324,"text":134},{"id":160,"depth":324,"text":161},{"id":229,"depth":324,"text":230,"children":334},[335,337,338],{"id":234,"depth":336,"text":235},3,{"id":262,"depth":336,"text":263},{"id":292,"depth":336,"text":293},{"id":314,"depth":324,"text":315},"2026-09-25","What Kubernetes is, what problems it solves, and how it is composed and start using it.","md","guide",{},"edge",{"title":10,"description":341},[348,349,350],"kubernetes","k3s","primer","2FT5iJNmj4lFDtUu7noSIWC_iMV6MpwPA4mFEmCKtiM",1791414106274]