I don't think you want to implement the custom Runner, because after all Runner will still run per test case. I believe you're looking for a way to run all the tests in a module (probably by the build tool) and yet to have Kafka and Zookeper run only once.
So technically you can't really achieve that with JUnit, at least I'm not aware of any good way to do that, like you know, put some fancy annotation here and there and it will work. There are couple of approaches I think that can help though:
Test Suites. You can create a Test Suit that will contain all the integration test in the module.
Then you can put a "@BeforeClass/@AfterClass on the methods of class that runs with a suit runner. In these methods you can start/stop the heavy stuff (Kafka, zookeeper). Here you can find a complete technical example.
The drawback of course is that you'll have to maintain the Suite classes.
Assuming you have spawn a jvm for the integration tests module (forking), its possible to apply the following technique:
Create a code that will start Kafka / Zookeper and make sure it will execute only once. You can create some common parent for all your tests, and use static boolean isMyHeavyStuffRunning
shared state variable at the level of parent.
Implement a Shutdown hook and add it to the runtime. When all the tests will be done, the JVM will halt, but right beforehand your listener will be called and you'll be able to shutdown the Kafka/Zookeper.
The example of Shutdown thread hooks.