K8s Statefulset 有状态的服务

在学习StatefulSet这种控制器之前,我们就得先弄明白一个概念:什么是有状态服务?什么是无状态服务?

无状态服务(Stateless Service):该服务运行的实例不会在本地存储需要持久化的数据,并且多个实例对于同一个请求响应的结果是完全一致的,比如前面的网站或者API实例,我们是不是可以同时启动多个实例,但是我们访问任意一个实例得到的结果都是一样的吧?因为他唯一需要持久化的数据是存储在MySQL,SqlServer数据库中的,所以我们可以说这个应用是无状态服务,但是MySQL数据库就不是了,因为他需要把数据持久化到本地。

有状态服务(Stateful Service):就和上面的概念是对立的了,该服务运行的实例需要在本地存储持久化数据,比如上面的MySQL数据库,你现在运行在节点A,那么他的数据就存储在节点A上面的,如果这个时候你把该服务迁移到节点B去的话,那么就没有之前的数据了,因为他需要去对应的数据目录里面恢复数据,而此时没有任何数据。

两个主要的特点

  1. 稳定的、唯一的网络标识符
  2. 稳定的、持久化的存储

稳定的 hostName

一个malema的实例 我们这个server是silo host

apiVersion: apps/v1
kind: StatefulSet
metadata:
  labels:
    app: server
  name: server
spec:
  serviceName: server
  replicas: 2 #部署的时候不会挂掉
  selector:
    matchLabels:
      app: server
  template:
    metadata:
      labels:
        app: server
    spec:
      containers:
          image: xxxhost/malema-server:72
          imagePullPolicy: IfNotPresent
      imagePullSecrets:
        - name: registrykeymalema
# dot need service

这个也不需要我们来配置 service了。

部署好后

C:\Users\malema>kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
server-1                 1/1     Running   0          24m
server-0                 1/1     Running   0          24m

这样每次这个server被重新部署或者重启的时候。它的Hostname会维持稳定。 每次重启后,集群可以得到通知。

其它的服务可以直接通过 server-0 server-1的方式加它暴露出来的端口来访问它。

port-forward

因为这个没有配置service如果我们想本地访问测试它的话。 我们可以通过用 port-forward 来暴露它。

kubectl port-forward server-0 30000:30000

稳定 持久化 存储

这个还没有弄过。 (如果数据库不想弄集群的话,我们可以把数据库部署成一个pod的方式。)

最近更新的
...