<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom"><title>Simon Willison's Weblog: kubernetes</title><link href="http://simonwillison.net/" rel="alternate"/><link href="http://simonwillison.net/tags/kubernetes.atom" rel="self"/><id>http://simonwillison.net/</id><updated>2025-03-17T18:51:50+00:00</updated><author><name>Simon Willison</name></author><entry><title>suitenumerique/docs</title><link href="https://simonwillison.net/2025/Mar/17/docs/#atom-tag" rel="alternate"/><published>2025-03-17T18:51:50+00:00</published><updated>2025-03-17T18:51:50+00:00</updated><id>https://simonwillison.net/2025/Mar/17/docs/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/suitenumerique/docs"&gt;suitenumerique/docs&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
New open source (MIT licensed) collaborative text editing web application, similar to Google Docs or Notion, notable because it's a joint effort funded by the French and German governments and "currently onboarding the Netherlands".&lt;/p&gt;
&lt;p&gt;It's built using Django and React:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Docs is built on top of &lt;a href="https://www.django-rest-framework.org/"&gt;Django Rest Framework&lt;/a&gt;, &lt;a href="https://nextjs.org/"&gt;Next.js&lt;/a&gt;, &lt;a href="https://www.blocknotejs.org/"&gt;BlockNote.js&lt;/a&gt;, &lt;a href="https://tiptap.dev/docs/hocuspocus/introduction"&gt;HocusPocus&lt;/a&gt; and &lt;a href="https://yjs.dev/"&gt;Yjs&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Deployments currently &lt;a href="https://github.com/suitenumerique/docs/blob/main/docs/installation.md"&gt;require&lt;/a&gt; Kubernetes, PostgreSQL, memcached, an S3 bucket (or compatible) and an OIDC provider.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/open-source"&gt;open-source&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/postgresql"&gt;postgresql&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/s3"&gt;s3&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/react"&gt;react&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/kubernetes"&gt;kubernetes&lt;/a&gt;&lt;/p&gt;



</summary><category term="django"/><category term="open-source"/><category term="postgresql"/><category term="s3"/><category term="react"/><category term="kubernetes"/></entry><entry><title>OpenAI's postmortem for API, ChatGPT &amp; Sora Facing Issues</title><link href="https://simonwillison.net/2024/Dec/13/openai-postmortem/#atom-tag" rel="alternate"/><published>2024-12-13T05:29:10+00:00</published><updated>2024-12-13T05:29:10+00:00</updated><id>https://simonwillison.net/2024/Dec/13/openai-postmortem/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://status.openai.com/incidents/ctrsv3lwd797"&gt;OpenAI&amp;#x27;s postmortem for API, ChatGPT &amp;amp; Sora Facing Issues&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
OpenAI had an outage across basically everything for four hours on Wednesday. They've now published a detailed postmortem which includes some fascinating technical details about their "hundreds of Kubernetes clusters globally".&lt;/p&gt;
&lt;p&gt;The culprit was a newly deployed telemetry system:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Telemetry services have a very wide footprint, so this new service’s configuration unintentionally caused every node in each cluster to execute resource-intensive Kubernetes API operations whose cost scaled with the size of the cluster. With thousands of nodes performing these operations simultaneously, the Kubernetes API servers became overwhelmed, taking down the Kubernetes control plane in most of our large clusters. [...]&lt;/p&gt;
&lt;p&gt;The Kubernetes data plane can operate largely independently of the control plane, but DNS relies on the control plane – services don’t know how to contact one another without the Kubernetes control plane. [...]&lt;/p&gt;
&lt;p&gt;DNS caching mitigated the impact temporarily by providing stale but functional DNS records. However, as cached records expired over the following 20 minutes, services began failing due to their reliance on real-time DNS resolution.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It's always DNS.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://twitter.com/therealadamg/status/1867393379287650778"&gt;@therealadamg&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/dns"&gt;dns&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/devops"&gt;devops&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/kubernetes"&gt;kubernetes&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/postmortem"&gt;postmortem&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/openai"&gt;openai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/chatgpt"&gt;chatgpt&lt;/a&gt;&lt;/p&gt;



</summary><category term="dns"/><category term="devops"/><category term="kubernetes"/><category term="postmortem"/><category term="openai"/><category term="chatgpt"/></entry><entry><title>Quoting Jake Teton-Landis</title><link href="https://simonwillison.net/2024/Sep/25/jake-teton-landis/#atom-tag" rel="alternate"/><published>2024-09-25T18:08:19+00:00</published><updated>2024-09-25T18:08:19+00:00</updated><id>https://simonwillison.net/2024/Sep/25/jake-teton-landis/#atom-tag</id><summary type="html">
    &lt;blockquote cite="https://news.ycombinator.com/item?id=41645173#41648480"&gt;&lt;p&gt;We used this model [periodically transmitting configuration to different hosts] to distribute translations, feature flags, configuration, search indexes, etc at Airbnb. But instead of SQLite we used &lt;a href="https://github.com/spotify/sparkey"&gt;Sparkey&lt;/a&gt;, a KV file format developed by Spotify. In early years there was a Cron job on every box that pulled that service’s thingies; then once we switched to Kubernetes we used a daemonset &amp;amp; host tagging (taints?) to pull a variety of thingies to each host and then ensure the services that use the thingies only ran on the hosts that had the thingies.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://news.ycombinator.com/item?id=41645173#41648480"&gt;Jake Teton-Landis&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/sqlite"&gt;sqlite&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/kubernetes"&gt;kubernetes&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/feature-flags"&gt;feature-flags&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/baked-data"&gt;baked-data&lt;/a&gt;&lt;/p&gt;



</summary><category term="sqlite"/><category term="kubernetes"/><category term="feature-flags"/><category term="baked-data"/></entry><entry><title>Carving the Scheduler Out of Our Orchestrator</title><link href="https://simonwillison.net/2023/Feb/2/carving-the-scheduler-out-of-our-orchestrator/#atom-tag" rel="alternate"/><published>2023-02-02T21:46:35+00:00</published><updated>2023-02-02T21:46:35+00:00</updated><id>https://simonwillison.net/2023/Feb/2/carving-the-scheduler-out-of-our-orchestrator/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://fly.io/blog/carving-the-scheduler-out-of-our-orchestrator/"&gt;Carving the Scheduler Out of Our Orchestrator&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Thomas Ptacek describes Fly’s new custom-built alternative to Nomad and Kubernetes in detail, including why they eventually needed to build something custom to best serve their platform. In doing so he provides the best explanation I’ve ever seen of what an orchestration system actually does.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://infosec.exchange/@tqbf/109796131985160831"&gt;@tqbf&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/thomas-ptacek"&gt;thomas-ptacek&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/kubernetes"&gt;kubernetes&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/fly"&gt;fly&lt;/a&gt;&lt;/p&gt;



</summary><category term="thomas-ptacek"/><category term="kubernetes"/><category term="fly"/></entry><entry><title>Two reasons Kubernetes is so complex</title><link href="https://simonwillison.net/2022/Jan/27/two-reasons-kubernetes-is-so-complex/#atom-tag" rel="alternate"/><published>2022-01-27T18:25:38+00:00</published><updated>2022-01-27T18:25:38+00:00</updated><id>https://simonwillison.net/2022/Jan/27/two-reasons-kubernetes-is-so-complex/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://buttondown.email/nelhage/archive/two-reasons-kubernetes-is-so-complex/"&gt;Two reasons Kubernetes is so complex&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
I like how this article proposes that Kubernetes isn’t trying to be a tool for deploying containers—it’s more like an operating system for a cluster of machines, responsible for the same kind of goals as a regular operating system such as resource sharing and portability. And since everything is built as control loops which attempt to modify actual state to fit the declarative desired state, errors can occur asynchronously seconds or even minutes after the desired state has been updated.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://news.ycombinator.com/item?id=30096674"&gt;Hacker News&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/kubernetes"&gt;kubernetes&lt;/a&gt;&lt;/p&gt;



</summary><category term="kubernetes"/></entry><entry><title>Weeknotes: Learning Kubernetes, learning Web Components</title><link href="https://simonwillison.net/2021/Oct/28/weeknotes-kubernetes-web-components/#atom-tag" rel="alternate"/><published>2021-10-28T02:44:33+00:00</published><updated>2021-10-28T02:44:33+00:00</updated><id>https://simonwillison.net/2021/Oct/28/weeknotes-kubernetes-web-components/#atom-tag</id><summary type="html">
    &lt;p&gt;I've been mainly climbing the learning curve for Kubernetes and Web Components this week. I also released Datasette 0.59.1 with Python 3.10 compatibility and an updated Docker image.&lt;/p&gt;
&lt;h4&gt;Datasette 0.59.1&lt;/h4&gt;
&lt;p&gt;A few weeks ago I wrote about &lt;a href="https://simonwillison.net/2021/Oct/9/finding-and-reporting-a-bug/"&gt;finding and reporting an asyncio bug in Python 3.10&lt;/a&gt; that I discovered while trying to get Datasette to work on the latest release of Python.&lt;/p&gt;
&lt;p&gt;Łukasz Langa &lt;a href="https://bugs.python.org/msg403506"&gt;offered a workaround&lt;/a&gt; which I submitted as &lt;a href="https://github.com/aio-libs/janus/pull/359"&gt;a PR to the Janus library&lt;/a&gt; that Datasette depends on.&lt;/p&gt;
&lt;p&gt;Andrew Svetlov landed and shipped that fix, which unblocked me from releasing &lt;a href="https://docs.datasette.io/en/stable/changelog.html#v0-59-1"&gt;Datasette 0.59.1&lt;/a&gt; that works with Python 3.10.&lt;/p&gt;
&lt;p&gt;The last step of the Datasette release process, after the package has been released to PyPI, is to build a new Docker image and publish it &lt;a href="https://hub.docker.com/r/datasetteproject/datasette"&gt;to Docker Hub&lt;/a&gt;. Here's the &lt;a href="https://github.com/simonw/datasette/blob/0.59.1/.github/workflows/publish.yml#L100-L119"&gt;GitHub Actions workflow&lt;/a&gt; that does that.&lt;/p&gt;
&lt;p&gt;It turns out this stopped working when I released Datasette 0.59! I was getting this cryptic error message half way through the image build process:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;/usr/bin/perl: error while loading shared libraries: libcrypt.so.1: cannot open shared object file: No such file or directory&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I &lt;a href="https://github.com/simonw/datasette/issues/1497"&gt;opened an issue for myself&lt;/a&gt; and started investigating.&lt;/p&gt;
&lt;p&gt;The culprit was this section of the Datasette Dockerfile:&lt;/p&gt;
&lt;div class="highlight highlight-source-dockerfile"&gt;&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; software-properties-common provides add-apt-repository &lt;/span&gt;
&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; which we need in order to install a more recent release &lt;/span&gt;
&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; of libsqlite3-mod-spatialite from the sid distribution &lt;/span&gt;
&lt;span class="pl-k"&gt;RUN&lt;/span&gt; apt-get update &amp;amp;&amp;amp; &lt;span class="pl-c1"&gt;\ &lt;/span&gt;
    apt-get -y --no-install-recommends install software-properties-common &amp;amp;&amp;amp; &lt;span class="pl-c1"&gt;\ &lt;/span&gt;
    add-apt-repository &lt;span class="pl-s"&gt;"deb http://httpredir.debian.org/debian sid main"&lt;/span&gt; &amp;amp;&amp;amp; &lt;span class="pl-c1"&gt;\ &lt;/span&gt;
    apt-get update &amp;amp;&amp;amp; &lt;span class="pl-c1"&gt;\ &lt;/span&gt;
    apt-get -t sid install -y --no-install-recommends libsqlite3-mod-spatialite &amp;amp;&amp;amp; &lt;span class="pl-c1"&gt;\ &lt;/span&gt;
    apt-get remove -y software-properties-common &amp;amp;&amp;amp; &lt;span class="pl-c1"&gt;\ &lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This was a hack I introduced seven months ago in order to &lt;a href="https://github.com/simonw/datasette/issues/1249"&gt;upgrade the bundled SpatiaLite to version 5.0&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;SpatiaLite 5.0 wasn't yet available in Debian stable back then, so I used the above convoluted hack to install it from Debian unstable ("Sid") instead.&lt;/p&gt;
&lt;p&gt;When the latest stable version of Debian, &lt;a href="https://www.debian.org/releases/bullseye/"&gt;Debian Bullseye&lt;/a&gt;, came out on October 9th my hack stopped working! I guess that's what I get for messing around with unstable software.&lt;/p&gt;
&lt;p&gt;Thankfully, Bullseye now bundles SpatiaLite 5, so the hack I was using is no longer necessary. I upgraded the Datasette base image from &lt;code&gt;python:3.9.2-slim-buster&lt;/code&gt; to &lt;code&gt;3.9.7-slim-bullseye&lt;/code&gt;, installed SpatialLite the non-hacky way and fixed the issue.&lt;/p&gt;
&lt;p&gt;Doing so also dropped the size of the compressed Datasette image from 94.37MB to 78.94MB, which is nice.&lt;/p&gt;
&lt;h4&gt;Learning Kubernetes&lt;/h4&gt;
&lt;p&gt;Datasette has been designed to run in containers from the very start. I have dozens of instances running on Google Cloud Run, and I've done a bunch of work with Docker as well, including trying out mechanisms to programatically launch new Datasette containers via the Docker API.&lt;/p&gt;
&lt;p&gt;I've dragged my heels on really getting into Kubernetes due to the infamously tough learning curve, but I think it's time to dig in, figure out how to use it and work out what new abilities it can provide me.&lt;/p&gt;
&lt;p&gt;I've spun up small a Kubernetes cluster &lt;a href="https://www.digitalocean.com/products/kubernetes/"&gt;on Digital Ocean&lt;/a&gt;, mainly because I trust their UI to help me not spend hundreds of dollars by mistake. Getting the initial cluster running was very pleasant.&lt;/p&gt;
&lt;p&gt;Now I'm figuring out how to do things with it.&lt;/p&gt;
&lt;p&gt;DigitalOcean's &lt;a href="https://github.com/digitalocean/Kubernetes-Starter-Kit-Developers"&gt;Operations-ready DigitalOcean Kubernetes (DOKS) for Developers&lt;/a&gt; course (which started as a webinar) starts OK and then gets quite complicated quite fast.&lt;/p&gt;
&lt;p&gt;I got Paul Bouwer's &lt;a href="https://github.com/paulbouwer/hello-kubernetes"&gt;hello-kubernetes&lt;/a&gt; demo app working - it introduced me to &lt;a href="https://helm.sh/"&gt;Helm&lt;/a&gt;, but that operates at a higher level than I'm comfortable with - learning my way around &lt;code&gt;kubectl&lt;/code&gt; and Kubernetes YAML is enough of a mental load already without adding an extra abstraction on top.&lt;/p&gt;
&lt;p&gt;I'm reading &lt;a href="https://www.oreilly.com/library/view/kubernetes-up-and/9781492046523/"&gt;Kubernetes: Up and Running&lt;/a&gt; which is promising so far.&lt;/p&gt;
&lt;p&gt;My current goal is to figure out how to run a Datasette instance in a Kubernetes container with an attached persistent volume, so it can handle SQLite writes as well as reads. It looks like &lt;a href="https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/"&gt;StatefulSets&lt;/a&gt; will be key to getting that to work. (Update: apparently not! Graham Dumpleton and Frank Wiles &lt;a href="https://twitter.com/GrahamDumpleton/status/1453554279420084225"&gt;assure me&lt;/a&gt; that I can do this with just a regular Deployment.)&lt;/p&gt;
&lt;p&gt;I'll be sure to write this up as &lt;a href="https://til.simonwillison.net/"&gt;a TIL&lt;/a&gt; once I get it working.&lt;/p&gt;
&lt;h4&gt;Learning Web Components&lt;/h4&gt;
&lt;p&gt;Datasette's visualization plugins - in particular &lt;a href="https://datasette.io/plugins/datasette-vega"&gt;datasette-vega&lt;/a&gt; - are long overdue for some upgrades.&lt;/p&gt;
&lt;p&gt;I've been trying to find a good pattern for writing plugins that avoids too much (ideally any) build tool complexity, and that takes advantage of modern JavaScript - in particular JavaScript modules, which Datasette has supported since &lt;a href="https://simonwillison.net/2021/Jan/25/datasette/#javascript-module-support"&gt;Datasette 0.54&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As such, I'm deeply intrigued by &lt;a href="https://developer.mozilla.org/en-US/docs/Web/Web_Components"&gt;Web Components&lt;/a&gt; - which had a big moment this week when it was revealed that Adobe had used them extensively &lt;a href="https://web.dev/ps-on-the-web/"&gt;for Photoshop on the web&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One of my goals for Datasette visualization plugins is for them to be usable on other external pages - since Datasette can expose JSON data over CORS, being able to drop a visualization into an HTML page would be really neat (especially for newsroom purposes).&lt;/p&gt;
&lt;p&gt;Imagine being able to import a JavaScript module and add something like this to get a map of all of the power plants in Portugal:&lt;/p&gt;
&lt;div class="highlight highlight-text-html-basic"&gt;&lt;pre&gt;&lt;span class="pl-kos"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;datasette-cluster-map&lt;/span&gt;
  &lt;span class="pl-c1"&gt;data&lt;/span&gt;="&lt;span class="pl-s"&gt;https://global-power-plants.datasettes.com/global-power-plants/global-power-plants.json?country_long=Portugal&lt;/span&gt;"&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="pl-kos"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="pl-ent"&gt;datasette-cluster-map&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I'm hoping to be able to build components using regular, unadorned modern JavaScript, without the complexity of a build step.&lt;/p&gt;
&lt;p&gt;As such, I've been exploring &lt;a href="https://www.skypack.dev/"&gt;Skypack&lt;/a&gt; (&lt;a href="https://til.simonwillison.net/javascript/lit-with-skypack"&gt;TIL&lt;/a&gt;) and &lt;a href="https://www.snowpack.dev/"&gt;Snowpack&lt;/a&gt; which help bridge the gap between build-tooling-dependent npm packages and the modern world of native browser &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules"&gt;ES modules&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I was also impressed this week by &lt;a href="https://tonicframework.dev/"&gt;Tonic&lt;/a&gt;, a framework for building components without a build step that weighs in at just 350 lines of code and makes extremely clever use of tagged template literals and async generators.&lt;/p&gt;
&lt;p&gt;This morning I saw this clever example of a &lt;a href="https://gist.github.com/kristoferjoseph/c4e47389ae0f0447db175b914e471628"&gt;Single File Web Component&lt;/a&gt; by Kristofer Joseph - I ended up creating my own annotated version of his code which &lt;a href="https://til.simonwillison.net/web-components/understanding-single-file-web-component"&gt;I shared in this TIL&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Next step: I need to write some web components of my own!&lt;/p&gt;
&lt;h4&gt;Releases this week&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/simonw/datasette"&gt;datasette&lt;/a&gt;&lt;/strong&gt;: &lt;a href="https://github.com/simonw/datasette/releases/tag/0.59.1"&gt;0.59.1&lt;/a&gt; - (&lt;a href="https://github.com/simonw/datasette/releases"&gt;99 releases total&lt;/a&gt;) - 2021-10-24
&lt;br /&gt;An open source multi-tool for exploring and publishing data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/simonw/datasette-hello-world"&gt;datasette-hello-world&lt;/a&gt;&lt;/strong&gt;: &lt;a href="https://github.com/simonw/datasette-hello-world/releases/tag/0.1"&gt;0.1&lt;/a&gt; - 2021-10-21
&lt;br /&gt;The hello world of Datasette plugins&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;TIL this week&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://til.simonwillison.net/git/remove-commit-and-force-push"&gt;Removing a git commit and force pushing to remove it from history&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://til.simonwillison.net/web-components/understanding-single-file-web-component"&gt;Understanding Kristofer Joseph's Single File Web Component&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/docker"&gt;docker&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/datasette"&gt;datasette&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/kubernetes"&gt;kubernetes&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/web-components"&gt;web-components&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/weeknotes"&gt;weeknotes&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="docker"/><category term="datasette"/><category term="kubernetes"/><category term="web-components"/><category term="weeknotes"/></entry><entry><title>Smooth sailing with Kubernetes</title><link href="https://simonwillison.net/2021/Jul/1/smooth-sailing-with-kubernetes/#atom-tag" rel="alternate"/><published>2021-07-01T23:30:57+00:00</published><updated>2021-07-01T23:30:57+00:00</updated><id>https://simonwillison.net/2021/Jul/1/smooth-sailing-with-kubernetes/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://cloud.google.com/kubernetes-engine/kubernetes-comic"&gt;Smooth sailing with Kubernetes&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Scott McCloud (of Understanding Comics) authored this comic introduction to Kubernetes, and it’s a really good explanation of the core concepts. I’d love to have something like this for Datasette—I still feel like I’m a long way from being able to explain the project with anything like this amount of clarity.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://twitter.com/kaslinfields/status/1410736499725717504"&gt;@kaslinfields&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/comics"&gt;comics&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/kubernetes"&gt;kubernetes&lt;/a&gt;&lt;/p&gt;



</summary><category term="comics"/><category term="kubernetes"/></entry><entry><title>Experiences with running PostgreSQL on Kubernetes</title><link href="https://simonwillison.net/2018/Aug/13/postgresql-on-kubernetes/#atom-tag" rel="alternate"/><published>2018-08-13T14:30:52+00:00</published><updated>2018-08-13T14:30:52+00:00</updated><id>https://simonwillison.net/2018/Aug/13/postgresql-on-kubernetes/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://gravitational.com/blog/running-postgresql-on-kubernetes/"&gt;Experiences with running PostgreSQL on Kubernetes&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Fascinating interview that makes a solid argument for the idea that running stateful data stores like PostgreSQL or Cassandra is made harder, not easier when you add an orchestration tool like Kubernetes into the mix.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://twitter.com/mipsytipsy/status/1028767910511046656"&gt;@mipsytipsy&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/postgresql"&gt;postgresql&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/kubernetes"&gt;kubernetes&lt;/a&gt;&lt;/p&gt;



</summary><category term="postgresql"/><category term="kubernetes"/></entry></feed>