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