Castillo’s 10 strikeouts matched his most since he was acquired in a trade with Cincinnati in July.
“I can’t say enough about what he means to our pitching staff and what he’s done since he’s been here,” Seattle manager Scott Servais said.
The Mariners backed Castillo (4-2) with three runs in the first and one in the second. Ty France hit an RBI double and scored on Eugenio Suárez’s check-swing bloop single. Julio Rodríguez added a run-scoring double in the second.
Pittsburgh right-hander Vince Velasquez (4-4) departed after two innings due to discomfort in his pitching elbow. He allowed seven hits and walked one.
The 30-year-old Velasquez also exited with elbow discomfort in his previous start on May 4, when he lasted just three innings against Tampa Bay. He was on the 15-day injured list prior to being activated for Saturday’s start.
“Just watching him at the end of the second, he just didn’t look like he was comfortable,” Pirates manager Derek Shelton said.
“Having a conversation with him, it just didn’t feel like he was in the best spot, so we decided to take him out.”
J.P. Crawford, France and Rodríguez each had two hits for Seattle. It was Rodríguez’s fifth multihit performance in the past six games.
“Julio is starting to heat up as the weather is heating up, which is really good sign,” Servais said.
Pittsburgh designated right-hander Duane Underwood Jr. for assignment to make room for Velasquez. Underwood posted a 5.18 ERA in 24 1/3 innings across 20 relief appearances this season. He had a strong April, but struggled to an 8.44 ERA in May.
Mariners LHP Marco Gonzales (4-1, 5.68 ERA) takes the mound. He tossed six innings of two-run ball against Oakland in his last start, rebounding from a May 17 outing in Boston that was among the worst of his career.
Pirates RHP Luis Ortiz (1-2, 4.02 ERA) makes his fourth start of the season on Sunday after opening the year in Triple-A Indianapolis. He pitched 7 2/3 strong innings against Texas in his last outing, allowing just two runs and five hits.