There are daily flights to Juliaca (one hour from Puno) from Lima and Cuzco. Regular buses travel from Arequipa, Cuzco and Lima to Juliaca and Puno. There’s also an iconic train route from Cuzco to Puno. If arriving from sea level, it’s best to travel overland in order to better acclimate to the altitude; flying straight from Lima can serve up quite a headache.
It’s also possible to arrive from Bolivia by bus or a packaged island tour of Lake Titicaca.