You'd think that they would've found out from either spies at the ports, reconnaissance planes or submarines in the channel.
Thanks in advance for the answer.
The German intelligence network in the UK was non existent - all their agents in the UK had either been captured or turned, and were feeding them false information.
But the Germans didn't miss out on the gathering of ground forces and naval assets in South England. They didn't have detailed information, because strong coastal air and naval defenses limited their ability to do sustained reconnaissance, but they weren't oblivious to the buildup. On a strategic level, there was no surprise - the Germans knew that the Allies were planning a major invasion of France. A lot of time, effort and resources were devoted to preparing to repel just such an attack.
The surprise came on a tactical level. The Germans knew that the allies were going to make an attack, but they didn't know where. Their best guess was that the Allies were going to try to land near Calais, both because it would be the easiest logistically (it's the shortest distance from England) and because of the well-chronicled Allied deception operations aimed at convincing them of exactly that. The Germans concentrated their forces in the Calais area, and when the Normandy landings did come they held back some of their best units in the mistaken belief that they were a diversion from the main assault.
So, tl:dr version - the Germans did know that the largest invasion fleet was heading for France, they just didn't know where in France.
Also worth noting that the Germans thought they did have intelligence sources in the UK, unknown to them they'd been turned by the Allies.
Joan Pujol Garcia (aka Agent Garbo) being the most prominent with regards to D-Day.
He was part of operation fortitude that sought to misinform the Germans regarding the invasion.
Worth reading more about if you are interested in the intelligence war.