这节讲下 有状态服务应用 StatefulSet 和另外两种 Service:Headless 和 LoadBalancer 。
应用的状态有如下定义:
-
- 无状态应用(Stateless Application)是指应用不会在会话中保存下次会话所需要的客户端数据。每一个会话都像首次执行一样,不会依赖之前的数据进行响应
- 有状态的应用(Stateful Application)是指应用会在会话中保存客户端的数据,并在客户端下一次的请求中来使用那些数据
有状态应用关键点是可以复用原来的数据,而无状态应用每次都是新的状态。
Deployment 和 StatefulSet 分别应用于无状态服务应用和有状态服务应用,StatefulSet 常见的应用场景:
-
- 稳定的持久化存储,即POD重新调度后还是能访问到相同的持久化数据,基于PVC来实现
- 稳定的网络标识,即POD重新调度后其PodName 和 HostName 不变,基于 Headless Service 来实现
- 有序部署,有序扩展,即 POD 是有顺序的,在部署或者扩展的时候要依据定义的顺序依次进行(即使从0 到 N-1,在下一个Pod 运行之前所有之前的Pod必须都是Running Man和Ready状态),基于init contas来实现
- 有序收缩,有序删除(即从 N-1 到 0)
编写statefulset 资源配置文件,其中serviceName 为必填字段,关联一个Headless Service,其他配置跟deployment大同小异:
[root@ylserver10686071 ~]# cat statefulset.yml apiVersion: apps/v1 kind: StatefulSet metadata: name: stateapp namespace: prod spec: serviceName: stateapp-svc selector: matchLabels: k8s-app: stateapp replicas: 3 template: metadata: labels: k8s-app: stateapp spec: containers: - name: stateapp image: tomcat:8.0 ports: - name: stateapp-8080 containerPort: 8080 protocol: TCP
创建statefulset资源,并查看相关信息,可以看到 Pod 的名称是按照顺序命名的,不是随机生成的:
[root@ylserver10686071 ~]# kubectl apply -f statefulset.yml statefulset.apps/stateapp created [root@ylserver10686071 ~]# kubectl get statefulset -n prod -o wide NAME READY AGE CONTAINERS IMAGES stateapp 3/3 63s stateapp tomcat:8.0 [root@ylserver10686071 ~]# kubectl get pods -n prod -o wide |grep stateapp stateapp-0 1/1 Running 0 60s 10.233.72.43 ylserver10686073 <none> <none> stateapp-1 1/1 Running 0 48s 10.233.67.38 ylserver10686072 <none> <none> stateapp-2 1/1 Running 0 33s 10.233.75.66 ylserver10686071 <none> <none> [root@ylserver10686071 ~]#