In a comment on my entry on how we reboot our machines right after updating their kernels , Jukka asked a good question:
While I do not know how many machines there are in your fleet, I wonder whether you do incremental rolling, using a small snapshot for verification before rolling out to the whole fleet?
We do this to some extent but we can't really do it very much. The core problem is that the state of almost all of our machines is directly visible and exposed to people . This is because we mostly operate an old fashioned Unix login server environment , where people specifically use particular servers (either directly by logging in to them or implicitly because their home directory is on a particular NFS fileserver ). About the only genuinely generic machines we have are the nodes in our SLURM cluster , where we can take specific unused nodes out of service temporarily without anyone noticing.
( Some of these login servers in use all of the time ; others we might find idle if we're extremely lucky. But it's hard to predict when someone will show up to try to use a currently empty server.)
This means that progressively rolling out a kernel update (and rebooting things) to our important, visible core servers requires multiple people-visible reboots of machines, instead of one big downtime when everything is rebooted. Generally we feel that repeated disruptions are much more annoying and disruptive overall to people; it's better to get the pain of reboot disruptions over all at once. It's also much easier to explain to people, and we don't have to annoy them with repeated notifications that yet another subset of our servers and services will be down for a bit.
(To make an incremental deployment more painful for us, these will normally have to be after-hours downtimes, which means that we'll be repeatedly staying late, perhaps once a week for three or four weeks as we progressively work through a rollout.)
In addition to the nodes of our SLURM cluster , there are a number of servers that can be rebooted in the background to some degree without people noticing much. We will often try the kernel update out on a few of them in advance, and then update others of them earlier in the day (or the day before) both as a final check and to reduce the number of systems we have to cover at the actual out of hours downtime. But a lot of our servers cannot really be tested much in advance, such as our fileservers or our web server (which is under constant load for reasons outside the scope of this entry ). We can (and do) update a test fileserver or a test web server, but neither will see a production load and it's under production loads that problems are most likely to surface.
This is a specific example of how the 'cattle' model doesn't fit all situations . To have a transparent rolling update that involves reboots (or anything else that's disruptive on a single machine), you need to be able to transparently move people off of machines and then back on to them. This is hard to get in any environment where people have long term usage of specific machines, where they have login sessions and running compute jobs and so on, and where you have have non-redundant resources on a single machine (such as NFS fileservers without transparent failover from server to server ).