A late penalty from Erling Haaland gave Manchester City a hard-fought 1-0 win against Crystal Palace at Selhurst Park.

Palace are now without a win in their last 11 games but Patrick Vieira's side kept City at bay for large periods of the contest, despite not registering a shot on target themselves.

Pep Guardiola left Kevin De Bruyne and Kyle Walker on the bench and was about to bring the Belgium international on with time running out, before his side won a penalty in the 78th minute, which Haaland converted.

A third straight Premier League victory moves City to within two points of leaders Arsenal, who visit Fulham on Sunday.

City made their intentions clear early as Rodri forced Vicente Guaita into a save from a volley while Jack Grealish dragged a good chance wide of the near post inside the first four minutes.

Palace came into the game more as the first half went on but were reliant on an uncharacteristic miss from Haaland as the Premier League's top scorer lifted a presentable effort over the bar from Nathan Ake's cross.

Guaita saved well from Phil Foden's free-kick 11 minutes into the second half, while substitute Julian Alvarez – who replaced Foden moments later – turned beautifully before firing his shot over.

It looked like Palace would hold out for a fifth consecutive home draw before Michael Olise conceded a penalty by fouling Ilkay Gundogan after a short corner, allowing Haaland to send Guaita the wrong way from the spot and score his 28th league goal of the campaign.

The Norwegian had another chance with seven minutes remaining when he headed over from Grealish's cross, but City held on to put further pressure on Arsenal in the title race.