Is obfuscation always reversable? Let's say we have a program that only accepts numerical inputs and the output is simply an increment by one of the input.

Example with input "a" and output "b": 

$$Input: a = 7$$

$$Output: b= a+1 = 8$$

So it would be easy to know what the program is doing.

Is it possible to obfuscate the program code in such a way that we can never be sure how it's done? 

For example our program could take the input:

$$7$$

double it:

$$14$$

subtract input - 1

$$14 - (7 - 1) = 8$$

Is it possible to obfuscate the exact functionality, so that it can't be reverse-engineered? If not: Could such an obfuscation scheme exist one day or is there something fundamental that prevents it?
I think what you are asking for here is the so-called notion of black box obfuscation where the behavior of the obfuscated code and a literal blackbox oracle can't be distinguished.

Sadly this has been proven impossible in "On the (Im)possibility of Obfuscating Programs" by Barak, Goldreich, Impagliazzo, Rudich, Sahai, Vadhan and Yang with a nice blog post by Green also touching and more informally explaining the topic.

To be more precise about "this" being used above: "this" means here the existence of a general "compiler" taking any program and returning a black-box obfuscated version. Special programs, e.g. functions which only evaluate to true at exactly one point or conjunctions (PDF; thanks Weiken Chen) can be black-box obfuscated.

What is possible though is so-called indistinguishability obfuscation (iO) which allows you to take two programs implementing the same functionality and run them through an obfuscator and now nobody can efficiently tell with which obfuscation they are presented.