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,只能手写 Serviceyml资源清单

apiVersion: v1
kind: Service
metadata:
  name: mysql8
spec:
  selector:
    app: mysql8
  ports:
    - port: 3306
      targetPort: 3306
  type: NodePort

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

识途老码

赞赏是第一生产力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值