You can drain stuff by changing a Service's selector but leaving the Deployment alone. Instead of changing a Deployment and doing a rolling update, create a new deployment and repoint the Service. Existing connections will remain until you delete the underlying Deployment.
Rainbow Deployments with Kubernetes
11–20 of 41 posts
Re: Rainbow Deployments with Kubernetes
#12Question for the OP- I haven't ever worked on chat services, so this may not be reasonable. Would it be possible to use some other termination endpoint that sits in front of the service, that allows you to maintain persistent connections to the clients, but make for more transparent swaps of backend services? So, for example could you leverage nginx or haproxy as the "termination" point for the chat connection, with…
Re: Rainbow Deployments with Kubernetes
#13I'm not sure what problem the author is solving. I might be misunderstanding something. The author points out that the issue with Blue/Green/AnyColors deploys is that they need 16 pods per color at all time (which in their case would end up being 128 pods) and 24/48 hours for each connection pool to drain. But how is using a SHA instead of a COLOR any different? Unless I am missing something, and, if running 128 pods…
Re: Rainbow Deployments with Kubernetes
#14It feels like it should be possible to fix the reconnect experience, especially in the planned termination of underlying container case: if you ask the client to reconnect, rather than abruptly disconnecting them then they could possibly even wait until their new session was fully established before dropping the old one. That doesn't take away from my appreciation of the pattern, though: I'm very much in favour of ro…
Making this handoff automatic is definitely possible as well, though we do want people to reload occasionally to get new client-side code.
Re: Rainbow Deployments with Kubernetes
#15I'm not sure what problem the author is solving. I might be misunderstanding something. The author points out that the issue with Blue/Green/AnyColors deploys is that they need 16 pods per color at all time (which in their case would end up being 128 pods) and 24/48 hours for each connection pool to drain. But how is using a SHA instead of a COLOR any different? Unless I am missing something, and, if running 128 pods…
You could do the same with $Color, just seems to be clearer since people often think of $Color as being static deployment infrastructure, whereas people are used to SHA's pointing to branches that are naturally cleaned up.
Re: Rainbow Deployments with Kubernetes
#16Curious about the 24h-48h burndown...could it potentially be longer for you guys or is there some mechanism in place to force disconnection (and thus risk a spike) after some TTL?
Re: Rainbow Deployments with Kubernetes
#17It feels like it should be possible to fix the reconnect experience, especially in the planned termination of underlying container case: if you ask the client to reconnect, rather than abruptly disconnecting them then they could possibly even wait until their new session was fully established before dropping the old one. That doesn't take away from my appreciation of the pattern, though: I'm very much in favour of ro…
Re: Rainbow Deployments with Kubernetes
#18It feels like it should be possible to fix the reconnect experience, especially in the planned termination of underlying container case: if you ask the client to reconnect, rather than abruptly disconnecting them then they could possibly even wait until their new session was fully established before dropping the old one. That doesn't take away from my appreciation of the pattern, though: I'm very much in favour of ro…
Re: Rainbow Deployments with Kubernetes
#19Also, if the previous ReplicaSet a Deployment is rolling past has several pods, maybe only some of them need to stay alive (maybe some drain sooner than others.)
Perhaps the whole endeavor should just be to make Pod drainage a bit more explicit than just terminationGracePeriodSeconds... perhaps letting a pod signal with a positive confirmation that it's shutting down (letting connections drain) and the rest of the k8s controllers can just leave it alone until it terminates itself.
Although really, I think a combination of setting terminationGracePeriodSeconds to unlimited, and having a health check that ensures that it doesn't get wedged and miss the termination signal (by checking that a pod status of "shutting down" corresponds to some property of the container, like a health endpoint saying the shutdown is in progress...) and then nothing else needs to be done. Basically, color me skeptical when they say:
"We used service-loadbalancer to stick sessions to backends and we turned up the terminationGracePeriodSeconds to several hours. This appeared to work at first, but it turned out that we lost a lot of connections before the client closed the connection. We decided that we were probably relying on behavior that wasn’t guaranteed anyways, so we scrapped this plan."
(This also depends on the container obeying the standard SIGTERM contract to properly drain connections but not accept new ones, which is pretty standard in most web servers nowadays.)
Re: Rainbow Deployments with Kubernetes
#20Could probably solve this with a readiness probe / health check of sorts that is smart enough to know what low usage means.