I also find it really sad that a lot of the small teams who are on the road to success get distracted by applying "best practices" that were built for big teams (e.g. Google uses kubernetes, we should too).
I also find it really sad that a lot of the small teams who are on the road to success get distracted by applying "best practices" that were built for big teams (e.g. Google uses kubernetes, we should too).
This also holds for project management practices such as Scrum.
I'm sure - even though I'm not particularly smart - I could get a simple k8s solution up and running in a week with the help of a YouTube video.
What happens six months in when I hit some critical k8s related issue and I lack the basic understanding of where to even begin to debug and fix it? For example I may introduce a serious security issue in a CI pipeline or whatever just due to inexperience and unfamiliarity.
I'm not saying Kubernetes (or for that matter, microservices) is the wrong pick for a small 3-person team. You know your own business better than I or anyone else and I'm sure you made the right choice. But personally I would be cautious about adopting a core production technology where my experience consists of one week and a YouTube tutorial.
As long as your k8s is some self contained island of code needing no R/W access to resources on k8s, maybe I'll believe it's easy to setup AND to support. Additionally if you are in some type of small shop environment where you have basically unfettered permissions in AWS console to do what you need, doubly so.
Now try to get access to/from RDS, S3, EFS, Netapp NFS, some HTTP endpoint on-prem, some other HTTP endpoint on EC2, non-MSK Kafka, cross account, etc? Pain.
Oh you need to submit a ticket to your Linux sysadmins, Infra team, CloudOps, DevOps, Networking or Infosec for each of the above permissions? And sometimes need 2-3 of those teams to coordinate to make it happen? Death.
The system needs permission for AWS S3? Here is the component. Does it need to setup secrets? Here is the component. Does it needs to be in the same VPC as a Redshift cluster, or whatnot? There's a component for that. Do you need a SQS/RDS/Redis service? You get it.
K8s, terraform and Atlantis have been such huge enablers I cannot overstate. Everything is so nimble and cheaply setup that our current infra bill is about 500USD/month to generate over 100k MRR for the company.
And better yet, we rarely ever think of our infra unless we want to do something brand new (such as testing Sagemaker), or there's unexpected traffic above our current scaling limits (about once a year). Plus, if we need to fix anything infra related there's an internal cookbook for that.
I also feel I have acquired useful skills by learning all of this.
Instead zero happy paths get defined in a timely manner, everything you are trying to do is hamstrung and waiting in the CloudOps queue, and you can't self-serve around them because you cannot do it yourself due to permissions.
Imagine an org where "the happy path for RDS will be ready in 2-3 months, and only support one database type and 3 instance sizes" is somehow acceptable. Rinse & repeat for an alphabet soup of 25 other AWS services.
Unfortunately when these slow moving medium/big firms then move into the cloud, they re-invent all the opacity, inertia, and other issues that they had solved onprem already. Some think they can just replace 25 DC ops people with 2 cloudOps and somehow its going to all just work out.
> we rarely ever think of our infra unless we want to do something brand new
That just means your infra is stable. It would be exactly the same without terraform/k8s.
To be fair, it's over a year old, and probably the state of the art and best practices have advanced to the point where many of these are unlikely to happen. But in general, Kubernetes is widely considered a very big complex thing full of footguns for the unwary for a reason.
So while I agree with you that sure, you can get up and running by watching some videos and copy-pasting a few YAML files, the problem is when you are deep into critical production and you run into issues (the classic "I get woken up at 3am by an alert or my boss and we need to fix this in 10 minutes") and you lack the deeper understanding of the framework to even know where to start.
Or even worse, you insert an insidious security issue through a misconfiguration and you are not even aware you have been owned. Security is notoriously difficult to get right, even for people with experience in frameworks and systems, let alone a newbie. Kubernetes is not "secure by default" and again, there are footguns for the unwary:
https://snyk.io/learn/kubernetes-security/
None of these things make Kubernetes bad, per se, and I'm sure the benefits outweigh the costs. But personally I would be cautious about adopting it for serious production without having some solid real-world experience first.
There's a bigger question here as well, regarding small teams (as in startups, not just pizza teams in a tech giant). Where do you want your very limited time and focus to be? If I'm building some SAAS application I want to put my coding focus close to 100% towards the business model. If that model requires me learning new tech then fine, but otherwise it's a case of "use what you know", because new tech that isn't focused on that is going to waste my precious time and resources down the line.
That will scale a small number of containerized services just as readily as kubernetes and will have a lot less moving parts.
Where a more robust container orchestration system shines is when you have many disparate teams deploying disparate workloads and need to encode conventions around things like networking, service discovery and security policies.
As for health probes, I worked with load balancers in the late 90s that could use endpoint health checks so I’m not sure what you mean.
Regarding the endpoint health probes, I agree that’s possible if you have an app with a call that’s lightweight and representative enough to be used for that. But again, we are already deviating from the “pretty simple” solution here as well.
And we didn’t even start talking about how to make the Load Balancer highly available…
That said. I agree that the solution you’ve mentioned is a feasible one, I just don’t think that it’s way simpler than k8s if you truly have more demanding scalability and availability requirements.
Would it save more if you did not choose microservices, but wrote a monolith (for purposes of deployment) neatly divided into modules (for purposes of architecture and splitting the work)?
I'm not assuming positive answers. But I know that current hardware is absurdly performant, and you can serve a surprising number of real users from a $60/mo instance, plus some database.
(Managing monoliths via k8s is a thing though, and it works reasonably well.)
Totally. It takes some experience and maturity to be confident enough to resist the big business “best” practices. That, or a very intuitive entrepreneur
Frame this quote on the wall beside the monitor, things will magically (simply?) improve.
[1] <rant>poetry doesn’t understand that when I ` poetry add foo` I don’t want the latest version, I want the latest version that is compatible with the rest of my declared dependencies, especially my declared Python version</rant>
IIRC, the command was
$ poetry add foo most recent \
which fits this crowd most decentBasically, don't optimize for standards you'll never actually need. If you're writing say, a webapp that at most is expected to serve maybe 100 to 200 users from a single deployment, you don't need a full blown serverless stack with half a dozen microservices to handle all your requests, just get a decent VPS, configure both nginx and the server workers properly and consider caching the database heavy requests using say, memcached.
Throw in a round-robin of multiple deployments "as needed" and unless you're hitting "big social media company" levels of traffic and you can scale up to pretty insane degrees.
Obviously most small teams don't generate that much value. There are a lot of tiny podcasters out there. Nobody is going to mistakenly think that all small teams are Joe Rogan. But it is nevertheless possible for a small team to be absurdly productive given the right conditions - success isn't about team size, it is about the opportunity and available skillset.
FWIW, politics is very similar. One person can't achieve very much, but a small group can wield devastating levels of power.
If you fall off a ship in the middle of the ocean you might survive and those survivors may have had strategies but we just don’t know if the people that died did not have the same strategies. Same goes for this list I’d think.
So listing examples proves that it's possible for a small team to achieve a huge success. It doesn't prove that a small team is more likely to achieve success than a bigger one.
They quite likely do have strategies. People with successful strategies are vastly over-represented in pools of survivors. Hence the bias. The pool of survivors is skewed towards successful strategies, and does not represent the population of people who attempted the thing.
The bias would be noting that survivors used a range of clever strategies and then making tools available to support those strategies in an attempt to help people at sea. Survivorship bias is about noting that of course the survivors did things that worked, and to get better outcomes we need to focus on people using strategies that aren't represented when sampling from the pool of survivors.
OKR
"Feature creep" in a small company is a sign of flailing around trying to capture a market. Sometimes a whole new feature is developed under pressure from Sales to land a big whale client, or a desperate CEO who thinks runaway success is just that one key feature away.
In a big company feature creep may be the result of a corporate culture that doles out promotions and bonuses for building shiny new things rather than the boring work of maintaining old things. Google is a good example of this, only with entire new services rather than features.
Either way feature creep is symptomatic of deeper problems with a company, regardless of size.
Principal-agent problem, i.e. conflicting goals. Sometimes it's the team vs. company, sometimes it's the team or a person against themselves. There are choices that are most beneficial for the current project, and there are choices that are most beneficial for one's career after the current project, and/or choices that are most interesting to the person.
So e.g. Kubernetes may be a total overkill for most things anyone does, but if I get around to doing some side project where Kubernetes would be a fit, even if rather poor, you can bet I'll at least try to use it, because it's highly likely I'll encounter it later at my current or future job. Now, this is just my side project, but then, many (most?) widely-used FLOSS software started as someone's side project.
And the same reasoning happens in companies big and small, as failing to keep your skills fresh is a recipe for trouble sooner or later, and the industry-standard approach to software developers' growth is "figure it out on your own, we're paying you for labor, not for your professional growth".
I think it’s interesting because while I personally don’t like the Craigslist UX, I have no objection to using it anyway (even if might I try other solutions first). They provide enough other value to me, and the UX is good enough, that I still have an overall positive impression of the service.
I also find it interesting because the debatability of their UX is really very surface level. There are all kinds of things I wish were different, but that’s mostly because it was perfectly fine in 200* and hasn’t much changed with the times beyond a few utilitarian niceties.
I’m sure this is way overly specific to CL as a reply, but your comment about UX focus resonates with me, and I’ve long found Craigslist’s lasting success fascinating in this light.
Modern UI/UX zeitgeist is driven in large part by the web and mobile, which are driven by the "attention economy". The defining aspect of attention economy is that it makes money on friction. The longer it takes you to accomplish your goals, the more opportunities there is to display you ads, or upsell you something, or tire you out and make you more susceptible to be funneled to where the vendor wants you to be. The major design guidelines and UI frameworks are written and provided by advertising companies, and are focused on controlling the interaction, not empowering users. In this environment, ergonomics and good experience - meaning a tool that helps users achieve what they want as fast as possible, and gets out of the way otherwise - is actively discouraged.
So aesthetics comes into building their own distinctive "brand" (as opposed to the brand of the client/company they are currently working for). That's not to say they won't justify their design in terms of what the client needs, it just pushes them away from using "boring" aesthetics - for example, pushing for a trendy-looking design for a backend admin dashboard that would have been just as usable (and cheaper) to build with a bog-standard Bootstrap theme.
This isn't to blame designers, that's just the economic reality of the business.