StatefulSets有状态应用概念及常用操作
StatefulSets(有状态应用)
参考: https://kubernetes.io/zh/docs/concepts/workloads/controllers/statefulset/
适合发布有状态应用,比如数据库
每个pod的id和pod名称都是固定的,不管怎么调度,id和pod名称都是固定的.
存储必须由storage class 来提供;
删除或者收缩 StatefulSet 并不会删除它关联的存储卷.
有状态服务需要在本地存储持久化数据,典型的是分布式数据库的应用,分布式节点实例之间有依赖的拓扑关系.
比如:主从关系. 如果K8S停止分布式集群中任一实例pod,就可能会导致数据丢失或者集群的crash.

StatefulSet与Deployment比较


StatefulSet发布前后Pod name不变,而Deployment会变;
StatefulSet直接操作管理Pod资源,而Deployment则不会.
通过StatefulSet不能实现应用重启;
StatefulSet中要填写serviceName的根本原因是通过headless service来为StatefulSet的每个Pod提供唯一hostname
通过配置StatefulSet,可以使每个Pod对应一个独立的PVC,也可以使所有Pod共用一个PVC.
不建议在k8s中部署数据库集群的原因
- 数据库属于重量级的服务
- 集群化架构部署难度大
- 数据库是要求非常稳定的应用–三五年都不能重启
- 性能会有衰减
Statefullset部署数据库集群示例
https://www.cnblogs.com/sammyliu/p/11976202.html
k8s部署mysql8示例
k8s部署mysql8有状态应用。
创建my.cnf配置文件
my.cnf配置文件。
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
# 禁用 DNS 查询结果缓存,这对于高负载的 MySQL 服务器来说是很重要的,因为它可以减少 DNS 延迟和负载。
host_cache_size=0
# 只能用IP地址检查客户端的登录,不用主机名
skip-name-resolve
# 指定默认时区
default-time-zone='+8:00'
max_connections = 2000
# 服务端指定字符集
character-set-server=utf8mb4
secure_file_priv=/var/lib/mysql
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
# 指定客户端握手字符集
character-set-client-handshake=FALSE
创建my.cnf的configmap
创建configmap
# 使用my.cnf创建configmap
kubectl create cm mysql8.cnf --from-file my.cnf
# 查看创建的configmap
kubectl get cm mysql8.cnf -o yaml

创建有状态yml资源清单
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql8
spec:
selector:
matchLabels:
app: mysql8
serviceName: mysql8
replicas: 1
template:
metadata:
labels:
app: mysql8
spec:
# 将configmap声明到存储卷vol
volumes:
# 这个存储卷的名字
- name: mysql8cnf-vl
configMap:
name: mysql8.cnf
containers:
- name: mysql8
image: mysql:oracle
ports:
- containerPort: 3306
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD ## 配置Root用户默认密码
value: "数据库密码"
volumeMounts:
- mountPath: "/etc/my.cnf"
subPath: my.cnf
name: mysql8cnf-vl
apply资源清单;
# apply资源清单
kubectl apply -f mysql8-StatefulSets.yml
# 查看StatefulSets状态
kubectl status sts

创建svc
kubectl expose 命令不能为 StatefulSet 生成 Service,只能手写 Service的yml资源清单。
apiVersion: v1
kind: Service
metadata:
name: mysql8
spec:
selector:
app: mysql8
ports:
- port: 3306
targetPort: 3306
type: NodePort


本文介绍了Kubernetes中的StatefulSets如何用于有状态应用,特别是数据库集群的部署。StatefulSets确保了Pod的标识和存储的持久性,与Deployment相比,更适用于需要稳定状态和有序扩展的应用。文中通过示例详细讲解了如何使用StatefulSets部署MySQL8集群,包括配置文件、ConfigMap的创建,以及StatefulSet和Service的YAML资源清单。同时,讨论了在K8s中部署数据库集群的挑战和注意事项。
90

被折叠的 条评论
为什么被折叠?



