Pep Guardiola’s side scored twice in the final 11-minutes to claim the three points which saw us leapfrog Leicester City and Manchester United, though the latter reclaimed top spot with their victory over Fulham later in the evening.
This was City’s sixth win in a row in the league, but we were made to work hard for it by a Villa side who were playing for the first time in 19 days following a COVID-19 outbreak at the Club.
The hosts registered 28 shots to the visitors’ 11, but had to wait until the 79th minute to break the deadlock, when Bernardo fired into the top corner from the edge of the area after Rodrigo had dispossessed Tyrone Mings deep in the Villa half.
Referee John Moss waved away Villa's appeals about the Spanish midfielder recovering from an offside position before making the tackle, with manager Dean Smith sent off for his protests.
It got worse for Villa in the final minute, when Moss awarded a penalty after Matty Cash handled Gabriel Jesus’ headed effort and Gundogan made no mistake as he sent the spot kick straight down the middle.
There was a sense of relief when Bernardo struck at the rain drenched Etihad Stadium, where City dominated for long periods against a Villa side who defended stoically, whilst carrying a threat on the counter-attack.
In an open game, the hosts might have built a comfortable lead much earlier, but spurned several golden opportunities.
Emiliano Martinez made a superb early save to deny Bernardo from a yard, with the Portuguese midfielder unable to convert from Rodrigo’s header back across goal, though the Argentine goalkeeper looked well beaten when Joao Cancelo’s curling effort bounced back off the bar in the second half.
Martinez made another fine stop, parrying Gundogan’s glancing header from a corner and recovering well as Ruben Dias came in for the rebound, before the German midfielder somehow missed the loose ball with the goal gaping.
More defensive steel
Whilst City were on top, this was an open game throughout.
Villa defended in numbers, but were set up to counter-attack, with Jack Grealish, Ross Barkley and Bertrand Traore getting forward in support of Ollie Watkins.
John Stones thwarted one quick break, intercepting Barkley's under hit pass to Grealish who was in a promising position and the two midfielders evidenced their threat again before half-time when they combined before Barkley's curling effort forced a good save from Ederson.
Bernardo's goal arrived at the perfect time, with Villa having enjoyed their most promising spell in the moments prior.
Ederson beat away a fierce 25-yard half-volley from former City midfielder Douglas Luiz, whilst Dias enhanced his growing reputation further with a crucial intervention to turn Watkins' centre behind when Jacob Ramsey was waiting to pounce in the six-yard box.
Pep guardiola - A big victory
"It was a very good performance again, against a top side. They are very dangerous and just look at their results this season. A big victory.
"The most difficult thing is to score a goal, in the second half we were more aggressive."
Man of the Match - Bernardo Silva
The Portuguese playmaker came up trumps with a great goal at a crucial time in the game.
It was his third goal in four matches, following his brace against Birmingham City and it feels like the 26-year-old is coming into form at a crucial point in the season.
Gundogan's goal was his seventh in 19 appearances in all competitions this season, making 2020/21 the best goalscoring campaign in his top-flight career.
What it means
City's ninth consecutive victory stretches our unbeaten run to 16 games in all competitions.
United's victory at Fulham leaves us second in the Premier League, two points behind our local rivals, but with a game in hand.
City face League 2 Cheltenham Town away in the FA Cup fourth round on Saturday 23 January, with kick-off at 17:30 (UK).
We’re back in Premier League action on Tuesday 26 January, when we play West Bromwich Albion at The Hawthorns. Kick-off is at 20:15.
CITY: Ederson, Walker (Zinchenko 28'), Stones, Dias, Cancelo, Rodrigo, Gundogan, De Bruyne (C), (Jesus 59') Bernardo, Foden, Sterling (Mahrez 72').
SUBS: Steffen, Torres, Mendy, Fernandinho, Garcia, Bernabe.
ASTON VILLA: Martinez, Cash, Konsa, Mings, Targett (Taylor 75'), McGinn, Luiz, Traore (El Ghazi 68'), Grealish, Barkley (Ramsey 68'), Watkins.
SUBS: Heaton, Guilbert, Engels, Elmohamady, Nakamba, Davis.
News about Man City v A Villa
City 2-0 Aston Villa: Full-match replay
Enjoy the full 90 minutes of City's dramatic Premier League success against Aston Villa on CITY+. Watch more.
GALLERY: Bernardo and Gundogan late double enough to down Villans
A late stunner from Bernardo Silva, his first Premier League goal of the season, and an Ilkay Gundogan penalty were enough to earn Manchester City a hard fought 2-0 win against Aston Villa and move us top of the table. View more.
Guardiola: City playing the way we need to be champions
Pep Guardiola sounded a special salute after City’s dramatic 2-0 win over Aston Villa and said his side were playing in the manner of prospective Premier League champions. Read more.
Bernardo welcomes that winning feeling!
Bernardo Silva believes Manchester City can keep going from strength to strength after a hard-fought 2-0 win over Aston Villa. Watch more.
City 2-0 Aston Villa: Extended highlights
Watch extended highlights of Manchester City's 2-0 win over Aston Villa in the Premier League. Watch more.
City 2-0 Aston Villa: Brief highlights
Watch the very best of the action from Manchester City's 2-0 win over Aston Villa in the Premier League. Watch more.