The veteran all-rounder compiled a typically patient ton as the Proteas took firm control of the deciding match of the two-Test series.
He was at the crease for more than six hours overnight, facing 316 deliveries for his 115 runs, with 13 boundaries.
However, three balls after overhauling retired Indian batsman Rahul Dravid as the third-highest scorer in Test cricket, with 13 289 runs, he got a thick top edge off spin bowler Ravindra Jadeja, with wicketkeeper MS Dhoni taking a sitter.
Three overs later, seamer Zaheer Khan had night watchman Dale Steyn, who shared 86 runs for the sixth wicket with Kallis, caught behind for 44 runs.
At lunch on day four, the Proteas had reached 395/7, holding a 61-run lead over India in their first innings of the rain-interrupted second Test, with Faf du Plessis and Robin Peterson both on five.