有状态应用要求管理者配置文件中列出所有其它的集群成员和他们的ip地址。
StatefulSet
有状态的应用中每一个实例都是不可替代的个体,都拥有稳定的名字和状态
如果使用StatefulSet,当有一个pod挂掉后,这个实例需要在别的节点上重建,但是新的实例必须与被替换的实例拥有相同的名称、网络标识和状态。
因为有状态的服务会根据先前的访问做一些不同的处理,所以,我们要将所有的有状态的pod做headless service。当调用时,会返回每个pod的ip。
创建StatefulSet控制器管理的pod
我们首先创建数据卷
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-a
spec:
capacity:
storage: 2Mi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
storageClassName: standard
hostPath:
path: /tmp
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-b
spec:
capacity:
storage: 2Mi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
storageClassName: standard
hostPath:
path: /tmp
创建两个数据卷之后,再创建SatefulSet管理的pod
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: first-state
spec:
selector:
matchLabels:
app: myapp
serviceName: first-state
replicas: 2
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: luksa/kubia-pet
ports:
- containerPort: 8080
name: web
volumeMounts:
- name: data
mountPath: /var/data
readOnly: false
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 2Mi
创建pod
kubectl create -f statetest.yaml
查看状态
#查看数据卷的状态
kubectl get pv
#查看数据卷声明的状态
kubectl get pvc
如果此时删除一个pod
kubectl delete po first-state-0
你会发现,会自动新创建一个pod,新创建的pod和之前删除的pod名称相同。