Kallis made 119 not out as South Africa reached 248 for eight after they won the toss and batted on a well-grassed pitch in the day-night clash.
India were then skittled out for just 91 in reply, with Andre Nel taking four for 13 and Kallis following up his batting effort by taking three for three.
It was a record margin of runs for South Africa against India and gave South Africa a 1-0 lead in the five-match series after the opening encounter in Johannesburg last Sunday was rained out.
South Africa's total was always likely to be too much for India on a fast, bouncy pitch but the match was evenly balanced while India's leading two batsmen, Sachin Tendulkar and captain Rahul Dravid, were together.
The match turned irrevocably in South Africa's favour when Dravid was bowled by Charl Langeveldt for 18 and Tendulkar was bowled by Nel three balls later for 35.
From being 62 for two in the 16th over, India were 62 for four.
The remaining batsmen proved hopelessly incapable against fast, hostile bowling, with Nel producing a career-best performance, sparked by his dismissal of Tendulkar.
India's master batsman was trapped on the crease by a fast ball which cut back sharply and knocked out his off stump from an inside edge.
Neither Mahendra Dhoni nor Suresh Raina looked comfortable but they put on 20 before the last six wickets tumbled for nine runs.
It was an ignominious end for India after their bowlers and fielders, marshaled by captain Rahul Dravid, kept the South African batsmen in check for much of the innings despite Kallis' fine knock.
The home side were wobbling at 209 for seven with 26 balls left but Kallis and tailender Nel put on 39 for the eighth wicket before Nel was run out for 22 off the last ball of the innings.
It was Kallis' 14th one-day international century but his first in 25 matches against India - the only major cricket nation missing from his list of hundreds.
He had been dismissed three times in the 90s against India.
Indian pace bowlers Munaf Patel, Zaheer Khan and Ajit Agarkar each took two wickets.
Kallis, batting at number three, faced the ninth ball of the innings after captain Graeme Smith was leg before to Khan for one. He batted solidly from the start of his innings and made his runs off 160 balls with 15 fours.
South Africa were in some trouble at 63 for three but AB de Villiers (41) helped Kallis put on 87 for the fourth wicket.
They had to overcome some accurate slow bowling from Harbhajan Singh and Tendulkar, who conceded only a combined 29 runs in eight overs before De Villiers went on the attack against off-spinner Harbhajan.
He swept him for four, then swung him over midwicket for six, prompting Harbhajan to fire in a ball down the legside that went for five wides. The over cost 17 runs.
De Villiers went for one ambitious shot too many when he lost his balance and was stumped attempting a reverse sweep against part-time left-arm spinner Dinesh Mongia.
Mark Boucher helped Kallis put on 46 off 46 balls.
The innings then lost momentum as Boucher, Justin Kemp and Shaun Pollock were out in quick succession before Nel, with a previous highest score of 12, played a surprisingly effective hand.
India got off to a bad start.
Wassim Jaffer, making his one-day international debut in the absence of the injured Virender Sehwag, lasted only three balls before being bowled for nought by Shaun Pollock.
Tendulkar played some glorious strokes but Pollock had Mohammad Kaif caught at backward point for eight.
Then came the match-clinching double blow as Dravid and Tendulkar were out in quick succession. Dravid was bowled off an inside edge by Langeveldt before Tendulkar went in almost identical fashion.
South Africa 248 for 8 in 50 overs (Jacques Kallis 119 n o, A B de Villiers 41, Mark Boucher 21; Munaf Patel 2 for 39 Ajit Agarkar 2 for 47, Zaheer 2 for 53) beat India 91 all out in 29.1 overs (Sachin Tendulkar 35; Andre Nel 4 for 13, Kallis 3 for 3, Pollock 2 for 17)