k8s之StatefulSet有状态部署
目录Kubernetes 有状态应用部署StatefulSet 控制器概述示例StatefulSet 控制器:独享存储Kubernetes 有状态应用部署• 无状态与有状态• StatefulSet 控制器概述• StatefulSet 控制器:网络标识• StatefulSet 控制器:独享存储Deployment控制器设计原则:管理的所有Pod一模一样,提供同一个服务,也不考虑在哪台Node运
·
目录
Kubernetes 有状态应用部署
• 无状态与有状态
• StatefulSet 控制器概述
• StatefulSet 控制器:网络标识
• StatefulSet 控制器:独享存储
Deployment控制器设计原则:管理的所有Pod一模一样,提供同一个服务,也不考虑在哪台Node
运行,可随意扩容和缩容。这种应用称为“无状态”,例如Web服务
在实际的场景中,并不能满足所有应用,尤其是分布式应用,会部署多个实例,这些实例之间往往有
依赖关系,例如主从关系、主备关系,这种应用称为“有状态”,例如MySQL主从、Etcd集群
这时候就需要有状态部署了,有状态部署有以下几个特点:
1、每个pod角色不同(不对等)
2、pod之间有连接关系
3、每个pod都有独立的存储
StatefulSet 控制器概述
StatefulSet控制器用于部署有状态应用,满足一些有状态应用的需求:
• Pod有序的部署、扩容、删除和停止
• Pod分配一个稳定的且唯一的网络标识
• Pod分配一个独享的存储
稳定的Pod网络标识:使用Headless Service(相比普通Service只是将spec.clusterIP定义为None)来
维护Pod网络身份,会为每个Pod分配一个数字编号并且按照编号顺序部署。
在StatefulSet添加serviceName: “nginx”字段指定使用这个Headless Service。
稳定主要体现在主机名和Pod A记录:
• 主机名:<statefulset名称>-<编号>
• Pod DNS A记录:<statefulset名称-编号>.<service-name> .<namespace>.svc.cluster.local
示例
创建一个statefulSet的yaml
vi statefulSet,yamlapiVersion: apps/v1kind: StatefulSetmetadata:name: web666spec:serviceName: web666selector:matchLabels:app: web666replicas: 3template:metadata:labels:app: web666spec:containers:- name: nginximage: nginx
与deployment不同,statefulset在yaml就要指定service
创建无头service服务
vi web666
apiVersion: v1kind: Servicemetadata:name: web666namespace: defaultspec:clusterIP: Noneports:- port: 80protocol: TCPtargetPort: 80selector:app: web666type: ClusterIP
他的clusterIP为None
执行service
kubectl apply -f web666.yaml
kubectl apply -f statefulSet.yaml
创建一个测试pod
kubectl run bs --image=busybox:1.28.4 -- sleep 24h
使用
nslookup web666
可以看到,他与普通service不同,是为每一个pod起了一个单独的域名
传统的service没有
StatefulSet 控制器:独享存储
Pod独享存储:StatefulSet的存储卷使用VolumeClaimTemplate创建,称为卷申请模板,当StatefulSet
使用VolumeClaimTemplate创建一个PersistentVolume时,同样也会为每个Pod分配并创建一个编号的
PVC,每个PVC绑定对应的PV,从而保证每个Pod都拥有独立的存储。
更多推荐
已为社区贡献13条内容
所有评论(0)