Duffy (2-4) allowed six hits and four runs in 6 2-3 innings in his second start since returning from the disabled list in a 4-0 loss.
''For the most part (he pitched) really well,'' Kansas City manager Ned Yost said. ''He elevated a couple of pitches they didn't miss.''
Marwin Gonzalez singled with two outs in the third inning before Springer's soaring shot, which bounced off the foul pole in left field to make it 2-0 and snapped Springer out of an 0 for 8 slump.
''I think I was most upset about hanging the slider to (Gonzalez),'' Duffy said. ''I just tried to throw hard and make it really tight. But it just floated in there. I think that may have taken me out of the next at-bat, which is in my opinion the best hitter on their team.''
Evan Gattis tripled with one out in the fourth inning. The fly ball sailed just out of reach of the glove of Lorenzo Cain, who raced up Tal's Hill in center to try and grab it and instead crashed to the ground and into the padded wall after coming up short.
''I felt like my first two steps were good and then after that my legs just gave out and into the wall I went,'' Cain said. ''I gave a great effort but at the end of the day, the hill won.''
Yost raved about Cain's effort on the play, before adding that he thinks the hill should go. He'll get his wish. The Astros are removing it at the end of this season.
''I thought it was phenomenal because anytime I've seen anybody go up the hill, they take a nosedive on the first step,'' Yost said. ''Lo took a nosedive on the third step. It shows you how great an outfielder he is.''
Gattis already has four triples this season after tripling just once in his first two years in the majors.
Springer drew a one-out walk in the fifth inning before scoring on a double by Altuve to push Houston's lead to 4-0.
That was more than enough for Keuchel (10-3), who backed up a shutout win over the New York Yankees in his previous start by dominating the Royals. Keuchel struck out seven and didn't walk a batter to lower his ERA to an American League-leading 2.03.
''He utilized both sides of the plate really effectively,'' Yost said. ''He'd get us looking away and then he'd start pounding us in. We couldn't gauge him. He was changing speeds. He really did a great job of keeping the ball down.''
The Astros have taken the first two games of this matchup of teams with the best records in the AL. Houston is 46-34 and Kansas City is 44-30.
Cain had three hits for the Royals, including two doubles, but the rest of the lineup fizzled. Kansas City produced more than one hit in only one inning while being shut out for the second time in a week.
Royals: 1B Eric Hosmer missed a second straight game and will likely miss Wednesday's game too with a sprained left ring finger. Yost said he isn't sure when Hosmer will return, but doesn't expect him to be out too long. Hosmer said he was feeling better on Tuesday and that most of the swelling was gone.
Astros: OF Colby Rasmus was out for the fourth straight game because of a skin infection on his left arm caused by a bug bite. Manager A.J. Hinch said Rasmus spent Monday night in the hospital receiving intravenous antibiotics to try to eliminate the infection and that he remained there on Tuesday. Hinch said they hope Rasmus responds to treatment and can avoid going to the disabled list.
Houston rookie Vince Velasquez (0-0) tries for his first win in his fifth major league start when he opposes Kansas City's Edinson Volquez (8-4) in the series finale. Velasquez has a 3.72 ERA, but has not factored in the decision in any of his first four starts. Volquez looks for his fifth straight win.