How does a client know whether it is talking with a real or fake KDC? Is it based on the system configuration, similar to DNS?
I think there are two different but related answers to your question. Initially, the client needs to know what KDCs exist to handle authentication requests. In a Windows Active Directory environment this is handled through Kerberos service records in DNS. The client trusts DNS to provide a valid list of KDCs. But this does open up the possibility of an attacker compromising DNS in that environment and adding a Kerberos record for their fake KDC.
However, the 'real' authentication is based on the how the KDC proves to the client that it is a valid KDC during the initial authentication process. In its response to the client's request the KDC sends the client a session key encrypted with the client's secret key, or long term key. That secret key is based off a hash of the client's password. So if the client can't decrypt the session key it knows that there is a problem and the KDC it's talking to may be fake (or just not synced up with the latest secret key). The authentication process then fails.
At that point the client hasn't even sent its password hash to the fake KDC, so even a compromise of DNS doesn't really expose the client to unreasonable risks in this regard.