The 31-year-old scored an unbeaten 118 for his 25th Test hundred as South Africa reached 294-3 at close on the first day after winning the toss on a dry and well-prepared pitch at the National Stadium.
Kallis, in the news for the wrong reasons after quitting the vice-captaincy over his omission from the Twenty20 world championships squad last month, shared a third-wicket stand of 170 with a resolute Hashim Amla, who made 71.
Kallis hit 15 boundaries during his 224-minute stay at the crease. He should have been out on 36 when he edged leg-spinner Danish Kaneria only for wicket-keeper Kamran Akmal to drop a regulation catch. Salman Butt then grassed a pull off Mohammad Hafeez when Kallis was on 61.
Kallis, who took 91 deliveries to score fifty, reached his second half-century off just 56 balls, hitting 11 boundaries to reach his ton, his second against Pakistan.
Amla hit six boundaries and a six during his 225-minute knock. He was also let off on one when Misbah-ul Haq spilled a catch off skipper Shoaib Malik.
The lapses allowed Kallis and Amla to continue untroubled before paceman Mohammad Asif bowled Amla in the second over with the new ball.
Earlier, South Africa were given a solid opening start of 87 by Herschelle Gibbs (54) and Graeme Smith (42).
Gibbs, without a hundred for 37 innings, looked set for a big score as he drove and cut with confidence to reach his half-century in two-and-a-quarter hours, hitting seven boundaries.
But he fell to a low catch in the slips by Hafeez off Umar Gul. Gibbs fell three short of reaching 6,000 Test runs.
Pakistan had been forced to rely on the only two available seamers in Asif and Gul but they failed to achieve an early breakthrough, forcing Malik to introduce Kaneria in the tenth over.
Kaneria did turn the ball but it was batting all-rounder Hafeez who claimed Pakistan's first wicket when he trapped Smith leg-before in his second over.
Smith hit five boundaries in his 105-minute stay at the crease. The home team received a jolt before the start of the match when prolific batsman Mohammad Yousuf pulled out, citing a lack of match practice and form.
The 33-year-old last week made himself available to play for Pakistan after cancelling a contract with a rebel Indian league.
But he had barely picked up a bat for two months after being dropped for the Twenty20 tournament, at which Pakistan were finalists.
"Yousuf told us that he needed time to gain match fitness and opted out on his own,"
Pakistan included Faisal Iqbal in Yousuf's place and gave a debut to left-arm spinner Abdul Rehman.
South Africa preferred paceman Andre Nel over veteran all-rounder Shaun Pollock after rookie paceman Morne Morkel failed to regain fitness following a leg injury.