无状态与有状态:
Deployment控制器设计原则:管理的所有pod一模一样,提供同一个服务,也不考虑在哪台node运行,可以随意扩容和缩容。这种应用称为无状态,例如web服务
在实际场景中,这并不能满足所有应用,尤其是分布式应用,会部署多个实例,这些实例之间往往有依赖关系,例如主从关系,主备关系,这种应用称为有状态,如 mysql主从,etcd集群
StatefulSet特点:
部署有状态应用
解决pod独立生命周期,保持Pod启动顺序和唯一性
1.稳定,唯一的网络标识符,持久存储
2.有序,优雅的部署和扩展,删除和终止
3.有序,滚动更新
应用场景:分布式应用和数据库集群
1.0创建一个动态pv供给
#这里用nfs动态pv供给
vim deployment.yaml
修改镜像和nfs服务器Ip地址
kubectl apply -f . #启动组件
如图说明启动完成
使用StatefulSetk部署应用
apiVersion: apps/v1
kind: StatefulSet
metadata:
labels:
app: sts
name: sts
spec:
serviceName: "sts"
replicas: 2
selector:
matchLabels:
app: sts
template:
metadata:
labels:
app: sts
spec:
containers:
- image: nginx
name: nginx
resources: {}
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates: #定义模板官网有链接
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "managed-nfs-storage"
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: Service
metadata:
labels:
app: sts
name: sts
spec:
clusterIP: None #定义
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: sts
status:
loadBalancer: {}
每个pod副本会有一个独立的命名空间和独立的存储无ip
statefulset与deployment区别:
1. 域名
2. 主机名
3. 存储(PVC)