Milan Michalek, Bobby Butler and Peter Regin also scored for the Senators (18-30-8), who broke an 0-9-2 skid and moved four points ahead of Edmonton. Brian Elliott needed to stop only 15 saves to earn the win.
Dustin Penner had a pair of goals, and Andrew Cogliano netted the other for the Oilers (16-31-8), who have dropped two in a row and have won only two of 13 games. Nikolai Khabibulin made 20 saves, but his personal losing streak was extended to 14 games.
Ottawa took a 1-0 lead on its first shot less than three minutes in. Butler took the puck away from Tom Gilbert and went around defenseman Theo Peckham to score his first NHL goal.
But Edmonton tied it less than a minute later as Jordan Eberle fed the puck to Cogliano in front and he slipped it underneath Elliott.
The Senators scored on their second shot, as well. A long shot by Kovalev flipped up into the air and appeared to be knocked into the net by Khabibulin.
The Oilers tied it 2-2 early in the second period when Penner unleashed a quick wrist shot that went in off the post and seemed to handcuff Elliott.
Play became rough in the latter stages of the second period with even Khabibulin and Senators tough guy Chris Neil shoving each other before Peckham stepped in for the Oilers.
Khabibulin was called for a pair of minor penalties on the play but the Oilers killed both to keep the game tied through two periods.
Ottawa regained the lead eight minutes into the third on its seventh power play. The puck bounced around in front of the Oilers net before Michalek put a shot into the corner to make it 3-2.
Edmonton was awarded a two-man power-play advantage shortly after but failed to capitalize.
The Senators gave themselves a cushion with six minutes left when Kovalev made a nice feed on a 2-on-1 break to Regin, who lifted the puck past Khabibulin.
The Oilers cut the deficit to a goal when Penner scored his second of the game and 20th of the season with 2:21 left.
Kovalev scored his second of the game into an empty net to seal the rare Senators win.
Notes: It was the second and final meeting between the clubs this season. Edmonton won 4-1 in Ottawa on Nov. 29. ... All six NHL teams in Canada were scheduled to play each other Saturday on Hockey Day in Canada. ... Senators forward Jason Spezza played in his 500th NHL game. ... Oilers captain Shawn Horcoff missed the game because of bronchitis. ... Oilers coach Tom Renney missed his second straight game to spend time with family following the death of his father.