为什么需要StatefulSet
ReplicaSet 通过一个 pod 模板创建多个 pod 副本。 这些副本除了它们的名字和 IP 地址不同外, 没有别的差异。如果 pod 模板里描述了一个关联到特定持久卷声明 的数据卷,那么 ReplicaSet 的所有副本都将共享这个持久卷声明 ,也就是绑定到同持久卷声明 ,也就是绑到同一个声明的持久卷
因为是在 pod 模板里关联声明的,又会依据 pod 模板创建多个 pod 副本,则不能对每个副本都指定独立的持久卷声明 。 所以也不能通过一个 ReplicaSet 来运行一个每个实例都需要独立存储的分布式数据存储服务,至少通过单个 ReplicaSet 是做不到的。
RelicaSet 或 ReplicationCon仕oiler 管理的 pod 副本都是无状态的,任何时候它们都可以被一个全新的 pod 替换。 然而有状态的 pod 需要不同的方法,当一个有状态的 pod 挂掉后 ( 或者它所在的节点故障),这个 pod 实例需要在别的节点上重建,但是新的实例必须与被替换的实例拥有相同的名称、网络 标识和状态。 这就是 StatefulSet 如何管理 pod 的。 
当一个 Statefulset 管理的一个 pod 实例消失,Statefulset 会保证重启一个新的 pod 实例替换它,这与 ReplicaSet 类似。 但与 ReplicaSet 不同的是,新的 pod 会拥有与之前 pod 完全一致的名称和主机名
缩容一个 Statefulset 将会最先删除最高索引值 的实例,所以缩容的结果是可预知的。 
像 Statefulset 创 建 pod 一样, Statefulset 也 需要创建持久卷声明 。 所以一个 Statefulset 可以拥有一个或多个卷声明模板, 这些持久卷声明会在创建 pod 前创建出来, 绑定到一个 pod 实例上。
使用StatefulSet
为了部署你的应用,需要创建两个(或三个〉不同类型的对象 :
- 存储你数据文件的持久卷(当集群不支持持久卷的动态供应时,需要手动创建)
- Statefulset 必需的一个控制 Service
- StatefulSet 本身
cat > myapp-statefulSet.yaml << EOFapiVersion: apps/v1kind: StatefulSetmetadata:name: webspec:serviceName: "web"replicas: 3selector:matchLabels:app: webtemplate:metadata:labels:app: webspec:terminationGracePeriodSeconds: 10containers:- name: nginximage: ikubernetes/myapp:v1ports:- containerPort: 80name: web---apiVersion: v1kind: Servicemetadata:name: webnamespace: defaultlabels:app: webspec:selector:app: webclusterIP: Noneports:- port: 80targetPort: 80protocol: TCPname: httpEOF


解析service
dig -t A {service}.{namespace}.svc.cluster.local @kube-dns


