I'm getting acquainted with Kubernetes, and haven't found simple solution for deploying stateful services in Kubernetes.
AFAIK the most applicable thing is Pet Set, however, it is still in alpha and can only be deleted completely; also, i don't feel i understand how persistent volumes should be managed to survive Pet Set recreation. Another option i've came up with is splitting service deployments into bootstrap-node deployment, bootstrap-node service and all-other-nodes deployment, which allows me to use bootstrap-node service as a contact point (that's not completely safe, though).
What are the popular approaches for this case and what pros and cons do they have?
Kubernetes has become the best orchestration platform for stateful applications. Using the Kubernetes constructs like persistent volume, StatefulSets and DaemonSets, you can efficiently scale and manage the stateful application.
StatefulSet is the workload API object used to manage stateful applications. Manages the deployment and scaling of a set of Pods, and provides guarantees about the ordering and uniqueness of these Pods. Like a Deployment, a StatefulSet manages Pods that are based on an identical container spec.
Deployments are used for stateless applications, StatefulSets for stateful applications. The pods in a deployment are interchangeable, whereas the pods in a StatefulSet are not. Deployments require a service to enable interaction with pods, while a headless service handles the pods' network ID in StatefulSets.
Topics: Cloud Volumes ONTAP, Kubernetes, Advanced Though Kubernetes storage has always supported stateless applications—which are horizontally scalable due to the interchangeability of each pod—stateful applications require stronger guarantees for the storage they use.
If you're looking at a set number of Pods in your stateful cluster in the Kubernetes cluster, PetSets (StatefulSets I believe it is called now) is the answer... or you can define a Service per Pod to achieve the same.
For Pods to be aware of other Pods's IPs, you can use Headless Services, which provide you with the list of IPs associated with a label.
For Storage, if you use emptyDir, you have local storage but you lose it when the Pod is removed / re-scheduled.
I use Zookeeper in Kubernetes and it is a bit of a pain to setup, but Zookeeper provides a 'reconfigure' API which allows to reconfigure the cluster when a node changes, so it is fairly easy to redefine the cluster on startup of a new node when a Pod is rescheduled. I'm not sure if Consul has the same type of feature, but it probably does.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With