The accepted answer for org-mode is written by me. org-mode is tricky because its own check-word-predicate is already defined.
markdown is simpler because it uses default predicate provided by flyspell-mode,
(defun flyspell-generic-textmode-verify ()
"Used for `flyspell-generic-check-word-predicate' in text modes."
;; (point) is next char after the word. Must check one char before.
(let ((f (get-text-property (- (point) 1) 'face)))
(not (memq f '(markdown-pre-face)))))
(setq flyspell-generic-check-word-predicate 'flyspell-generic-textmode-verify)
(flyspell-mode 1)
By the way, M-x describe-function ENTER flyspell-prog-mode ENTER
, you will find similar setup.
Use the Source, Luke.