In the first half City were second best against a compact, clinical Palace side – looking to repeat their 2-0 win here last term – and the visitors deservedly led at the break through a John Stones own goal and a Joachim Andersen header.
It was the fourth Premier League game out of the last six in which City had fallen two goals behind, but they had not lost any of the previous three and they would win this one in style.
After Bernardo Silva pulled one back eight minutes into the second half, Haaland took over as his first home goals for City came in a hurry – three in the space of 20 minutes to make it six in his first four Premier League matches.
Yet for much of the afternoon it seemed Palace were going to enhance their reputation as City’s bogey side – having taken four points off them without conceding last term.
Patrick Vieira was forced to name a starting 11 without Wilfried Zaha – on the scoresheet here last season – due to injury, but the absence of their talisman did not prevent Palace from storming into an early lead as Eberechi Eze’s free-kick struck both Kyle Walker and Stones as it spun into the net.
Things got worse for City in the 22nd minute as they were again undone from a set-piece. It was Eze again with a corner from which Andersen was left unmarked to power in a header.
City struggled to muster any response against a well-organised Palace side who pressed the ball in numbers, nipping at City’s heels to deny them time and space on the ball, the home side’s frustration growing as the half went on and the time needed for each of Vicente Guaita’s goal kicks increased.
Palace should arguably have been 3-0 up after 28 minutes. Ederson saved a shot from Cheick Doucoure and then tried to roll the ball out. Odsonne Edouard deflected it to Ayew who promptly found the bottom corner, but referee Darren England signalled for a free-kick, though the goalkeeper was not impeded.
Haaland had headed over from a Riyad Mahrez corner before Palace’s second goal and he fired into the side-netting from a tight angle after the second, but found his supply lines restricted by the visiting defence.
Pep Guardiola had been planning two substitutions early in the second half with Ilkay Gundogan and Julian Alvarez both stripped and ready to go, but they sat back down after Silva got City back into it in the 53rd minute.
The Portugal international once again showed by Guardiola this week ruled out the possibility of him leaving as he cut in from the right before hitting a low shot which deflected off Jeffrey Schlupp on its way in.
Gundogan and Alvarez did come on just after the hour and Alvarez quickly made an impact as City levelled in the 62nd minute. He flicked on a deep cross to Foden, who chipped the ball back in for Haaland, who got across Marc Guehi to head in his first Etihad goal.
Eight minutes later he had his second. From a short corner, Alvarez fed Silva who pulled the ball back for Stones and he rolled it across for Haaland to poke home from all of a yard.
And he sealed his hat-trick with 10 minutes to go. Silva’s through-ball found his run perfectly, and the Norwegian had the strength to hold off Joel Ward before firing into the bottom corner.
It would be his final contribution as Sergio Gomez, on to make his City debut, replaced him to the sound of a thunderous roar around the ground.
Additional reporting by PA.