k8s之有状态应用
一.StatefulSet(一)StatefulSet 是用来管理有状态应用的工作负载 API 对象。实例之间有不对等关系,以及实例对外部数据有依赖关系的应用,称为“有状态应用”(二)StatefulSet 用来管理 Deployment 和扩展一组 Pod,并且能为这些 Pod 提供序号和唯一性保证。(三)StatefulSets 对于需要满足以下一个或多个需求的应用程序很有价值:1.稳定的、唯
一.StatefulSet
(一)StatefulSet 是用来管理有状态应用的工作负载 API 对象。实例之间有不对等关系,以及实例对外部数据有依赖关系的应用,称为“有状态应用”
(二)StatefulSet 用来管理 Deployment 和扩展一组 Pod,并且能为这些 Pod 提供序号和唯一性保证。
(三)StatefulSets 对于需要满足以下一个或多个需求的应用程序很有价值:
1.稳定的、唯一的网络标识符。
2.稳定的、持久的存储。
3.有序的、优雅的部署和缩放。
4.有序的、自动的滚动更新
二.拓扑状态
apiVersion: v1 #创建Headless service
kind: Service
metadata:
name: nginx-svc
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1 #StatefulSet控制器
kind: StatefulSet
metadata:
name: web
spec:
serviceName: "nginx-svc"
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: myapp:v1
ports:
- containerPort: 80
name: web
三.有状态应用
(一)StatefulSet将应用状态抽象成了两种情况:
拓扑状态:应用实例必须按照某种顺序启动。新创建的Pod必须和原来Pod的网络标识一样
存储状态:应用的多个实例分别绑定了不同存储数据
(二)StatefulSet给所有的Pod进行了编号,编号规则是:
(
s
t
a
t
e
f
u
l
s
e
t
名
称
)
−
(statefulset名称)-
(statefulset名称)−(序号),从0开始
(三)删除时,将副本数改为0,Pod被删除后重建,重建Pod的网络标识也不会改变,Pod的拓扑状态按照Pod的“名字+编号”的方式固定下来,并且为每个Pod提供了一个固定且唯一的访问入口,即Pod对应的DNS记录
dig -t A nginx-svc.default.svc.cluster.local @10.96.0.10
StatefulSet如何通过Headless Service维持Pod的拓扑状态
四.存储状态
PV和PVC的设计,使得StatefulSet对存储状态的管理成为了可能
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: "nginx-svc"
replicas: 2 #通过副本数扩容或删除
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: myapp:v1
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
storageClassName: managed-nfs-storage
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
Pod的创建也是严格按照编号顺序进行的。比如在web-0进入到running状态,并Conditions为Ready之前,web-1一直会处于pending状态
StatefulSet还会为每一个Pod分配并创建一个同样编号的PVC。这样,kubernetes就可以通过Persistent Volume机制为这个PVC绑定对应的PV,从而保证每一个Pod都拥有一个独立的Volume
五.使用statefullset部署mysql主从集群
参考
StatefulSet
先拉取所需镜像,上传至本地仓库,使用时注意镜像位置
通过xtrabackup备份主库数据,实现单线条主从数据库
更多推荐
所有评论(0)