Your code initializes with k and fluxdiff being numbers but after one iteration k and fluxdiff are lists.
Your while condition specifies fluxdiff >0.0001. But {number} > 0.001 will stop the iterations.
For the second iteration, your code crashes because k is also becoming a list.
This should do the trick
out = First@Last@Reap@While[fluxdiff > 0.0001,
oldflux = flux;
oldk = k;
oldsource = source;
iteration += 1;
flux = 1/oldk LinearSolve[a, oldsource];
source = b flux;
k = First[oldk Total[source]/Total[oldsource]];
fluxdiff = 0;
fluxdiff = First[RootMeanSquare[flux - oldflux]];
Sow[{iteration, flux, source, k, fluxdiff}];
];
Grid@out