Match Report : Villarreal - Manchester City ( 0 - 3 )
Roberto Mancini's side will now qualify for the knockout stages if they win in Napoli in their next game.
Yaya Toure gave City the lead when he slotted in from just inside the area, before Mario Balotelli doubled the advantage from the spot after he was fouled by Mateo Musacchio in the box.
Yaya made it 3-0 when he jinked past Carlos Marchena before firing in.
It was as easy an exercise as the scoreline suggests, with City's night boosted by Bayern Munich's 3-2 win against Napoli which means their Champions League fate is in their own hands.
However, it did take the Premier League leaders 30 minutes to work out how to break Villarreal's stubborn resistance.
The Spanish side are struggling in La Liga but looked unruffled during that opening period. They worked hard as a team to suffocate City's dangermen of David Silva, Samir Nasri and Balotelli, who tried their utmost to conjure something out of nothing.
The opening goal came from City's first good chance of the match. Silva finally managed to free himself from the shackles and squeeze a square ball to Yaya who shifted to his right before placing his shot low into the bottom left corner of the Villarreal goal.
The lead was doubled seconds before the break when Musacchio was deemed to have brought down Balotelli in the area. On first viewing, referee Pedro Proenca's decision seemed rash, but the replay showed that the Argentine defender had nudged the Italian.
Balotelli, making his first start in the Champions League for City, slotted in his spot-kick for his seventh goal in seven games.
Villarreal barely put up a fight after the break in a half that was played at the pace of a pre-season friendly.
City themselves rarely threatened, although their best attacking move of the match resulted in the third goal.
It began on the edge of their own area before Nasri passed inside to Balotelli, who in turn found Yaya.
The Ivorian powerhouse showed nimble feet to dance past defender Carlos Marchena and stroke in his shot from eight yards.
The only cloud for City was what appeared to be a back injury suffered by Silva who was substituted in the 65th minute.