I was recently asked to look at doing just this and as part of searching for a solution I found this Q&A.
As Michael says out-of-band is preferred but it's not always available.
I looked at snake server that Dawud suggests. It works but is unloved and there are errors in it's documentation. I wouldn't recommend using it.
I asked on IRC #centos and they pointed me at install from grub. This is similar to Aaron's solution but it uses network resources rather than a separate partition. This is what I ended up implementing. The gist is
- Download the installation vmlinuz and initrd.img to /boot
wget -N http://mirror.centos.org/centos/6.5/os/x86_64/isolinux/vmlinuz
wget -N http://mirror.centos.org/centos/6.5/os/x86_64/isolinux/initrd.img
Edit /boot/grub/grub.conf and create an entry for the new kernel
title Reinstall CentOS
kernel /vmlinuz ro upgradeany ip=192.168.254.44 netmask=255.255.255.0 hostname=somehost.tld ks=http://server.tld/ks/kickstart.ks gateway=192.168.254.220 dns=220.127.116.11 headless vnc vncpassword=SomePassword
On the server.tld you'll need to have httpd serving a suitably configured kickstart file the important thing here is the url directive
url --url http://mirror.centos.com/centos/6.5/os/x86_64
This causes the installation files to be copied from the remote system named.
This obviously only works if you can install your own kernel so for example it wouldn't work with a Digital Ocean droplet.
You can easily misconfigure something whilst developing the solution so I wouldn't recommend doing this on a system that doesn't have some method of reinstalling the service providers image easily.
Since getting this working I've not encountered any issues.