Pep Guardiola’s side had looked unstoppable heading into the Selhurst Park clash, having won their last 18 league games, but were held by a well organised Eagles team, who themselves have now lost just one of their last 10 matches.
Palace could have won it in second-half added time when they were awarded a penalty, but Luka Milivojevic’s effort was saved by Ederson to leave Roy Hodgson’s side in 17th on 19 points.
City are 14 points clear at the top of the table and are still unbeaten in the Premier League, but Guardiola has confirmed Gabriel Jesus will be out for up to two months following an injury in the first half, while Kevin De Bruyne was stretchered off with a leg injury in second-half stoppage time.
It was an even opening at Selhurst Park and either could have taken an early lead, with Bernardo Silva scuffing a shot wide from Danilo’s cross in the second minute before Patrick Van Aanholt’s bouncing volley, which took a nick off a Man City player on the way through, was pushed away by Ederson.
The first half was marred by injuries and early substitutions for both sides. Scott Dann was stretchered off in the 20th minute with his knee in a brace after a tackle on De Bruyne before Jesus hobbled off in tears two minutes later after he also looked to pick up a knee injury.
Aguero, who replaced Jesus, went closest in the first half as he rattled the woodwork in the 28th minute. After a lay off from De Bruyne in the middle of the park, the Argentine produced a mazy run to the edge of the box before striking, but it could only rattle the upright before going wide.
City continued to have chances in the second half, and went close 12 minutes after the restart as Ilkay Gundogan and De Bruyne played a neat one-two on the edge of the area but the German curled his shot past the post. Wayne Hennessey then thwarted another close effort as Leroy Sane tried to poke home at the back post, but it struck the Welshman on the chest before going behind.
Crystal Palace had two huge chances to win it late in the game, with Andros Townsend thrashing an effort over the crossbar from eight yards in the 77th minute after a fizzing Zaha cross through the box. But it was on the 90-minute mark that Zaha was fouled by Sterling in the area and referee Jon Moss instantly pointed to the spot.
After a recent disagreement with Christian Benteke over penalties, it was Milivojevic who stepped up but his effort was read well by Ederson, who got down low to his right and pushed away the ball with his legs to set City on the break.
But the stretchers were called on once again as a nasty tackle from Jason Puncheon on De Bruyne saw both players go to ground and eventually carried off after some medical treatment, with the Belgian wearing a brace on his right knee to round off an eventful afternoon in south London.