It's a bit of a chicken and the egg problem... You can (and usually should) let lots of your drivers be modules, it keep your kernel lean and saves memory (until and if you need the module). However you do need some drivers built into your kernel - specifically for whatever device your booting from (eg. CD-ROM drive, HDD, ...), the filesystem used (eg. iso9660, ext4, ...), and any additional drivers needed to support this (eg. USB-support, SCSI-support, ...). If you don't, your kernel won't be able to access the medium and the filesystem where the modules for additional drivers resides, and thus can't load them into the kernel.
If you make a customized kernel for your own system - where you know in advance what hardware (HDD-type, DVD-drive type, etc.) you've got - this is not a problem. You just need drivers for what you actually got or think you may need. And you only need to include into the kernel, the drivers needed at boot-time.
However, if your making an install-disc for a distro, you must include drivers for all possible hardware users are likely to encounter! Including them all to the kernel, would make the kernel hopelessly bloated and it would take too much RAM on low-end systems. Making all drivers modules won't work, because the modules may be needed for loading them. The solution is
initrd is the image of a RAM-disk that is loaded into memory at start. All drivers likely to be needed lays on this as modules. As long as the kernel includes drivers to read a DVD, to read the filesystem on a DVD, and to read a RAM-disk; it will be able to access and load on demand the driver-modules from the initrd. This solves the problem for those who makes distros to make the kernel both small and include drivers for every hardware it may run on.
Most users probably keep using initrd-boot after they've installed Linux on their harddrives... This is not really neccessery, as they could build a custom-kernel - perhaps with additional kernel-modules - customized for the hardware they actually got. The two-step process of first loading the initrd, takes a bit of extra time during boot.