The Bluesky documentation on the topic isn't very clear. They mention Bluesky.social a lot, as if it's supposed to be the one central server other PDS need to federate with:
Bluesky runs many PDSs. Each PDS runs as a completely separate service in the network with its own identity. They federate with the rest of the network in the exact same manner that a non-Bluesky PDS would. These PDSs have hostnames such as morel.us-east.host.bsky.network.
However, the user-facing concept for Bluesky's "PDS Service" is simply bsky.social. This is reflected in the provided subdomain that users on a Bluesky PDS have access to (i.e. their default handle suffix), as well as the hostname that they may provide at login in order to route their login request to the correct service. A user should not be expected to understand or remember the specific host that their account is on.
To enable this, we introduced a PDS Entryway service. This service is used to orchestrate account management across Bluesky PDSs and to provide an interface for interacting with bsky.social accounts.
I have setup bskysocial.world to test that (there's no web interface, just select this domain when logging in or signing up via the app or https://bsky.app)
Note: This is for testing only, I can't promise it will remain running.
No, it doesn't have to. Custom domain does not tied to any instances (PDS) you reside in. The way custom domain handle works is for the verification itself.
The first time you've created your account to that instance, you've been given to a specific instance name to your handle. For example "user.bskysocial.world". With the "user" acts as a subdomain and "bskysocial.world" as a PDS name.
You can still change your handle to however you'd like without having to migrate it to another PDS using your own domain name.
Every component in the ATProto (Handles, PDS, AppView, Relays, etc) are separated from each other and can be run individually, without having to cause massive interference to one another. I kind of think of it as a "Microservices" in ATProto, whilst ActivityPub is more like a "Monolithic" one.