News for hackers. Stuff that matters.
Re:Ask HN: If Kubernetes is the solution, why are there so m... by throwaway894345 on Wednesday June 01, 2022 @10:13AM (#31582071)
You're not dumb, you're just new to it, and it's fundamentally hard stuff anyways, and if you can find a higher-level abstraction that lets you get work done faster, then all the better. However, the question is comparing Kubernetes to traditional VM-based infrastructure (especially with pet nodes) whereas you're comparing Kubernetes to a higher-level abstraction.

For what it's worth, deploying in Kubernetes is pretty easy once you figure it out (and often finding the information is the hardest part). All you need to do is update the Deployment resource's "image" parameter. You can do that with `kubectl patch` like so:

    kubectl patch deployment foo -p '{"spec":{"containers":[{"name":"main","image":"new-image"}]}}'
Kubernetes will handle bringing up a new replicaset, validating health checks, draining the old replicaset, etc.
Re:Ask HN: If Kubernetes is the solution, why are there so m... by sgarland on Wednesday June 01, 2022 @10:35AM (#31582364)
Please, do not manage deployments with imperative kubectl commands, I beg of you.
Re:Ask HN: If Kubernetes is the solution, why are there so m... by jrx on Wednesday June 01, 2022 @01:46PM (#31585428)
The question is: what tool to use? I'm a solo developer running a very small kube cluster for my hobby project. I very much wanted to have a declarative version controlled state of my cluster. Every time I try googling solutions I get flooded with some enterprise Saas offerings that do nothing I want.

I managed my stateful sets/services for a while with terraform, but my experience was absolutely terrible and I have stopped that eventually. I now use "kubectl patch" and "kubectl apply" with handwritten yaml, but the workflow feels very clunky.

Intuitively it seems obvious to me that there must be a tool helping with that, but for some reason I was absolutely not able to find anything that would be even a little bit helpful. I am considering writing a couple python scripts that will automate it.

Re:Ask HN: If Kubernetes is the solution, why are there so m... by kube-system on Wednesday June 01, 2022 @05:25PM (#31588352)
kubectl apply on a directory full of yaml works fairly well for small stuff. Check it into git and it's version controlled.

If you need something more flexible than that, try making your own helm chart. Helm will give you some text templating, pre and post hooks, some basic functions, and some versioning and rollback functionality.

You can start simple by just pasting in your existing k8s yaml, and then just pull out the pieces you need into variables in your values file. If you need to change an image version, then you just update the variable and `helm upgrade mychart ./mychart`

Re:Ask HN: If Kubernetes is the solution, why are there so m... by throwaway894345 on Wednesday June 01, 2022 @09:09PM (#31590147)
kubectl apply on a directory doesn’t work because deleting a resource manifest won’t delete the corresponding resources.
Re:Ask HN: If Kubernetes is the solution, why are there so m... by kube-system on Thursday June 02, 2022 @12:00AM (#31591177)
It does work, as long as you’re not deleting anything. :) That might be good enough for a “very small kube cluster for my hobby project”

I only use ‘kubectl apply’ for small stuff where I only have a couple resources. Anything more complicated and a tool like helm is much more useful.

Re:Ask HN: If Kubernetes is the solution, why are there so m... by bavell on Wednesday June 01, 2022 @10:50PM (#31590727)
'kubectl delete -f dir/' will delete all resources in the directory.
Re:Ask HN: If Kubernetes is the solution, why are there so m... by throwaway894345 on Thursday June 02, 2022 @12:19AM (#31591299)
Right, but the only resource you want to delete is no longer in that directory, so you’ve now deleted every resource you except the one you actually wanted to delete. :)
Re:Ask HN: If Kubernetes is the solution, why are there so m... by bavell on Saturday June 04, 2022 @10:20AM (#31620615)
Ah, I slightly misunderstood. Still, you should always have your manifests under version control so this shouldn't ever be a problem :)
Re:Ask HN: If Kubernetes is the solution, why are there so m... by lukeschlather on Wednesday June 01, 2022 @04:58PM (#31588007)
I'm a fan of emrichen, but simple text templating (Jinja) works almost as well. (j2cli means you can just provide a yaml file with per-stage configs.)
Re:Ask HN: If Kubernetes is the solution, why are there so m... by edude03 on Wednesday June 01, 2022 @02:41PM (#31586262)
Fluxcd, or argo CD if you want a nice UI
Re:Ask HN: If Kubernetes is the solution, why are there so m... by I_dev_outdoors on Wednesday June 01, 2022 @10:40AM (#31582452)
I probably wouldn't do this, but what problem does this cause?
Re:Ask HN: If Kubernetes is the solution, why are there so m... by alias_neo on Wednesday June 01, 2022 @11:23AM (#31583199)
The declarative approach is a more sustainable way to run Kubernetes. If you define some desired state in manifests and apply them to a cluster, they can be applied again to new clusters or the same one and Kubernetes will attempt to maintain the desired state.

This state can be version controlled, written in stone, whatever you prefer and it can always be attained.

When administrators start issuing imperative commands to a cluster, state starts being changed and there is no record[0] of the state Kubernetes is being asked to maintain.

[0] Not entirely true, the state can always be retrieved from the cluster so long as it hasn't failed.

Re:Ask HN: If Kubernetes is the solution, why are there so m... by jen20 on Wednesday June 01, 2022 @11:37AM (#31583438)
I find this to be a common misconception, stemming from a misunderstanding of what "declarative" means (especially common when people are discussing tools like Terraform).

Firstly as you point out, there is a record of the state Kubernetes is being asked to maintain: it's in the API server as the spec of each resource.

Secondly, using `kubectl` "patch" in the manner described is not making changes to the cluster state directly, it's making changes to the specification of what should be maintained, and the various controllers effect the state changes.

Fundamentally, the argument seems to come down to "you don't have a record of what you once asked the API server to do", and that's fair enough - you don't. But that has nothing to do with imperative or declarative models.

I'm not advocating actually doing this on a day-to-day basis, but the arguments against it are not ones of imperative vs declarative.

Re:Ask HN: If Kubernetes is the solution, why are there so m... by throwaway894345 on Wednesday June 01, 2022 @01:20PM (#31585072)
> Fundamentally, the argument seems to come down to "you don't have a record of what you once asked the API server to do", and that's fair enough - you don't. But that has nothing to do with imperative or declarative models.

You do actually have this record. First of all, because k8s has an audit log, and secondly because deployments maintain a revision history (so you can always rollback--kubectl even supports this via `kubectl rollback undo`).

Re:Ask HN: If Kubernetes is the solution, why are there so m... by alias_neo on Wednesday June 01, 2022 @06:25PM (#31588919)
You're correct, but, when approaching this from the human perspective, it's less about the technology and the reality and more about "do I have a record of the last state I asked the cluster to be in before I fucked it up?". Ultimately that's what matters. Auditability is great, but in practice, when the shit hits the fan, can I get the application that brings in our company's money, and our customers rely on to breath, back to the state it was after 5 years and 73 updates?

Updating the manifests, pushing them to version control and having CD deploy them encourages humans to "do the right thing".

It would be quite easy though to just tweak that one environment variable though while I patch in the new image version to update that one service; until the entire cluster dies and I can't retrieve the last definition and need an equivalent cluster up within the hour.

This is really more about the practice of writing down the state you want the cluster to be in (the spec) and showing it to the cluster, than just ordering it to do one thing without context.

In this sense, Declarative Vs Imperative is just a proxy term for "do I have a record of the state I asked the cluster to keep?"

Re:Ask HN: If Kubernetes is the solution, why are there so m... by sgarland on Wednesday June 01, 2022 @11:56AM (#31583776)
Given that Kubernetes' docs[0] discuss using imperative commands, I think it's a fairly reasonable way to describe it.

[0] https://kubernetes.io/docs/tasks/manage-kubernetes-objects/i...

Re:Ask HN: If Kubernetes is the solution, why are there so m... by throwaway894345 on Wednesday June 01, 2022 @12:53PM (#31584658)
Why is applying a full manifest “declarative” but applying a patch is “imperative”? That’s clearly an error.
Re:Ask HN: If Kubernetes is the solution, why are there so m... by tbrownaw on Wednesday June 01, 2022 @02:30PM (#31586099)
Applying a full manifest is "this is your state now".

Applying a patch is "make these changes to your existing state".

That dependency on existing state is a difference, and it seems to map reasonably well to what declarative/imperative seem to usually be used to mean in this context.

Re:Ask HN: If Kubernetes is the solution, why are there so m... by throwaway894345 on Wednesday June 01, 2022 @02:38PM (#31586227)
1. A strategic merge patch says "this is your state now" (the only difference is the scope of the state in question, with a full manifest including a bunch of extraneous stuff)

2. "make these changes to your existing state" is still declarative

Re:Ask HN: If Kubernetes is the solution, why are there so m... by jen20 on Wednesday June 01, 2022 @04:55PM (#31587964)
> Applying a full manifest is "this is your state now".

It isn’t though. It’s “please make the state look like this eventually”. You do not patch state, just spec. Controllers effect the changes.

Re:Ask HN: If Kubernetes is the solution, why are there so m... by throwaway894345 on Thursday June 02, 2022 @01:12PM (#31597684)
You're both correct, but you're talking about different states. The parent's "state" is the state of the etcd database and your state is the actual state of the resources that the controllers are managing.

That said, the parent is wrong that a full manifest is declaring the (etcd) state in a way that a (strategic merge) patch isn't--both are declaring etcd state, but a strategic merge patch is doing so in finer-grained increments. A strategic merge patch can declare zero state or many full manifests, while applying full manifests can only work in increments of complete resource manifests. But both are telling Kubernetes "this is your (etcd) state now".

Re:Ask HN: If Kubernetes is the solution, why are there so m... by sgarland on Wednesday June 01, 2022 @01:45PM (#31585407)
Then open a PR.
Re:Ask HN: If Kubernetes is the solution, why are there so m... by throwaway894345 on Thursday June 02, 2022 @09:59AM (#31594972)
This is a strange way to concede an argument, but I’ll take it.
Re:Ask HN: If Kubernetes is the solution, why are there so m... by throwaway894345 on Wednesday June 01, 2022 @12:31PM (#31584343)
People are incorrectly assuming that using kubectl implies invoking it from an administrator's laptop. Of course, you can and should invoke kubectl from your CD pipeline. The CD pipeline maintains its own record of runs, and Kubernetes deployments have a revision history.

Moreover, people in this thread also don't know what "declarative" means. The patch is declarative, and "declarative" doesn't provide the claimed benefits. For example, as with the patch command, I can create, apply, and delete a Kubernetes manifest file (indeed, I can apply directly from stdin!) and there is no additional record of the change beyond that which would exist if I had just applied the patch.

Re:Ask HN: If Kubernetes is the solution, why are there so m... by sgarland on Wednesday June 01, 2022 @12:58PM (#31584729)
A patch is declarative in that it's an idempotent command which requires you to fully define the patch. It's still something that is being manually defined rather than contained in a file to be applied. Of course, if that file is just being locally held and modified on someone's laptop instead of committed to version control, it's a moot point.

I will grant you that `kubectl delete -f` breaks my argument, since it's imperatively modifying objects given a declarative manifest. Re: changes via stdin, I mean sure; you can also pipe a deployment manifest into `ex` or `sed` to make changes on the fly and then echo it back to `kubectl apply -` but I wouldn't recommend it.

Re:Ask HN: If Kubernetes is the solution, why are there so m... by throwaway894345 on Wednesday June 01, 2022 @01:26PM (#31585149)
Yeah, my point is that whether you're changing a manifest and doing an apply versus a patch isn't relevant, the relevant bit is whether or not you have a version history and in both cases you do via your CD pipeline and via k8s deployment revision history. You can also commit to git, but I don't think there's much value in committing every image version change to git.

Also, working in raw manifests isn't a panacea; if you delete a resource's manifest, Kubernetes won't delete its corresponding resource (maybe this is what you were referring to with your bit about `kubectl delete -f`). You need something that diffs the manifests against the current state of the world and applies the requisite patches (something like Terraform) but this isn't related to how you change image versions.

Re:Ask HN: If Kubernetes is the solution, why are there so m... by alias_neo on Wednesday June 01, 2022 @06:36PM (#31589032)
I agree with your points, but as I mentioned in another comment, if we take "imperative" and "declarative" as proxy terms for "I do or do not have a reference to the state I requested of the cluster OUTSIDE of the cluster"; my point is that updating the state, in full, by modifying the manifests and committing them to be deployed by your CD pipeline or otherwise is a better approach to ensuring you or someone else can rebuild your "empire" were it to unceremoniously burn to the ground.
Re:Ask HN: If Kubernetes is the solution, why are there so m... by throwaway894345 on Thursday June 02, 2022 @12:23AM (#31591325)
I think you’re assuming that just because we’re updating the image via kubectl (which itself is invoked via CD pipeline) that the infrastructure isn’t codified and persisted, which isn’t the case. You can (and should) still have your infrastructure manifests saved in your infra repo/directory and version controlled; that’s orthogonal to how you update the current image version.
Re:Ask HN: If Kubernetes is the solution, why are there so m... by ryapric on Wednesday June 01, 2022 @11:04AM (#31582851)
The same problems any imperative management within declarative config causes -- drift. If the tool you're using supports declarative configuration, all changes should be made exclusively via the declarative interface to prevent that drift. In this example, the new image should be added to the original manifest itself, not via a CLI update.
Re:Ask HN: If Kubernetes is the solution, why are there so m... by throwaway894345 on Wednesday June 01, 2022 @12:12PM (#31584067)
It depends on how you manage your changes. A lot of people don't have their infra-as-code manage the deployment's image field--rather, that's updated by the application's CD pipeline. There's no drift to worry about.
Re:Ask HN: If Kubernetes is the solution, why are there so m... by xbar on Wednesday June 01, 2022 @01:50PM (#31585485)
So upon deploy the CD pipeline calls kubectl with the proper deployment image and that's ok?
Re:Ask HN: If Kubernetes is the solution, why are there so m... by throwaway894345 on Wednesday June 01, 2022 @02:42PM (#31586280)
Yes.
Re:Ask HN: If Kubernetes is the solution, why are there so m... by sgarland on Wednesday June 01, 2022 @11:12AM (#31583007)
Drift, as the other child comment mentions, but also loss of version control. I do not want to have to trawl through someone's shell history to figure out what they changed, nor do I want to have to redirect `kubectl get foo -o yaml` output into diff.

If everything is in code, and you have a reasonable branching strategy, it's much easier to control change, to rollback bad merges, to run pre-hooks like security checks and configuration validation tools, etc.

Re:Ask HN: If Kubernetes is the solution, why are there so m... by throwaway894345 on Wednesday June 01, 2022 @12:16PM (#31584125)
It's not drift, because the infra-as-code doesn't manage the image field (the application's CD pipeline does). You don't trawl through someone's shell history', you look at the CD pipeline history. Rollbacks are easy--you just deploy the prior version via your CD tool.

I think you're assuming that invoking kubectl means invoking it directly from a user's command line, but kubectl can also be called in a CD script.

Re:Ask HN: If Kubernetes is the solution, why are there so m... by sgarland on Wednesday June 01, 2022 @12:33PM (#31584388)
If you're using ArgoCD or something then sure, but bear in mind the original statement you made was directed at someone who is new to K8s, and given a command that can be executed from their shell, they would likely assume that's what you meant.
Re:Ask HN: If Kubernetes is the solution, why are there so m... by throwaway894345 on Wednesday June 01, 2022 @12:55PM (#31584684)
It doesn’t have to be Argo, it can be Jenkins. Whether or not you use a CD pipeline is orthogonal to whether or not you use k8s. The best practice is to use a pipeline whether you’re targeting k8s or bare VMs or a higher level PaaS abstraction.
Re:Ask HN: If Kubernetes is the solution, why are there so m... by I_dev_outdoors on Thursday June 02, 2022 @09:50PM (#31603271)
I'm not new to Kubernetes and I've been using containers since Solaris zones were introduced.
Re:Ask HN: If Kubernetes is the solution, why are there so m... by thinkmassive on Wednesday June 01, 2022 @11:32AM (#31583360)
You know kubectl has a built in diff subcommand?
Re:Ask HN: If Kubernetes is the solution, why are there so m... by sgarland on Wednesday June 01, 2022 @11:55AM (#31583759)
I do now! Thank you.
Re:Ask HN: If Kubernetes is the solution, why are there so m... by throwaway894345 on Wednesday June 01, 2022 @12:10PM (#31584024)
This is a declarative kubectl command.
Re:Ask HN: If Kubernetes is the solution, why are there so m... by sgarland on Wednesday June 01, 2022 @12:21PM (#31584182)
Re:Ask HN: If Kubernetes is the solution, why are there so m... by throwaway894345 on Wednesday June 01, 2022 @12:52PM (#31584637)
They’re not being precise with their language. Applying a full manifest is no more “declarative” than applying a patch.
Re:Ask HN: If Kubernetes is the solution, why are there so m... by mihaigalos on Wednesday June 01, 2022 @11:23AM (#31583208)
Spot on!
Re:Ask HN: If Kubernetes is the solution, why are there so m... by epivosism on Wednesday June 01, 2022 @11:48AM (#31583621)
As an outsider, that command looks really easy to mess up.

* shell interactions with quotes * double quotes * interpolating into image namespace with no autocomplete * easy to forget an argument * do you get autocomplete against the deployment name?

Comparison: C# declaration of a complex type - it's less complex than the `kubectl` command above, but IDEs offer way more support to get it right.

* var x = new List<Dictionary<CustomType,int?>>()

This will light up warnings if you get anything wrong;

You get: * go to definition of `CustomType` * autocomplete on classnames * highlighting on type mismatches * warnings about unused vars. * if you initialize the var, the IDE will try hard to not let you do it wrong

So structurally,

1) in the code realm, for doing minor work we have really strong guarantees,

2) in deployment realm, even though it's likely going to hit customers harder, the guarantees are weaker.

I think this is behind the feeling that the k8s system is not ready yet.

Re:Ask HN: If Kubernetes is the solution, why are there so m... by throwaway2037 on Wednesday June 01, 2022 @01:00PM (#31584766)
About quoting rules: We desperately needs static analysis or IDEs (Emacs plugins, whatever) that "explain" exactly what quotes do in a particular context. When I returned to C++ recently, I was blown away by Clang-Tidy (JetBrains CLion integration). Literally: Clang-Tidy seems to "know what you really want" and give intelligent suggestions. For someone whom is a very average C++ programmer, it instantly leveled me up! I could see the same for someone writing /bin/sh, /bin/ksh, /bin/bash shell commands. If the IDE could give some hints, it would be incredibly helpful to many.
Re:Ask HN: If Kubernetes is the solution, why are there so m... by throwaway894345 on Wednesday June 01, 2022 @01:29PM (#31585203)
The quotes here have nothing to do with k8s, it's just how you encode JSON in shell.
Re:Ask HN: If Kubernetes is the solution, why are there so m... by peppermint_tea on Wednesday June 01, 2022 @02:40PM (#31586250)
apt-get install shellcheck

or

https://www.shellcheck.net/

Re:Ask HN: If Kubernetes is the solution, why are there so m... by throwaway894345 on Wednesday June 01, 2022 @12:07PM (#31583988)
You put it in a bash script that gets called from CI and move on with life. No one is typing this into their terminal every time they want to do a deploy.

> I think this is behind the feeling that the k8s system is not ready yet.

Whether you patch the deployment image from bash or from C# doesn't indict the k8s ecosystem.

Re:Ask HN: If Kubernetes is the solution, why are there so m... by frazbin on Wednesday June 01, 2022 @02:38PM (#31586228)
correct! Here's why: Kubernetes is an operating system (a workload/IO manager) and its lineage is 16 years old. So it's like Unix around 1979, or Windows/DOS around ~1996. Imagine it's 1996 and you can pick between Windows NT (representing 16 years of MS development) or System 360 (~40 years out from IBMs first transistorized designs).

What I'm trying to say is that as an operating system, Kubernetes is now a young adult, and historically speaking, operating systems at this level of maturity have been adopted and ridden for decades, with much success. But, ya know, if you chose OS/360 in 1996 you would have a point.

Re:Ask HN: If Kubernetes is the solution, why are there so m... by kuschku on Wednesday June 01, 2022 @12:04PM (#31583939)
1. You’ll use `kubectl set image deployment/gitlab gitlab=gitlab/gitlab-ce:14.9.2-ce.0` in production instead

2. kubernetes will abort the change if it doesn’t syntax check or the types don’t match.

Re:Ask HN: If Kubernetes is the solution, why are there so m... by throwaway894345 on Wednesday June 01, 2022 @12:08PM (#31584007)
Hah, I didn't even know about `set image`.
Re:Ask HN: If Kubernetes is the solution, why are there so m... by kuschku on Wednesday June 01, 2022 @12:03PM (#31583919)
Don’t do that, use

    kubectl set image deployment/foo main=main:new-image
instead
Re:Ask HN: If Kubernetes is the solution, why are there so m... by mdaniel on Wednesday June 01, 2022 @12:17PM (#31584134)
It also accepts "*" if you don't know or care about the container name(s)

    kubectl set image deployment/foo "*=the/new/image"
and then, my other favorite (albeit horribly named, IMHO) "rollout status" to watch it progress:

    kubectl rollout status deployment/foo
Re:Ask HN: If Kubernetes is the solution, why are there so m... by throwaway894345 on Wednesday June 01, 2022 @12:09PM (#31584010)
TIL. Thanks for the advice.
Re:Ask HN: If Kubernetes is the solution, why are there so m... by tauwauwau on Wednesday June 01, 2022 @02:12PM (#31585797)
It took me 4-5 hours to read and understand first few chapters of Kubernetes in action, I annotated a lot text as notes on the Oreily site, but didn't have to go back to it. I didn't have to do any security and account management stuff, it was being done by someone else. After 3 years of working with plain Kubernetes and OpenShift, I still didn't have to go back to the book. Basic concepts in Kubernetes are easy to understand, if you're working as a developer to deploy your apps in it and not in DevOps managing it.

https://www.oreilly.com/library/view/kubernetes-in-action/97...

Re:Ask HN: If Kubernetes is the solution, why are there so m... by throwaway2037 on Wednesday June 01, 2022 @11:52AM (#31583711)
You wrote: <<if you can find a higher-level abstraction>>

This a stretch, but to me Kubernetes is like the C programming language for infra. If you look at the entire software stack today, drill down (all the turtles), and you will eventually find C (everything goes back to libc or a C/C++ kernel). I assume any commercial (or non-!) "higher-level abstraction" for infra is already (or will be soon) built on top of Kubernetes. I am OK with it.

I write this post as someone who is uber-techincal, but I know nothing about actually using Kubernetes. I can do vanilla "hand-coded/snowflake" infra just fine in my constrained, private cloud environments, but nothing that scales like Kubernetes.

Re:Ask HN: If Kubernetes is the solution, why are there so m... by rustyminnow on Wednesday June 01, 2022 @12:46PM (#31584565)
> If you look at the entire software stack today, drill down (all the turtles), and you will eventually find C (everything goes back to libc or a C/C++ kernel).

I might be nitpicking, but I'm not sure that's necessarily true. You could in theory write a compiler for a new language in C (or even assembly!), and once you have a working language, re-write the compiler in that new language. Now that there is no C code involved in the stack anymore, would that still count as a C-turtle?

Haskell for example, has some "bits" written in C, but a lot is written in Haskell or assembly[1]. So if you look at the WHOLE stack you'll find C _somewhere_ (probably most places), but I don't think _everything_ boils down to C.

Granted, a LOT of stuff is written on top of C.

[1] https://stackoverflow.com/questions/23912375/what-language-i...

Re:Ask HN: If Kubernetes is the solution, why are there so m... by throwaway2037 on Wednesday June 01, 2022 @01:29PM (#31585202)
Great point and not a nitpick at all! I hope the next generation of languages is written on top Python, Ruby, C++ (ultra modern), Java, or DotNet/C#. I wish more languages would figure out if they can host in JVM/CLR, which would provide some crazy interactions!

After seeing so much great work done with JavaScript in the form of "transpilers", I think a lot can be done in that area. I feel Zig is a crazy good idea: A brand new language that produces binaries that are 100% compatible with C linkers. If all goes well, in a few years, why would anyone use C over Zig? It seems like the future.

Lots of people think C++ is bat sh-t crazy complex (me too, but I still like the mental gymnastics!). What if there were different C++ dialects supported by transpilers that intentionally restricted features? I think kernel and embedded programmers would the primary audience.

Re:Ask HN: If Kubernetes is the solution, why are there so m... by throwaway894345 on Wednesday June 01, 2022 @11:58AM (#31583824)
Kubernetes may eventually underpin lots of higher level infrastructure, but most stuff currently isn't running atop Kubernetes. None of the higher level container-as-a-service offerings by the major cloud providers run on Kubernetes, for example. Nor does Heroku. And moreover a lot of people are still working with lower-level abstractions (VMs and auto-scaling groups) or no abstractions at all (pet servers).