Touring captain scored near half of his side's runs in the first innings before the hosts bounced back from the loss of early wickets.
South Africa hold advantage in second Test despite Kohli's brilliance for India
India captain Virat Kohli struck a magnificent century, but South Africa hold the upper hand as they reached 90-2 in their second innings on a difficult wicket after rain and then bad light curtailed Day 3 of the second Test on Monday.
The home side lead by 118 runs having bowled India out for 307 after lunch, despite a classy 153 from Kohli, who scored almost half his side's runs.
AB de Villiers (50 not out) took the attack to the India bowlers after South Africa had sunk to 3-2 in their second innings on a wicket that is more Pune than Pretoria, with variable bounce and taking massive turn for the spinners.
De Villiers will start Day 4 with opener Dean Elgar (36 not out), who has battled for rhythm but hung around in an unbeaten third wicket partnership of 87.
South Africa had been rocked earlier by a double-strike from India seamer Jasprit Bumrah (2-30), who trapped both Aiden Markram (1) and Hashim Amla (1) leg before wicket with deliveries that skidded through after keeping low.
- Day 2 report: Kohli stands alone as India struggle with bat in Centurion Test
- Day 1 report: Ashwin finds redemption as he dent hosts' progress in Centurion
- Second Test preview: Centurion wicket surprises Du Plessis ahead of Test with India
There would have been plenty of panic in the South Africa dressing room at that point, but De Villiers started playing attacking shots from the moment he reached the wicket to transfer the pressure back onto the tourists.
Kohli had spoken before the match about showing more "intent" against South Africa's seam attack and he duly delivered, compiling a brilliant 153 not out from 217 balls.
He now has 21 Test tons to go with 15 half-centuries, a conversion rate when passing 50 that is only bettered in the game by Australia great Don Bradman, who made 29 hundreds and 13 fifties.
India had resumed on their overnight score of 183-5, but lost Hardik Pandya (15) to a farcical run out as the all-rounder ambled into his crease and failed to put his bat down, only to be undone by a direct hit from Vernon Philander.
Kohli and Ravichandran Ashwin (38) shared a quick-fire seventh wicket stand of 71, before the latter fell to Philander (1-46).
Mohammed Shami (1) edged a Morne Morkel (4-60) delivery to slip, while the latter also accounted for Ishant Sharma (3) when he was caught at short-leg.
Kohli was the last batsman out as he tried to attack the bowling, caught at deep mid-on to be become Morkel's fourth victim of the innings.
South Africa won the opening test of the three-match series by 72 runs in Cape Town.