Arguing for the most user-friendly way
RPM: I have to build the RPM for all the majors and minors versions of RHEL.
But that's probably the right way to go from the point of view of your client. Single packet, clean, instant, no dependencies, installation.
There's maybe 6 to 12 versions you need to cover – all with the same SRPM. You can upload that SRPM to your own project on Copr and let IBM pay for the electricity needed to build your modules, or you can just have a loop in a shell script that runs for config in /etc/mock/rhel+epel-{7,8,9}-{x86_64,aarch64}.cfg ; do mock --rebuild ${your SRPM here} -r ${config} ; done (you might need to adjust templates a bit in /etc/mock to give you your different RHEL minors).
Or instead of using mock to set up your isolated build environments you do it in your own containers, VMs, or whatever you have available on site.
Automating on-target RPM building.
You'll want to use akmods, so that your binary kernel module RPM automatically gets rebuilt every time the kernel is updated (and the first time it's installed).
That way, your users don't have to do anything but install an akmod package, which will depend on the kernel headers package, which gets updated alongside with the kernel automatically. It will also depend on the necessary build tools (a C compiler etc).
rpmfusion's Packaging Kernel Modules as akmods goes in (only a little) more detail. In the end, akmod is just a way to automate building your kmod RPM.
It's probably best to look at an example of that in action. The v4l2loopback-kmod package contains a third-party kernel module which adds video loopback capability to the Linux kernel's v4l2 camera infrastructure. You can find the spec, along with the rest of the packaging files, here.