Hacker News new | past | comments | ask | show | jobs | submit login
Gravity: Upstream Kubernetes packaging tools (github.com)
98 points by gk1 5 months ago | hide | past | favorite | 39 comments

I find each new development in the field of deploying Kubernetes to be grimly humorous. We had lots of techniques to package and deploy things before Kubernetes, but they were complex and inadequate in some ways, and Kubernetes fixes some of those issues. But it turns out Kubernetes itself is substantially more complicated to package and deploy than the old solutions, if you're deploying it yourself rather than using some proprietary cloud. Oops!

What I just can't decide is whether we'll successfully put another layer of container-container-containers on top of Kubernetes, or whether the whole effort will eventually collapse and we'll extract the good parts out into something simpler.

> But it turns out Kubernetes itself is substantially more complicated to package and deploy than the old solutions

Not really. It's pretty much the same level of complication if you used the same components. You could use all the same tools: chef, puppet, ansible, etc. Once you have it available though other applications are easier to deploy.

At any rate, this tool provides something entirely different. It lets you image the entire data center and reproduce it somewhere else. Not sure how you would've done that before.

Kubernetes cluster is hard to operate indeed. Techniques that we always had to deploy before Kubernetes, for example package managers, don't always translate to operating a distributed system on a hundreds or thousands of servers.

Some of this complexity is definitely incidental, not all components are not always coordinating well with each other, e.g. docker and API server, networking layer during upgrades for example.

On the other hand lots of this complexity is essential - K8s is a distributed system with database, network and container orchestration layer solving a hard problem.

> we'll extract the good parts out into something simpler

It's already been done and couple solutions exist: docker swarm, nomad. Depending on your stack complexity level.

The problem you've described arises when you try to use the wrong tool for the job, e.g. you're trying to use kubernetes for simple projects with small teams without dedicated OPS and SRE teams.

When you have large and complex infrastructure (e.g. GitLab) with complex networking and balancing level where the kubertenes like tools bring the most value you actually win by making your ops team work like a uber drivers (a little bit exaggerated) making standard decisions in standard environment. You just check the licence (certificates) and your infrastructure just work. No need for customised solutions anymore.

Kubernetes isn’t just a way to deploy your apps, though.

It’s also doing a ton of orchestration that many people just simply weren’t even doing before, or they had a human at a keyboard doing it. There’s a lot of value in that.

All of the package and deployment stuff is moving very quickly because the variety of organizations using k8s is quickly growing and using it for new use cases.

Things like application distribution was never a focus of Borg, because google doesn’t really distribute applications.

> We had lots of techniques to package and deploy things before Kubernetes, but they were complex and inadequate in some ways

They worked very well for 30 years. And the new container-based tools inevitably end up doing the same mistakes, rediscovering the same solutions and we'll go back to the beginning.

> turns out Kubernetes itself is substantially more complicated to package and deploy than the old solutions

Exactly, and you can't solve a problem by making it more complex.

> Exactly, and you can't solve a problem by making it more complex.

Sure you can. A resource scheduler is more complex than not having one, but it solves the single-point-of-failure problem and the bin-packing CPU+memory problem.

A more complex infrastructure means you can have dumber apps.

And there are lots of areas where this is true: TCP is a complex protocol which makes it easier to build reliable communication, CPUs have complex caches which make simple code faster, RAID makes multiple disks behave like a single disk to improve reliability or performance, compression is very complex (esp for audio/video) but dramatically reduces the size...

The implementation of kubernetes may be flawed, but the idea of kubernetes makes a lot of sense. It solves real problems.

> A resource scheduler is more complex than not having one, but it solves the single-point-of-failure problem and the bin-packing CPU+memory problem.

And yet various FAANGs choose not to use a smart scheduler, because it does not improve efficiency and reliability enough to justify its complexity and scales poorly.

Kubernetes was based on Google's Borg [1].

Netflix uses Titus and Mesos [2].

I'm not sure what Amazon uses, but I'm sure they have some sort of system to do this. They offer plenty of managed solutions for customers (including EKS).

Apple's more of a product company, but they seem to use Kubernetes for some things [3].

And finally facebook apparently has something called Tupperware [4].

So all the FAANGs use something like Kubernetes to manage infrastructure.

[1] https://en.wikipedia.org/wiki/Borg_(cluster_manager) [2] https://queue.acm.org/detail.cfm?id=3158370 [3] https://jobs.apple.com/en-us/details/200120515/virtualized-c... [4] https://www.slideshare.net/Docker/aravindnarayanan-facebook1...

I worked on some of the technologies you mentioned but I cannot disclose more.

> So all the FAANGs use something like Kubernetes to manage infrastructure.

No, you cannot just hand-wave that they are "like Kubernetes".

I find all the complexity quite unnecessary. I think the "package managers" attempt to do too much, handling some sort of use case that doesn't affect me. My highest success rate with randomly deploying someone else's software comes from software that just provides a bunch of API objects in YAML form that you just apply to the cluster. My second highest success rate comes from just writing my own manifest for some random docker image. Finally, operators tend to do pretty well if the development team is sane.

At this point, I think the fundamental problems are:

1) People desire to give you a "works out of the box" experience, so they write a packaging system that can install everything. The app depends on Postgres? Fuck it, we'll install Postgres for you! This is where things start to go wrong because self-hosting your own replicated relational database instance is far from trivial, and it requires you to dial in a lot of settings. And, of course, it requires even more settings to say "no no, I already have an instance, here is the secret that contains the credentials and here is its address."

2) Installing software appears to require answering questions that nobody knows the answers to. How much CPU and memory do I give your app? "I dunno we didn't load test it just give it 16 CPUs and 32G of RAM, if it needs more than that check your monitoring and give it more." "I only have 2 CPUs and 4G of RAM per node." "Oh, well, maybe that's enough or maybe it isn't. It won't blow up until you give it a lot of users though, so you will get to load test it for us while your users can't do any work. Report back and let us know how it goes!"

I also noticed that when security people get at the project, it tends to become unusable. I used to be a big fan of Kustomize for manifest generation. Someone decided to build it into kubectl by default, and that it should support pulling config from random sites on the Internet. So now if you use it locally, you can't refer to resources that are in ../something, because what if a remote manifest specified ../../../../../etc/shadow as the config source? Big disaster! So now it doesn't work. (They also replaced what I thought was the best documentation in the world, a kustomization.yaml file that simply used every available setting, with comments, with a totally unusable mass of markdown files that don't tell you how to use anything.)

Obviously security is a problem, but they should have said "just git clone the manifest yourself and review it" instead of "you can't use ../ on your local manifests that are entirely written by your own company and exist all inside the same git repository that you fully control". But they didn't, and now it sucks to use.

Hey all, I'm part of the team at Gravitational - a company behind this effort. Will be happy to answer any questions about this project.

1. Is Gravity a fully open source software (with commercial support) or an Open Core software? If the latter, please point to a feature matrix or relevant part of documentation.

2. How Gravity solution (and/or approach) is different from a similar offering by Replicated?

EDIT: Oops, sorry, just found the answer to my Q1: about halfway down on the following page: https://gravitational.com/gravity. However, some information on pricing structure and approximate numbers would be appreciated. Replicated is more transparent in this regard. :-) Q2 still stands. Looking forward to hearing from you.

Would Gravitational ever think about creating a more generic layer on this, e.g.: to manage Mesos, Nomad, or something else entirely like Corosync via some kind of driver system?

I love Teleport but don't use k8s anywhere.

This is one of those ideas we always wanted to implement, but in reality, once we took on deploying K8s it completely consumed all the teams' resources :D

Anyway, just a 1-person note, but "here's an open source bottom layer for you to build (x) on top with the ux of teleport/gravity" would be incredible.

I wonder if you've considered building a complete VM image instead of a tarball. A minimal, immutable VM image could be more finely tuned and hardened than a tarball installed on top of a general-purpose distro. You could take inspiration from CoreOS or LinuxKit here. Or do you find that the sysadmins in the kind of organization that install these on-prem packages really want to install on top of their favorite distro?

A minimal immutable VM image which is finely tuned and hardened is the exact approach we're taking with https://on-premises.com - except we haven't focused on k8s workloads. We've found that customers would much rather import a VM than "install" something, however there are valid use-cases which require special monitoring tools and other customizations which are not possible on an immutable system. Gravity is interesting and seems to meet that demand.

This look interesting, is there a way to try out meta without being funneled into the sales pipeline?

What is the workflow for baking a machine? Are you using packer under the covers or some other tooling? What on-prem machine image formats are supported?

There's still a bit of "manual" work to get someone up and running on our Meta appliance, so unfortunately you would have to go through our sales process. However if you just want a video or screen recording of how it works then I can put something online in the next hour or two.

For baking the machine, we use Ansible under the covers and have a set of Lisp scripts to manage everything. As for image formats: qcow2, raw, vhd (and vmdk in the .ova file).

Not trying to hijack Gravitational's thread, please contact me (email in profile, or 'aw-' on FreeNode) if you want to discuss more.

Actually, some of our customers are doing just that - taking a tarball and making it a VM image. There are a couple of things we are making now to support this use case better, e.g. ability to easily change the ip on the VM boot up.

This seems to assume that each app will run on a separate Kubernetes cluster. Have you given any thought to packaging apps which will run on a single Kubernetes cluster?

Is cluster-per-app a thing people really do? Seems to defeat the purpose.

We use Mesos rather than Kubernetes, but the point is that a central infrastructure team (maybe 15 people) manages the cluster itself. It provides service owners (several thousand people) with a small and straightfoward abstraction to provision, upgrade, and decommission their particular apps.

If each service team had to deal with its own cluster scheduling, these systems would usually be massive timewasters relative to the old ways (Puppet, shell scripts, etc).

> Is cluster-per-app a thing people really do? Seems to defeat the purpose.

Yes it is and yes, it does.

Kubernetes has a fairly soft tenancy model, so in practice, multi-cluster is becoming a big deal, despite the cost in utilisation efficiency.

Various attempts are being made to recover the utilisation efficiencies, such as Virtual Kubelet or Project Pacific. I think that the original sin of Kubernetes was the lack of a firm, first-class, top-down, mandatory access control model of tenancy.

Disclosure: I work for VMware, which is responsible for Project Pacific.

If you think of an application as composed of hundreds of micro services, than it makes perfect sense. It's a multi-tenant system, it's just each tenant is a part of the same app.

I'm not sure I follow you, could you elaborate?

> Is cluster-per-app a thing people really do?

Gravity enables a somewhat unique scenario of companies taking their complex micro-services stack and delivering it as an installer for software application. From the end users' perspective they don't even know that it's a k8s cluster, they consume an application that consists of multiple components.

However Gravity supports the scenario when multiple applications are installed in the cluster as well.

Yep, check out integration with helm for multiple apps:


It's something we support right now, but still polishing UX, the idea is to add more support for Helm 3.0 in the future in addition to Helm 2.0 we already support.

Looks like that functionality is locked behind the Enterprise edition correct?

Seems like we have to fix the docs a bit, `gravity app` is supposed to work with any helm registry or even without one:

  tele build helm-package ->> tarball
  gravity app install tarball

Requiring a dedicated volume with at least 50 GB of space and 1500 privisioned IOPS just for etcd [1] seems excessive to me. How big a cluster, e.g. how many nodes and pods, is this for?

[1]: https://gravitational.com/gravity/docs/ver/6.x/requirements/...

We are staying on the safe side here on our recommendations. We have seen many scenarios when high latency on volumes on AWS creates a lot of problems even for small 3 node clusters.

Even small clusters with K8s operators doing complex work (e.g.: autoscaling) can generate a lot of etcd traffic updating state. I'm not sure how (etcd) stateless Istio and other meshes are, too.

I played with this briefly last year but couldn't get it going in the time frame so I gave up. I wanted to like it but it was a bit unwieldy getting started, and I was not a fan of needing helm to bootstrap an installation. There also was a quirky installation workflow, could not set a key/password successfully for the life of me and it was unclear on if the cli needed a browser?

May have to check this out again, hopefully the quck-start experience has improved.

Sorry to hear about your experience, the getting started experience is an ongoing challenge, there have been improvements in the last year, but we still have a long way to go as well.

Sorry if this wasn't clear, but helm actually isn't required at all, it's just a majority of our examples are written to use helm due helms popularity. The installation hooks really just boil down to kubernetes jobs, so anything that can be represented as a kubernetes job can be used for any of the hooks. This can be a simple script, a helm command, or a complicated custom built application.

The only feature really tied specifically to helm is the catalog feature, which is for building additional applications to be installed on top of an existing gravity cluster. That feature was built around a helm chart as a building block.

The cli should only need to invoke a browser when doing third party authentication flows, ie to use github for login. Using the gravity users invite will also generate a link to send to the enrolling user, so they can set their own password, setup 2fa, etc through the web interface.

We've also been trying to use our community site https://community.gravitational.com/ as a resource for being able to search and ask questions.

Disclaimer: I'm a developer on gravity.

Hard not to wonder if k8s is the new hadoop. "If you build it they will come" platform team thinking.

Hadoop did not event reach 1/10 of Kubernetes popularity.

That's very hard to eyeball in my opinion. Hadoop and its ecosystem fascinated a big chunk of the dev (and ops) world. Everybody and their dog wanted to be "into" Big Data. Data Lake. Realtime feeds, just add nodes (Cassandra), CQRS, and of course when Facebook said they are using HBase for Messenger, it meant that HBase is the new MySQL/Mongo/sliced-bread.

Then there was YARN, then Tez, Spark, Flink, and Drill, and various other projects that added to the hype (Aerospike, RamSQL, Kafka + Storm).

And ever new system had to be built like it'll be web scale from day one. Instagram was acquired in 2012, just 18 months after launch, and everyone knew that meant every new even barely "social" thing will blow up even faster than that. So you absolutely need to plan ahead, scale scale scale.

Compared to that people seem to be a bit more wary of k8s, especially because it's targeted at ops folks, and they are naturally predisposed to oppose changes they don't understand.

But that's just my - probably ridiculously non-representative - take on this :)

Guidelines | FAQ | Support | API | Security | Lists | Bookmarklet | Legal | Apply to YC | Contact