India are the only undefeated side in the tournament with eight consecutive wins, and sits atop the table with 16 points.
South Africa has 12 points — six wins in eight games.
The remaining two berths are still up for grabs, as is the order of qualification, which will decide the semifinal matchups. Australia has 10 points, with New Zealand, Pakistan and Afghanistan two points behind.
South Africa’s batters fell easily as Ravindra Jadeja picked up his ODI best 5-33 in nine overs, while Mohammed Shami returned figures of 2-18 in four overs and Kuldeep Yadav impressed with 2-7 in 5.1 overs.
Kohli said batting wasn’t easy despite hitting his fifth ton against South Africa.
“It was a tricky wicket to bat on,” Kohli said. “The pitch was on the slower side and I was told by the team management to bat deep. Shreyas played well and we got a few more runs towards the end.”
Chasing 327, South Africa’s innings was in disarray from the beginning. In-form Quinton de Kock chopped onto his stumps off Mohammed Siraj in the second over.
Temba Bavuma and Rassie van der Dussen added 16 runs off the next 40 balls, before spin was introduced.
Jadeja bowled Bavuma off his third ball, beating the outside edge of his bat with sharp turn and knocking back the off stump.
Shami then came on and Aiden Markram was caught behind for nine, while van der Dussen was out lbw for 13.
In between, Jadeja trapped Heinrich Klaasen lbw for one run. He also bowled David Miller for 11.
South Africa crashed from 22-1 to 40-5 and then 59-6. Van der Dussen’s 13 runs was the highest individual score among the top six batters.
Marco Jansen top-scored with 14, before falling lbw to Jadeja. He had also bowled Keshav Maharaj, again with sharp turn.
Jadeja got his fifth wicket with Kagiso Rabada (6) caught and bowled. Yadav brought a swift end to the proceedings and bowled Lungi Ngidi for nought.
Earlier, India chose to bat first and skipper Rohit Sharma gave India a quick start, scoring 40 off 24 balls. He hit six fours and two sixes, putting on 62 off only 35 balls with Shubman Gill.
Sharma was caught off Rabada (1-48). Gill scored 23 runs before Maharaj bowled him with massive turn in the 11th over.
Kohli and Iyer then came together at 93-2 and weren’t separated until the 37th over as they countered South Africa’s dual spin threat. While Maharaj finished with 1-30, Tabraiz Shamsi proved expensive with 1-72 from 10 overs.
Kohli reached 50 off 67 balls and then slowed down in the second half of his innings. Iyer meanwhile got to 50 off 64 and scored 27 runs off the next 23, including three fours and a six.
Overall, Iyer hit seven fours and two sixes but fell against the run of play, out caught off a skier at mid-on.
Lokesh Rahul was out for eight runs with van der Dussen taking a splendid catch in the deep. Suryakumar Yadav scored 22 before a reverse sweep went awry and wicketkeeper de Kock claimed a frontal diving catch off his gloves.
At the other end, Kohli punched singles and ran hard as boundaries were hard to come by.
Some 68,000 fans cheered as Kohli got to the record-equaling milestone in the 49th over.
His 100 came off 119 balls – the joint most deliveries Kohli has faced to reach his century alongside Adelaide in the 2015 World Cup (versus Pakistan) and Cape Town in 2018 (versus South Africa).
Jadeja smacked 29 not out off 15 balls, with three fours and a six, in an all-round team performance for two-time champions India.