3 ms·
> This significantly improved the issue of things working only in certain environments, because each environment was actually running exactly the same way. It
by lmm 1y ago
> This significantly improved the issue of things working only in certain environments, because each environment was actually running exactly the same way.
It doesn't though, because it's still just running some random unmanaged commands. If you download a Dockerfile that's a couple of years old and hasn't been maintained, it probably won't work. If you download the built image then it might work for a bit longer, but you won't be able to make any changes to it, and it will still break sooner or later due to e.g. certificate expiry, or being built for the wrong CPU architecture.
> Then came k8s, which tried to solve the issue of deploying across clusters of machines, PaaS. That's not a trivial problem to solve, and consequently is still hard, even with it. But if you need to deploy countless services across hundreds of nodes... It's ultimately a great tool.
Declarative deployment definitely has a lot of value. But k8s shoots itself in the foot by being Docker based, even as the world gradually moves onto better models (language-specific serverless deployments).
- ffsm8 1y agoYou seem to have a fundamental misunderstanding about what docker actually does, and how it's achieving it > If you download a Dockerfile that's a couple of years old and hasn't been maintained, it probably won't work The dockerfile is not the produced artifact, that's merely the most common way to build the artifact. The artifact is the image. Which itself is only a zip file of a linux filesystem, basically. This will behave the same, no matter when you downloaded it. And I might add: the goal you seem to have: to make an image runnable forevermore is not the goal of docker, again. But if you made a new image, you can then test the exact same deployment in another environment. You do not need to e.g. run apt update on prod and pray to the gods that nothing breaks. Instead you build the image, deploy to test, see that nothing breaks and then deploy to prod. Also k8s isn't technically backed by the docker backend anymore. It hasn't for a pretty long time now. It's currently using containerd by default https://github.com/containerd/containerd https://github.com/containerd/containerd But supports other backends too https://kubernetes.io/docs/setup/production-environment/container-runtimes/ https://kubernetes.io/docs/setup/production-environment/cont...
- lmm 1y ago> You seem to have a fundamental misunderstanding about what docker actually does, and how it's achieving it On the contrary, I understand what it actually does (or tries to) for very well, you're hung up on what its proponents say it's meant to do (or perhaps retreat to in motte-and-bailey fashion). > The artifact is the image. Which itself is only a zip file of a linux filesystem, basically. This will behave the same, no matter when you downloaded it. But it won't. It's architecture-specific, it may rely on other interfaces that are ultimately moving targets, and you'll face things like certificate expiration. And modifying it in place is not sustainable, you need to be able to rebuild it. > if you made a new image, you can then test the exact same deployment in another environment. You do not need to e.g. run apt update on prod and pray to the gods that nothing breaks. Instead you build the image, deploy to test, see that nothing breaks and then deploy to prod. That's not nothing but it's something decent language deployment systems already had for years. Build your structured app image, it's a stable artifact, and you can deploy it any number of times and places. > But supports other backends too But they're all using that same model of unpack some random unmanaged bytes and try to run them as a Linux executable, right? Yes you can swap out the implementation, but the interface is fundamentally at the wrong level of abstraction.
- ffsm8 1y agoI entered the tech industry with an ops role, which is why I had - from the perspective of most devs - a lot of experience with the kind of issues k8s solves. In this context, your responses are very puzzling. I don't disagree with the core of your opinion - there are languages around that solve the issue of sourcing your language specific dependencies a lot better for it's ecosystem then docker ever could. Some languages, such as erlang/elixir also come with highly advanced and stable clustering basically buildin, which solves running your own software on your own hardware in a distributed manner. However, that's a completely different issue to what docker and k8s solves. From devops centered enterprise: K8s basically replaced over provisioned hypervisors running countless VMs with running services in namespaces, no longer needing to over-commit RAM to multiple machines. And Docker replaced the VMs we were building before that with OCI. In a less advanced enterprise, OCI replaced the dreaded "patchday" update process with a unified deployment pipeline that simply rebuild the image every so often, giving you high confidence that the deployment will encounter less adhoc issues then youd have to solve before. I'm saying this as from the perspective of a not particularly enthusiastic user of k8s. I would suggest everyone to first just run single node with high availability fail over if necessary... But once you're signing SLA with high availability guarantees, deploying hundreds of services per day: doing anything but k8s is a bad idea. You're not doing that with the built-in tooling of e.g. Erlang/elixir either, because you're still missing all the other parts of your infrastructure.