Kolkata always brings the best out of Mumbai and it was no different here as defending a tricky 174 they reduced the hosts to 87-5 in 9 overs, before restricting them to 164-8 in 20 overs.
Earlier, Ambati Rayudu and Saurabh Tiwary slammed half-centuries to lift them to 173/5.
Making his debut for Mumbai Indians, Tiwary seized the opportunity with a glittering 43-ball 52 (9x4) while Rayudu who made a comeback after more than a month was Mumbai's top-scorer with a spectacular 63 from 37 balls (6x4, 3x6).
In reply, Chris Lynn (26 from 14; 3x4, 2x6) kept KKR in the hunt as he along with Gautam Gambhir (21) added a quick 41 runs from 23 balls before Kolkata once again lost the momentum with three wickets in 11 balls.
But Pandey kept Kolkata in the hunt as he stitched 34 off 16 with Yusuf Pathan, who looked explosive in a seven-ball 20 (3x6) before being dismissed by Vinay Kumar.
Pandey then got a fine ally in Colin de Grandhomme (29) as the duo put together 41 runs for the sixth wicket to take them closer to the target.
But the match tilted Mumbai's way, thanks to some incisive bowling by Johnson in the 14th over when he conceded two runs and almost dismissed Pandey, who had under-edged a delivery.
There was a sound when the ball passed the bat but umpire S Ravi thought differently as Johnson looked in daze.
Johnson, however, managed to create pressure and it could be felt when De Grandhomme was cleaned up by Hardik Pandya in the first ball of next over with a thin inside edge.
Dropped on 30, Pandey finally was dismissed by Hardik who finished with 2/18 to pave the way for a fine win.
Vinay Kumar and Southee also bagged two wickets each as they put up a fine bowling show to return to winning ways and top the table with 20 points.
Having lost four matches in their last five, it will be a cause of concern for KKR as their batting once again choked.
It was some exceptional display of pace bowling from Mumbai new ball bowlers, Southee and Johnson up front to foil Knight Riders' ploy to go for an attacking start in Narine and Lynn.
The Kiwi speedster set him up without giving him room to drive and holed out to Hardik Pandya at extra cover in the fourth ball.
Ruled out after a groin injury in their first match in Pune, a fit-again Rayudu earlier made full use of his reprieve by wicketkeeper Robin Uthappa on 10 to notch up a half-century in 32 balls.
Rayudu looked in ominous form and hammered sixes against KKR pace duo of Trent Boult and Umesh Yadav. His partnership with Tiwary was worth 61 runs from 46 balls before the latter was runout following a lack of communication.
But Rayudu ensured that they keep the run-rate ticking with his counter-attacking innings against the KKR pacers who started off well after they opted to bowl.
Rayudu hit Kuldeep Yadav for successive boundary and a six before being brilliantly stumped in the penultimate over.
KKR bowling once again faltered at the death and conceded 55 runs in the last five overs.
In the middle overs, Ankit Rajpoot bowled a brilliant 3- 0-14-1 and removed a dangerous looking Mumbai skipper Rohit Sharma (27 from 21 balls; 4x4, 1x6).
Kiwi pacer Boult fired in a superb first over and made the ball do the talking with excellent swing and bounce. Not only Boult troubled Tiwary but Windies explosive batsman Lendl Simmons looked clueless and survived a big appeal in an over where he conceded just two runs.
The pitch looked to have some fizz and Boult made full use of it. He finally got the reward in Simmons in his next over. Simmons had a testing time and failed to open his account from five balls.
But it did not matter much for Mumbai as skipper Sharma promoted himself to number three and looked in his elements at his favourite venue where he had scored an ODI world record innings of 264.
Sharma took the attack on to KKR camp especially against India pacer Umesh Yadav, smashing him for two exquisite boundaries and a six in his next over in an effortless
Tiwary, who played for Rising Pune Supergiant last season, complemented well as he along with Sharma put on 50 runs in 30 balls.
The duo looked in good touch but Gambhir's move to bring in unheralded Ankit Rajpoot did the trick as the bowler trapped Sharma in the second ball to break the partnership.
Having already made the play-offs, Mumbai had the luxury to test their bench strength and Rohit Sharma rung in as many as six changes including Tiwary and R Vinay Kumar who played their first match this season.
Earlier the match began after a 30-minute delay as rain accompanied by thunderstorm lashed the city for more than half an hour around 4 pm.