Oracle RAC Maintenance
It is actual quite easy if you are obvious of some caveats:


configure your services to run on one node only: srvctl modify service -db $DATABASE -service $SERVICENAME -preferred $INSTANCE1 -available $INSTANCE2 -modifyconfig 
wait for the sessions to wander to the node running $INSTANCE1. This may take some time, it's heavily dependent on the type of application you are running. JAVA Applications tend to reconnect quite frequently. So check with your database, e.g. query gv$session.
Take down your node and do whatever maintenance there is to do 
Reconfigure your services to run on the second node: 


srvctl modify service -db $DATABASE -service $SERVICENAME -preferred "$INSTANCE1,$INSTANCE2" -modifyconfig
srvctl start service -db $DATABASE -service $SERVICENAME -node $NODE This step is crucial, if you omit it, the whole procedure won't work!  
srvctl modify service -db $DATABASE -service $SERVICENAME -preferred $INSTANCE2 -available $INSTANCE1 -modifyconfig

wait again for the sessions to wander to your patched node
Take down your second node and do whatever maintenance there is to do 
reconfigure your services to run on both nodes and start the services


srvctl modify service -db $DATABASE -service $SERVICENAME -preferred "$INSTANCE1,$INSTANCE2" -modifyconfig
srvctl start service -db $DATABASE -service $SERVICENAME



The procedure must be tested in your environment as there may be dependencies e.g. if you use a shared ORACLE_HOME on ACFS. The success of reconfiguration of services must be tested, especially if you have client-server applications.