See refguide > Product > Possible Issues: "The upper product limit is assumed to be an integer distance from the lower limit:" This is in reference to a (similar) example wherein the lower bound is explicit and the upper is a symbol. It should really state "positive integer distance" I guess. It goes on to mention the possibility of getting explicit conditions. In the example above this would be
Product[0, {i, 0, k}, GenerateConditions -> True]
(* Out[42]= ConditionalExpression[0, k \[Element] Integers && k >= 0]
*)
So it is behaving as documented, and this is an edge case where things can happen that might be confusing if documentation is not consulted.