I am trying to do a sfdx force:mdapi:deploy to my production org. I am just migrating one class file, however when I do that I keep getting code coverage failures on custom classes that are already in the production org and not being migrated with this deployment. Is this normal behavior? This is my first deployment and I not sure if I now need to write test classes for those existing classes.
You need to specify which tests to run to get sufficient coverage. Presuming you already have proper coverage, you can simply just do this:
sfdx force:mdapi:deploy -d src -l RunLocalTests -w 60
Where -d is the source for the code you're deploying, -l tells Salesforce which tests to run (the demonstrated option runs all of your org's tests), and -w is the time to wait, in minutes (adjust as necessary).
See force:mdapi:deploy documentation for more options you can choose.
If you specify RunLocalTests, the aggregate code coverage must be 75%; if you choose RunSpecifiedTests, each class that runs in a test must individually meet the 75% requirement. In other words, even though you're deploying just one class you need to make sure all classes touched by any unit tests that are run have at least 75% coverage if you want to only run the one unit test. Otherwise, you'll need to run all tests to get the more lenient 75% aggregate coverage limit.