The login page
It is served by the gateway, in your colours, with the password, the second factor, passkeys and your corporate directory behind it. None of your services has one any more.
An internal application is no longer a program: it is a dozen services, written in several languages, shipped by several teams. The question is then not only what a gateway can do, but where it goes.
Every one of those services needs to know who is calling and what that person is allowed to do. Answered service by service, that means as many login pages as services, as many user tables, and sessions that do not mean the same thing from one service to the next. Answered once, in front, it means a door.
A UI route is a page a person looks at, so the gateway adds to it on the way through: the navigation portal, the account button, the theme, light and dark mode, injected into the HTML. The application carries nothing for that and does not even know.
An API route is called by a program, so there is nothing to add. It receives a signed token saying who is calling, with their roles and their organisation, and it authenticates nobody. A service is often both: its pages behind a UI route, its own API behind an API route.
Your ingress publishes one thing: the gateway's application port. Your services stay reachable from inside the cluster only, so none of them has a door to guard. The admin console is not on that port at all: it has its own, on an internal network.
Behind the ingress, several replicas serve the same routes. They never talk to each other: what they have in common is in the database, and a route that changes reaches the others in a second. Sessions live there too, so there is no affinity to ask of the load balancer: a request lands on any replica, and a rolling update takes nobody's session with it.
It is served by the gateway, in your colours, with the password, the second factor, passkeys and your corporate directory behind it. None of your services has one any more.
Accounts, roles, groups and organisations are in the gateway. Your services no longer store identities and no longer have to keep them agreeing with each other.
Who gets through is decided at the door, per route and down to one operation of your OpenAPI spec. The rule changes without redeploying the service it protects.
The navigation portal, the account button and the theme arrive in the HTML on the way through. A new application gets them without a line of code.
Traffic between your services stays between your services. Meerkat holds the door, which is what comes in and who is allowed, not the cluster's internal circulation. If you already run a service mesh for east-west traffic, the two do not overlap: one takes care of your services among themselves, the other of the world knocking.
A path, a target, and the gateway routes. From the console, from the admin API, or by letting an agent do it.
That decides whether the page gets the portal and the account button, or the request leaves with a signed token.
A level, roles, named accounts, and if needed a rule per operation taken from the service's spec.
The service itself does not move: it carries no library of ours, speaks no protocol of ours, and does not know it is behind a gateway.
The full Kubernetes shape, with the Deployment, the two Services, the Ingress and the probes, is on Kubernetes cluster. The two planes and what separates them are on Architecture. What the same assembly costs otherwise is on the case for Meerkat.