India, who won the toss and chose to bat, reached stumps on 156 for five on a day's play that was truncated to 56.5 overs by a damp pitch, lightning and bad light.
Pace bowler Kallis dismissed both Rahul Dravid and Sachin Tendulkar, who stood firm in a stand of 69 after India had slipped to 14 for two.
Dravid scored 32, Tendulkar made 44 and Kallis took two for 37 from nine overs.
Shaun Pollock, who went into the match needing five more victims to become the first South African to take 400 wickets in Tests, took one for 14.
Fast bowler Makhaya Ntini made the initial breakthrough for South Africa when Wasim Jaffer offered no stroke and was trapped in front for nine with an inswinger that hit the flap of his pad.
Six balls later Pollock had Virender Sehwag caught behind by wicketkeeper Mark Boucher for four.
Dravid and Tendulkar batted conservatively together until Tendulkar pushed forward to an away-swinger from Kallis and edged a catch to AB de Villiers at second slip.
Kallis struck again six overs later when Dravid drove limply and was caught by Graeme Smith at first slip.
Vangipurappu Laxman and Saurav Ganguly seemed to be guiding India towards the close without further loss, but with what became the last ball of the day Ntini found the edge of Laxman's bat and Boucher took the catch.
Laxman was dismissed for 28 and before Mahendra Dhoni faced a ball, bad light ended play. Ganguly was 14 not out.
Play started 90 minutes later than scheduled because of damp patches on the pitch caused by groundsman Chris Scott's decision to lay wet hessian between the surface and the covers on Thursday.
A statement from the home union, the Gauteng Cricket Board, said Scott did so because he feared the cracked pitch would deteriorate too quickly.
Lightning hastened the tea interval by 15 minutes, and held up play for 45 minutes.
India 156 for 5 (Sachin Tendulkar 44, Rahul Dravid 32, VVS Laxman 28, Sourav Ganguly 14 n o; Kallis 2 for 37, Ntini 2 for 34, Pollock 1 for 14) Vs South Africa