I think the reason why the circles pass through other circles is because you have written a line of code which increases the velocity every tick:
velocity.y += gravity*delta. This causes the circle to gain extremely high speed after a few seconds. Remove that and what you get is smoothly descending circles. I changed your physicsprocess() function to:
velocity.y = 100
I also noticed you update the position of the circle directly. You should be using the
move_and_collide() function instead. When you update the position of the kinematicbody directly, you override the physics process and that causes glitches.
Does this answer your question?