The visitors had taken a first-half lead, despite being outplayed for long periods, and then City saw a penalty decision overturned by VAR.
But Sergio Aguero's 250th goal for the club on 82 minutes levelled the scores.
And five minutes later the brilliant Argentine headed home his second of the game to put City ahead, but Palace had the final say as Fernandinho deflected a cross into his own net on 90 minutes.
Frustration at the Etihad
City were more than a shade unlucky to find themselves behind at the break after dominating possession for the lion’s share of the opening period.
Palace had come to frustrate and pack their own box whenever City attacked, and the champions were reduced to a couple of half-chances without ever really working goalkeeper Vicente Guaita.
Kevin De Bruyne thundered a free-kick off the underside of the bar, but otherwise City struggled to find a way through the massed ranks of Palace players.
When the visitors finally did get an effort on target, it resulted in the game’s opening goal with Cenk Tosun who, after a James McArthur corner, met Gary Cahill’s headed cross to nod the visitors into a surprise lead.
Given the visitors’ defensive mindset, it was the worst thing that could have happened with the now added incentive of having a lead to defend.
Coupled with the repeated time-wasting, and it made for a frustrating afternoon at the Etihad.
On 73 minutes the inevitable VAR controversy arrived, when referee Graham Scott awarded a penalty for handball against Jairo Riedewald who had his hands raised as a cross came in from the right - but the decision was overturned without the official checking the pitch-side monitor.
Feeling suitably hard-done to, City shifted up an extra gear and Aguero turned in Gabriel Jesus' low cross to make it 1-1.
Five minutes later, the Etihad roof almost came off as Benjamin Mendy's superb cross was headed home by Aguero to seemingly win the game for City.
But on 90 minutes, Wilfried Zaha broke forward and his low cross struck Fernandinho and went into the net to earn the visitors a point.
After all the hard work…
City, having worked so hard to finally get their noses in front, will see this as two points dropped.
With so little time remaining after Aguero’s second, killing the game off was vital.
In hindsight, getting the ball and keeping possession would have seen out the remaining minutes.
The real frustration is that City deserved to win this game, looked like they had, then allowed Palace one final chance.
The champions will also justifiably feel a little aggrieved that Ederson was chastised late on for wasting time when the Palace keeper had done far worse throughout the game without being warned.
Coming on midway through the second-half, Gabriel Jesus again made a positive impact when he came on to partner Aguero.
The Brazilian added presence in the box and was always asking questions of the Palace defence.
He assisted Aguero’s first goal and came close a couple of times himself and in games such as this, a twin strike force did cause a lot more problems on this occasion.
The young forward will now be hoping to get more minutes against Sheffield United on Tuesday.
Man of the Match: Aguero
251 goals for City is incredible. The man is, as we say often, a true Club legend.
"We tried to do everything. The spirit was there.
"We tried and tried.
"We came back and it’s sad we dropped points like that. But it’s football."
City are in action again on Tuesday evening with a difficult away trip to Sheffield United at Bramall Lane.
Then it’s a return to FA Cup action with a fourth round home tie against Fulham next Sunday, 1pm kick-off.
Stats and milestones
David Silva made his 300th Premier League appearance for City against Palace.
Sergio Aguero has now scored 179 Premier League goals and has moved clear in fourth position in the Premier League all-time scorers list.
Pep Guardiola became the fifth City manager to fail to win on his birthday.