Duffy also can earn up to $75,000 in performance bonuses -- $50,000 if he is selected to the All-Star Game, $10,000 if he makes 20 starts and $15,000 more if he makes 25 starts.
Duffy had filed for $3 million, while the Royals had countered at $1.75 million.
Duffy, 26, had his best year in the Majors in 2014, posting a 2.53 ERA. He held opponents to a .209 average, lowest in club history by a left-hander with more than 140 innings.
"There was a two-month period last season where he was as good as anyone in baseball," Royals general manager Dayton Moore told MLB.com by phone Friday afternoon. "He's going to be a big part of our rotation, just like he was last season.
"What I see in Danny is a guy who is maturing and also learning to manage his body in the right way that will enable him to avoid injury. I don't see any reason why he won't have a big season for us."
Duffy made three appearances in the postseason, and he got the victory in Game 1 of the American League Division Series by pitching a scoreless 10th inning against the Angels.
The Royals still have three players who are arbitration-eligible yet to be signed -- pitchers Greg Holland and Kelvin Herrera, and first baseman Eric Hosmer.
Jeffrey Flanagan is a reporter for MLB.com. Follow him on Twitter at @jflanagankc. This story was not subject to the approval of Major League Baseball or its clubs.