A player undrafted in the NHL, Karlsson spent the majority of the 2008–09 season in the HockeyAllsvenskan with the Malmö Redhawks, but appeared in seven games in the Elitserien with Södertälje. He was signed as a free agent by the San Jose Sharks prior to the 2009–10 season, but was returned to Sweden and took up starting duties with Färjestad. Karlsson appeared in 34 games, posting four shutouts and a 2.45 goals against average. He suffered an injury late in the season that prevented him from playing in the playoffs as Färjestad was eliminated in the first round. He finished fourth in the leaguesave percentage and tied for second in shutouts. Facing bleak prospects of playing with the Sharks in 2010–11, he contemplated signing with a team in the Kontinental Hockey League before his NHL rights were dealt by the Sharks to the Calgary Flames for a sixth round pick at the 2010 NHL Entry Draft. The Flames quickly signed Karlsson to a new one-year contract, and was expected to compete for the backup role to starter Miikka Kiprusoff. He described the chance to play in the NHL as "a dream come true". Karlsson made his NHL debut on 22 October 2010, a 6–2 victory over the Columbus Blue Jackets. He became only the third goaltender in Flames' franchise history to win his first game. He appeared in 17 games as the Flames' backup, finishing with a 4–5–6 record and a goals against average of 2.38. Following the season, he re-signed with the team, agreeing to a two-year deal worth $1.725 million. Karlsson struggled early in the 2011–12 NHL season, failing to win his first five decisions before suffering a torn medial collateral ligament in a game against the Vancouver Canucks on 4 December that caused him to miss two months of play. When he returned to action, he was often passed over for third goaltender Leland Irving when the team wanted to rest Kiprusoff, and consequently appeared in only nine games during the season. He started the final game of the year, a 5–2 victory over the Anaheim Ducks. It was his only win of the season, and his first since 21 January 2011. On 21 January 2013, Karlsson was traded by the Flames to the Chicago Blackhawks for a seventh round pick in the 2013 NHL Entry Draft. The Blackhawks immediately assigned him to their AHL affiliate, the Rockford IceHogs. He was recalled that season during the playoffs. The Blackhawks won the Stanley Cup that season, but he did not qualify to have his name on the Stanley Cup. On 25 June 2013, Karlsson left North America and returned to Sweden signing a one-year contract with Skellefteå AIK of the SHL. However, he left during the 2013-14 season and accepted an offer from Avangard Omsk of the Kontinental Hockey League, where he stayed for the remainder of the campaign. Karlsson then embarked on a two-year stint with fellow KHL side Jokerit of Helsinki, Finland. After the conclusion of the 2015–16 season, he moved on to Barys Astana, also competing in the KHL.