statefulset
statufulset
【statfulset是什么】
RC,deployment,Daemonset都是面向无服务状态的服务,他们所管理的pod的ip,名字,启停顺序都是随机的,而statfulset则是面向有状态集群的,例如mysql和mongobe集群等。
statefulset本质上是deployment的一种变体,它所管理的pod拥有固定的pod名称,启动停止顺序,在statfulset中,pod的名字称之为(hostname)网络标识,还必须用到共享存储。statefulset中与之对应的headless service相当于,deployment对应的service,headless service即无头服务与service的区别就是没有cluster ip,解析它的名称将返回该headless service对应的全部pod的endpoint列表
statfulset在headless service的基础上又为statefulset控制器的每个pod副本创建了一个dns域名。格式为:(podname).(headless server name)
【为什么需要headless service无头服务和】
在deployment时,每个pod的名称没有顺序,是随机字符串,因此是pod名称是无序的,重建后的pod ip是变化的,但是名称还是一样,所以是按pod的名称来识别,pod名称是pod唯一性的标识符。必须持久稳定有效。
【为什么需要volumeClaimTemplate】
在所有有状态集群当中,每个副本集是共用一个存储卷,数据是相同的,因为是基于模板来,每个pod都要有自己专有的存储卷,所以statefulset存储卷就不能再用pod模板来创建,所以要使用volumeClaimTemplate,称之为申请卷模板,它会为每个不同的pod生成pvc,绑定pv。
【一】创建statefulset
创建statefulset资源对象,statefulset和deployments的yaml文件差别不大,就是多了个serviceName需要设置
apiVersion: apps/v1
kind: Statefulset
metadata:
name: ning #设置statefuleset名称
spec:
serviceName: "ning" #这里一定要设置服务的名,这个服务的名称会和pod的名称组合起来形成这个服务的域名
replicas: 2
selector:
matchLabels:
app: qwe
template:
metadata:
labels:
app: qwe
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
上面的服务一定要有servie先为基础,内容中的service的名称指定为service的名称
#######################然后还要创建service供外部访问####################

创建完service查看endpoints
会发现service并没有配置clusterip,没有给集群的其他服务访问的ip

但实际上其他集群可以通它的域名进行访问
statefulset的域名由.构成
进入其他的pod中的容器,可以使用dns解析,如果是可以curl访问的服务,可以用curl
进行访问配置的服务

访问成功即可
如果设置了pvc那还会添加序列号,来增加卷,pvc来实现持久化存储
【二】
statefulset的更新策略
deployments和statefulset的更新策略有区别
在statefulset的更新策略分别是OnDelete,RollingUpdate,Partitions
1,OnDelete是通过spec.updateStragey.type字段设置为OnDelet,statefulset控制器不会自动更新statefulset中的pod,用户必须手动删除pod,以使控制器创建新的pod。(更新statefulset以更新pod,删除pod,重新创建的pod就是新的版本)
2,RollingUpdate是通过spec.updateStragy.type字段设置为RollingUpdate,实现了pod的自动滚动更新。如果Stragy没有指定任何策略的话,默认就是此策略
3,partitions通过指定spec.updateStrategy.rollingUpdate.partition对于RollingUpdate更新策略进行分区,含义大概就是如果stateful当前的副本数为5个,那么pod的id就是0-4,这是partition会被定义为partition=4,代表更新只有大于等于4才会更新,所以就只有pod-4被更新了,更新完毕后,如果返现pod-4工作一切正常,那partition会自动调整为partition=0,这样所有的pod就都被更新了。(partitions是在rollingupdate下设置的)


浙公网安备 33010602011771号