Mohamed Salah put Liverpool in the lead early in the game with a well-struck penalty after Sadio Mane was fouled by Kyle Walker.
Manchester City equalised midway through the first half though, when Kevin De Bruyne set up Gabriel Jesus, who turned past a couple of Liverpool defenders to slot past Alisson Becker.
Manchester City should have taken the lead towards the of the first half, when referee Craig Pawson gave them a penalty for a Joe Gomez handball. But with Alisson having dived the wrong way, De Bruyne dragged his penalty wide of the target.
In the second half, the game was a lot less open and chances were at a premium. Gabriel Jesus had the biggest of them, with a free header that he put wide.
Here's how each player fared for both teams.
Manchester City Player Ratings
Ederson - 7/10
Ederson made a terrific save to deny Trent Alexander-Arnold late in the first half. Early on in the game, he was also decisive in coming out to deny Roberto Firmino a clear chance to shoot.
Kyle Walker - 5/10
It was a daft tackle from Walker on Mane to give away a penalty that Salah tucked away. City did get plenty of joy from switching the play to him, as he provided them the width on the right flank.
Ruben Dias - 6/10
Dias gave away a couple of daft fouls in dangerous areas, but those were his only iffy moments in a game in which he was generally solid.
Aymeric Laporte - 7/10
Laporte did superbly in dealing with the threat of Salah. He was strong and ensured that the Egyptian couldn't hold the ball up. He also ensured that the City line was deep enough to deny Salah the space to run in behind them.
Joao Cancelo - 8/10
Cancelo was City's best player on the day. He was excellent in defending one-on-one against any of the Liverpool attackers that were on his flank. He got forward well enough, and also set up Jesus's big chance in the second half.
Rodri - 6/10
Rodri was sometimes a bit slow in possession, and got picked off by the Liverpool press. In general though, he was a steady presence in front of the City back four.
Ilkay Gundogan - 6/10
Gundogan played a few smashing diagonal balls throughout the game, but he couldn't impact City's attacking play consistently enough.
Kevin de Bruyne - 7/10
After the game, Jurgen Klopp called De Bruyne the difference-maker, and he sure was. He got the assist for Jesus's goal with a clever pass to the Brazilian. His rating is only soured by the missed penalty, when he completely missed the target.
Ferran Torres - 6/10
Ferran had a quiet game. He couldn't really trouble Robertson too much, and was substituted midway through the second half with Bernardo Silva replacing him.
Raheem Sterling - 5/10
Sterling had a terrible game. He had a golden chance to score in the first half, but was denied by Alisson. His dribbling throughout the game left plenty of questions to be asked, as both Alexander-Arnold and Milner dealt with him easily.
Gabriel Jesus - 7/10
Jesus scored in his first league start for seven weeks, with a lovely finish after reacting quickest in the box. He should have scored another with a second-half header, but he put it wide when he was unmarked.
Bernardo Silva - 6/10
Bernardo Silva troubled Robertson more in the time he was on the pitch, than Ferran managed to before that. But he couldn't find the key to unlock Liverpool.