Kipnis hit a three-run home run - his first since July 31 of last season - in the third and then capped another three-run rally in the sixth with an RBI grounder. Michael Bourn's double gave Cleveland the lead.
Danny Salazar (3-0) allowed four runs in six innings.
Kansas City shortstop Alcides Escobar suffered a bruised left cheek after being hit in the head by a pitch from Salazar in the fifth inning. The ball struck Escobar on the left side of the helmet and he was on the ground for several moments. He walked off the field with help from two Royals trainers.
Yordano Ventura (2-2) allowed five runs in 5 1-3 innings. The right-hander, who is facing a seven-game suspension and was ejected from his last two starts, kept his poise and didn't retaliate after Escobar was hit.
Salazar was upset over the incident and patted his hand in his glove as Escobar left the field. Kansas City's Mike Moustakas, the on-deck hitter, knelt down while several Indians players in the field looked on in concern.
Roberto Perez, breaking an 0-for-18 slump, homered and had three hits.
Cody Allen allowed a run in the ninth, but recorded his fourth save.
Eric Hosmer's two-run homer in the sixth gave Kansas City the lead, but the Indians scored three times in the bottom of the inning. Perez's double tied the game and Bourn's double put Cleveland ahead.
Kendry Morales had a two-run single in the first before Kipnis' first homer in 265 at-bats gave Cleveland the lead.
The Indians came into the game with the worst record in the AL and won for only the second time in eight home games.