In this case, they run in containers, so they can actually scale independently. For this purpose, it's as if they were running on independent hardware.
Even if we had separate cloud servers - such as EC2 on AWS - for each service, technically they are not really independent hardware.
But for the purposes of deploying, hardware capacity allocation and scaling, you can see them as such. The same goes for containers orchestrated by K8s.
I think it's the same line of thinking as RISC and CISC (reduced/complex instruction set computer). There's no such thing as a RISC machine or a CISC machine, all computer ISAs live on a spectrum that can be described as RISC-like or CISC-like.
There's no such thing as a micro service or a macro service (in terms of there being a perfect delineation). They're simply terms to describe certain design goals. Any given service might have several qualities that can be described as befitting a macro or a micro service.
It's all too easy to fall into the no true scotsman trap.
I like to think of it more of a separation of components needed to do the job.
Need a database, use a database as it's own service, don't couple the database to the app, so if you need to scale the app horizontally you can add more replicas. If you need to scale the database vertically, you can scale the database vertically. If these are coupled, you scale only whats needed.
On top of that use the language or tool that is meant for the job. If you need something written in go, build your service with go, if you need nodejs, do it with node, etc.
My definition is separation of infrastructure and deployment cycles. Everything that always in one deployment is one service or stuff thats part of your code-base is definitely not a different service.
It stops being a microservice when a developer starts saying, "oh! We can do X in service Y too! It already does ${similar work} and reads/writes from/to ${data source}, so why not?"
The intended model is to do one thing, thus enabling surgical changes to functionality without having to rebuild everything. As long as you stick to your API contracts, you can muck around with the internals without effecting anything else.
I remember coming to the same realization when the Google Vs Oracle court case was going on. Which decided that API’s are not copyrightable. To me it felt like the wrong decision, but what do i know.
I would definitely argue that public interfaces should not be copyrightable, since you need to be able to freely reimplement them to interoperate, which in my opinion should be preferred over granting even temporary monopolies to software interfaces.
However, public interfaces are only a small part of software interfaces in total. It's getting the system's internal interfaces right that takes most of the work.
I would say its best to only think about any deployable thing as a service. "Microservices" is just the idea that those things do not have a minimum size.
Essentially, "is this enough functionality to make a new service?" is the wrong question.
Is the separation of a specific functionality from a wider array of functions to its own vm make it a microservice?
When does something stop being a microservice i guess?