It appeared we would be made to regret several spurned chances until Ilkay Gundogan was fouled by Michael Olise with less than 15 minutes remaining.
Haaland coolly slotted the resulting spot kick home for his 28th Premier League goal and to make it five wins from our last six league games.
The success extends Pep Guardiola’s excellent record at Selhurst Park and moves us to within two points of leaders Arsenal. Our boss has now won five of his seven trips to Crystal Palace, drawing the other two.
City started excellently in the driving rain in South London with a Rodrigo volley forcing Vicente Guaita into his first save of the day just two minutes in.
Jack Grealish was inches away from an opener just a minute later with a low shot from 20 yards after a mazy run beyond Nathaniel Clyne.
Our hosts found a footing in the game and had their first chance of the night when Michael Olise fed Wilfried Zaha in the box. The winger shifted the ball on to his left and got a shot away but Manuel Akanji got in the way with an impressive block.
As ever, City dominated possession throughout the first half but found our ability to create chances heavily restricted by a determined Palace side.
That was until Nathan Ake wandered into the opposition area and squared for Erling Haaland. However, the Norwegian could only divert the chance over the bar.
Haaland was at the centre of things again a few moments later, hammering a cross that was parried away by Guaita before following up and seeing his deflection fly past the post.
Another period of City domination followed in the lead up to the break without Pep Guardiola’s men finding the breakthrough.
The second half started as the first had finished – with City in complete ascendancy. Our first major opening came when Grealish was fouled on the edge of Palace’s box but Phil Foden’s free-kick was saved brilliantly by Guaita.
Julian Alvarez was introduced just before the hour mark and made an immediate impact with a delightful turn before firing his shot over the bar.
The Argentine was at the heart of much of our creativity in the minutes that followed, almost finding Grealish with an inventive backheel before seeing a drilled shot saved well.
The crucial moment came with 15 minutes to go when Grealish and Gundogan combined for a short corner that resulted in the latter being tripped by Michael Olise.
The German burst into the box and received a pass from Grealish but his attempted turn was thwarted by the Palace winger's foul.
Haaland placed the ball on the spot and calmly sent Guaita the wrong way before sprinting over to the travelling City supporters.
He could have had a second a few minutes later but couldn’t quite get his head over a teasing Grealish cross.
Although our hosts pushed hard in the closing stages, Ederson remained untested at the final whistle as Palace registered a third consecutive match without a shot on target – an unprecedented stat in the Premier League since records began.
CITY XI: Ederson, Stones (Walker 88), Akanji, Dias, Ake, Rodrigo, Bernardo (De Bruyne 78), Gundogan (c), Foden (Alvarez 58), Grealish, Haaland
Subs: Ortega Moreno, Phillips, Laporte, Mahrez, Palmer, Lewis
PALACE XI: Guaita, Clyne (Ward 70), Guehi, Andersen, Mitchell, Lokonga, Milivojevic (Ahamada 60), Schlupp (Eze 80), Ayew (Edouard 80), Zaha, Olise
Subs: Whitworth, Tomkins, Richards, Riedewald, Mateta
Man of the match
Ilkay Gundogan - The Club captain was the essential link up between defence and attack against a Palace side that sat deep.
The German's assured touch is crucial in the tight spaces that much of these matches are spent in and his quick thinking was enough to unsettle our hosts to the extent that they conceded the penalty.
This match was yet another example of how Pep Guardiola's first City signing has proved to be one of the Club's very best acquisitions.
Stones steps up
Like he’s never been away.
Our England defender was excellent in and out of possession on his return from injury after more than a month on the sidelines.
Asked to play the hybrid full-back/midfield role that Rico Lewis has excelled in this season, Stones was exceptional from the first moment.
It’s a role that requires a clarity of thought and a sure touch, two of our No.5’s key attributes.
It was a delight to see him back and in a position on the pitch that he could well feature in more in future.
- City have kept a clean sheet in each of their last four Premier League away games against Crystal Palace – against no side have we had a longer run of away shutouts in the competition (also 4 v Arsenal, Leicester and Sheffield United).
- Erling Haaland scored his 10th Premier League away goal of the season – with 18 also scored at home, he's just the second Man City player to reach double figures both home and away in a single Premier League campaign, after Sergio Agüero in 2014-15 (13 home, 13 away).
- No player has scored more Premier League penalties this season than City's Erling Haaland (five, level with Ivan Toney). Only Yaya Touré has scored more from the spot in a single campaign for City (six in 2013-14).
Pep Guardiola reaction
"My experience is that every time we come here it has been very tough. Always I have the feeling when we come here, we play really good thinking how good they are. We always struggle because we want to score more goals.
"They have weapons. [Wilfried] Zaha is there, [Michael] Olise, [Eberechi] Eze, they are incredible strikers and they have incredible threat. They have composure, great attacking players. It is a question of patience. They will waste time so we have to push to do it.
"Everything pleased me, we missed the counter attack a bit. It is not easy, they defend six players in the box and Erling Haaland had two men marking him, Gundo [Ilkay Gundogan] had a man, it was a question of patience."
Erling Haaland reaction
"In the end everything that matters is the three points, to win games and to keep performing. It’s not easy.
"You saw Bournemouth beat Liverpool. Every game is a fight, we fight and I’m happy.
"Everyone knows how important this win is for us. We have to keep going. I say this every time but it’s the truth.
"We have to play different ways. Other teams adapt to how City play. That’s normal. We just have to try to do our best and perform."
What it means
Victory moves City within two points of Premier League leaders Arsenal, who will have the chance to respond against Fulham on Sunday afternoon.
This was our 19th win in 27 matches this season, leaving us with 61 points with 11 matches to go.
City welcome RB Leipzig to the Etihad Stadium for the second leg of our UEFA Champions League Round of 16 tie on Tuesday night. That tie is 1-1 after Riyad Mahrez’s goal in Germany last month.
Guardiola’s team are in FA Cup quarter-final action against Vincent Kompany’s Burnley next weekend before an international break, meaning our next Premier League assignment is a home game with Liverpool on 1 April.