Manchester City maintained the pressure on leaders Arsenal as the Premier League champions reduced the gap at the top to two points with a hard-fought victory over struggling Crystal Palace.
Pep Guardiola's side had to remain patient at Selhurst Park, but were eventually able to take their opportunity to edge closer to the Gunners, who visit London rivals Fulham on Sunday (14:00 GMT).
Erling Haaland settled the match from the penalty spot for his 28th goal of the campaign, stroking his 78th-minute spot-kick into the bottom corner after Michael Olise's late challenge on Ilkay Gundogan.
The visitors had been unable to capitalise on a purposeful start, which saw Rodri's first-time effort force Vicente Guaita into action and Jack Grealish pull a low shot wide after he had darted into the penalty area.
Haaland, who scored his first Premier League hat-trick in the reverse fixture in August, went closest in the first half, but the league's top scorer remarkably failed to hit the target following Nathan Ake's pass into the six-yard box.
A shot-shy Palace pushed for a late equaliser against a retreating City, but it was to no avail as the hosts went a Premier League record third successive league game without managing a shot on target.
The defeat extends Palace's concerning league winless run to 10 matches - the longest in the division - and leaves Patrick Vieira's side just four points above the relegation places.
For City, the victory is a positive note to begin another crucial week - with the second leg of their Champions League last 16 tie against RB Leipzig next before an FA Cup quarter-final against Burnley.
"Of course Arsenal is on an incredible run. Still we are there," Guardiola told Sky Sports.
"Here in the typical winter game, a difficult one, we were there all the time and then we won it.
"Now we have to do absolutely everything and next Tuesday and Saturday. Hopefully the Etihad can live one of the best nights we have lived and we can do it again."
City struggle to three points to stay in touch
Erling Haaland is the second Manchester City player to reach double figures both home and away in a single Premier League campaign after Sergio Aguero in 2014-15It is no secret that City have been far from their scintillating best this term - this third successive win equalled their longest winning streak in the league this season.
And yet, ominously for Arsenal, Guardiola's champions remain within striking distance of a fifth title in six years.
That is despite enduring a frustrating evening in south London, where victory was ultimately delivered by a mistake from Olise, who needlessly felled Gundogan as Palace appeared to be edging towards a valuable point.
The visitors dominated possession, territory and chances, but Palace held firm under periods of intense pressure, with Grealish - playing with increasing swagger as he continues to develop in this City team - proving the key threat as playmaker Kevin de Bruyne watched on from the bench.
Phil Foden was unable to build on his recent return to form, although his final contribution before he was replaced by Julian Alvarez less than 15 minutes into the second half was to go close with a free-kick that Guaita sprung across to save.
Alvarez spurned the chance to make a near-instant impact as he blazed over, but Haaland held his nerve when presented with the chance to break the deadlock and clinch three crucial points.
Vieira, meanwhile, is right to be concerned about his side's situation, with the Eagles among nine teams in the relegation picture in the final third of the season.
Scoring goals is the obvious issue for Palace. Their wait for a shot on target will now extend to a fourth game after setting a competition record since Opta began recording such data in 2003-04.
They were handed a rare first-half opening when Olise dispossessed Foden in midfield and set Wilfried Zaha away, while substitute Eberechi Eze saw an attempt blocked amid a late search for an equaliser.
Palace's five points in 2023 is the lowest in the division, and just four points separate Vieira's misfiring side from the relegation places before difficult trips to Brighton and then Arsenal.
Player of the match
GrealishJack Grealish
Crystal Palace
Squad number11Player nameZaha
Squad number16Player nameAndersen
Squad number6Player nameGuéhi
Squad number15Player nameSchlupp
Squad number7Player nameOlise
Squad number17Player nameClyne
Squad number13Player nameGuaita
Squad number8Player nameSambi Lokonga
Squad number3Player nameMitchell
Squad number29Player nameAhamada
Squad number4Player nameMilivojevic
Squad number9Player nameJ Ayew
Squad number10Player nameEze
Squad number22Player nameÉdouard
Squad number2Player nameWard
Line-ups
Crystal Palace
Formation 4-2-3-1
13Guaita
17Clyne16Andersen6Guéhi3Mitchell
8Sambi Lokonga4Milivojevic
7Olise9J Ayew15Schlupp
11Zaha
13Guaita17ClyneSubstituted forWardat 71'minutes16AndersenBooked at 90mins6Guéhi3Mitchell8Sambi Lokonga4MilivojevicBooked at 30minsSubstituted forAhamadaat 61'minutes7Olise9J AyewSubstituted forÉdouardat 80'minutes15SchluppSubstituted forEzeat 80'minutes11ZahaSubstitutes
2Ward5Tomkins10Eze14Mateta22Édouard26Richards29Ahamada41Whitworth44RiedewaldMan City
Formation 4-2-3-1
31Ederson
5Stones25Akanji3Rúben Dias6Aké
16Rodri8Gündogan
47Foden20Bernardo Silva10Grealish
9Haaland
31Ederson5StonesSubstituted forWalkerat 89'minutes25Akanji3Rúben DiasBooked at 59mins6AkéBooked at 65mins16Rodri8Gündogan47FodenSubstituted forÁlvarezat 58'minutes20Bernardo SilvaSubstituted forDe Bruyneat 79'minutes10Grealish9HaalandSubstitutes
2Walker4Phillips14Laporte17De Bruyne18Ortega19Álvarez26Mahrez80Palmer82LewisLive Text
Match ends, Crystal Palace 0, Manchester City 1.
Second Half ends, Crystal Palace 0, Manchester City 1.
Joachim Andersen (Crystal Palace) is shown the yellow card for a bad foul.
Kevin De Bruyne (Manchester City) wins a free kick on the left wing.
Foul by Joachim Andersen (Crystal Palace).
Jack Grealish (Manchester City) wins a free kick in the defensive half.
Foul by Naouirou Ahamada (Crystal Palace).
Substitution, Manchester City. Kyle Walker replaces John Stones.
Foul by Nathan Aké (Manchester City).
Michael Olise (Crystal Palace) wins a free kick in the defensive half.
Offside, Crystal Palace. Wilfried Zaha tries a through ball, but Odsonne Édouard is caught offside.
Foul by Julián Álvarez (Manchester City).
Albert Sambi Lokonga (Crystal Palace) wins a free kick in the defensive half.
Corner, Crystal Palace. Conceded by Jack Grealish.
Attempt blocked. Eberechi Eze (Crystal Palace) right footed shot from outside the box is blocked. Assisted by Naouirou Ahamada.
Attempt blocked. Wilfried Zaha (Crystal Palace) right footed shot from the left side of the box is blocked. Assisted by Michael Olise with a cross.
Foul by Ilkay Gündogan (Manchester City).
Michael Olise (Crystal Palace) wins a free kick in the attacking half.
Attempt missed. Erling Haaland (Manchester City) header from the centre of the box is too high. Assisted by Jack Grealish with a cross.
Foul by John Stones (Manchester City).
Our coverage of your Premier League club is bigger and better than ever before - here's everything you need to know to make sure you never miss a moment