Norwich were without 10 first-team players through injury but led on 18 minutes when Kenny McLean headed in a corner.
Ten minutes later Pukki broke clear and squared for Todd Cantwell to make it 2-0.
Pep Guardiola's side grabbed a lifeline just before half-time, Sergio Aguero glancing in Bernardo Silva's cross for his seventh goal of the season.
But, Norwich struck a third five minutes after the break. Emiliano Buendia dispossessed Nicolas Otamendi to set up Pukki for his sixth Premier League goal.
Man City hit back on 88 minutes courtesy of Rodri's low strike, but Norwich held on for a win that lifts them to 12th.
A first defeat since January leaves Pep Guardiola's side five points behind leaders Liverpool.
Norwich: 21 Sep v Burnley (A)
Man City: 21 Sep v Watford (H)