一、概念
1.1.无状态和有状态的区别
主要从网络和存储来对比
无状态不考虑存储和网络,可以任意漂移,每个副本是一样的,如nginx
有状态应用需要考虑存储和网络,每个副本是不对等的,具有唯一的id,如etcd、mysql
1.2.statefulset的特点
专为部署有状态服务而生
解决pod独立生命周期,保持pod启动顺序和唯一性
应用场景:分布式应用、数据库集群
稳定,唯一的网络标识符,持久存储
有序,优雅的部署和扩展、删除、终止
有序,滚动更新
1.3.headless service
也是一种service,但不需要cluster ip,需要设置clusterip: none
1.4.servicename
告诉statefulset要使用servicename指定的headless service来保证pod的身份
1.5.稳定的存储
存储卷使用volumeclaimtemplates创建,称为卷申请模板;当创建一个pv时,同样会为每个pod分配并且创建一个编号pvc
二、实例
拿nginx测试,主要演示yaml的写法,实际应用中需用有状态服务
2.1.statefulset.yaml
apiversion: apps/v1
kind: statefulset
metadata:
labels:
app: web
name: web
spec:
replicas: 3
selector:
matchlabels:
app: web
servicename: "headless-web"
template:
metadata:
labels:
app: web
spec:
containers:
- image: nginx
imagepullpolicy: ifnotpresent
name: web
ports:
- containerport: 8080
volumemounts:
- name: www
mountpath: /usr/share/nginx/html
volumeclaimtemplates:
- metadata:
name: www
spec:
storageclassname: "managed-nfs-storage"
accessmodes: [ "readwriteonce" ]
resources:
requests:
storage: 1gi
设置了3个副本,从0开始标号,创建3个副本

自动创建pv和pvc


2.2.headless-svc.yaml
apiversion: v1
kind: service
metadata:
name: headless-web
spec:
clusterip: none
ports:
- port: 80
protocol: tcp
selector:
app: web
cluster-ip为none

启动一个busybox的pod
kubectl run test -it --rm --image=busybox -- sh nslookup headless-web
域名解析结果

在容器里可以通过<pod name>.<headless service>访问
curl web-0.headless-web

参考视频:https://ke.qq.com/user/index/index.html#/plan/cid=1709963&term_id=102815140
到此这篇关于k8s之statefulset有状态服务详解的文章就介绍到这了,更多相关k8s statefulset有状态服务内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论