在学习StatefulSet这种控制器之前,我们就得先弄明白一个概念:什么是有状态服务?什么是无状态服务?
无状态服务(Stateless Service):该服务运行的实例不会在本地存储需要持久化的数据,并且多个实例对于同一个请求响应的结果是完全一致的,比如前面的网站或者API实例,我们是不是可以同时启动多个实例,但是我们访问任意一个实例得到的结果都是一样的吧?因为他唯一需要持久化的数据是存储在MySQL,SqlServer数据库中的,所以我们可以说这个应用是无状态服务,但是MySQL数据库就不是了,因为他需要把数据持久化到本地。
有状态服务(Stateful Service):就和上面的概念是对立的了,该服务运行的实例需要在本地存储持久化数据,比如上面的MySQL数据库,你现在运行在节点A,那么他的数据就存储在节点A上面的,如果这个时候你把该服务迁移到节点B去的话,那么就没有之前的数据了,因为他需要去对应的数据目录里面恢复数据,而此时没有任何数据。
一个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的方式加它暴露出来的端口来访问它。
因为这个没有配置service如果我们想本地访问测试它的话。 我们可以通过用 port-forward 来暴露它。
kubectl port-forward server-0 30000:30000
这个还没有弄过。 (如果数据库不想弄集群的话,我们可以把数据库部署成一个pod的方式。)