K8s- Statefulset、持久化存储06

目录

Statefulset控制器

服务类型

StatefulSet组成

Headless service

headless service作用(没有service ip的service)

volumeClaimTemplate作用

statefulset.spec字段

持久化存储

在k8s中为什么要做持久化存储

k8s支持哪些存储


Statefulset控制器

StatefulSet是为了管理有状态服务的问题而设计的

服务类型

有状态服务

StatefulSet是有状态的集合,管理有状态的服务,它所管理的Pod的名称不能随意变化。数据持久化的目录也是不一样,每一个Pod都有自己独有的数据持久化存储目录。比如MySQL主从、redis集群等。

无状态服务?

RC、Deployment、DaemonSet都是管理无状态的服务,它们所管理的Pod的IP、名字,启停顺序等都是随机的。个体对整体无影响,所有pod都是共用一个数据卷的,部署的tomcat就是无状态的服务,tomcat被删除,在启动一个新的tomcat,加入到集群即可,跟tomcat的名字无关。

StatefulSet组成

1. Headless Service:用来定义pod网络标识,生成可解析的DNS记录

2. volumeClaimTemplates:存储卷申请模板,创建pvc,指定pvc名称大小,自动创建pvc,且pvc由存储类供应。

3. StatefulSet:管理pod的

Headless service

Headless service不分配clusterIP,headless service可以通过解析service的DNS,返回所有Pod的dns和ip地址 (statefulSet部署的Pod才有DNS),普通的service,只能通过解析service的DNS返回service的ClusterIP。

headless service作用(没有service ip的service)

在使用Deployment时,创建的Pod名称是没有顺序的,是随机字符串,在用statefulset管理pod时要求pod名称必须是有序的 ,每一个pod不能被随意取代,pod重建后pod名称还是一样的。因为pod IP是变化的,所以要用Pod名称来识别。pod名称是pod唯一性的标识符,必须持久稳定有效。这时候要用到无头服务,它可以给每个Pod一个唯一的名称。

1.headless service会为service分配一个域名

.$.svc.cluster.local

K8s中资源的全局FQDN格式:

Service_NAME.NameSpace_NAME.Domain.LTD.

Domain.LTD.=svc.cluster.local. #这是默认k8s集群的域名。

FQDN 全称 Fully Qualified Domain Name

即全限定域名:同时带有主机名和域名的名称

FQDN = Hostname + DomainName

如 主机名是 duoduo

域名是 baidu.com

FQDN= duoduo.baidu.com

2.StatefulSet会为关联的Pod保持一个不变的Pod Name

statefulset中Pod的名字格式为$(StatefulSet name)-$(pod序号)

3.StatefulSet会为关联的Pod分配一个dnsName

$.$.$.svc.cluster.local

volumeClaimTemplate作用

对于有状态应用都会用到持久化存储,比如mysql主从,由于主从数据库的数据是不能存放在一个目录下的,每个mysql节点都需要有自己独立的存储空间。而在deployment中创建的存储卷是一个共享的存储卷,多个pod使用同一个存储卷,它们数据是同步的,而statefulset定义中的每一个pod都不能使用同一个存储卷,这就需要使用volumeClainTemplate,当在使用statefulset创建pod时,volumeClainTemplate会自动生成一个PVC,从而请求绑定一个PV,每一个pod都有自己专用的存储卷。Pod、PVC和PV对应的关系图如下:

K8s- Statefulset、持久化存储06_第1张图片

statefulset.spec字段

[[email protected] ~]# kubectl explain statefulset.spec

FIELDS:

   podManagementPolicy  #pod管理策略

   replicas      #副本数

   revisionHistoryLimit        #保留的历史版本

   selector     -required- #标签选择器,选择它所关联的pod

   serviceName    -required-  #headless service的名字

   template   -required-     #生成pod的模板

   updateStrategy          #更新策略

   volumeClaimTemplates <[]Object> #存储卷申请模板

注意事项

在.spec.selector中定义的标签选择器必须能够匹配到spec.template.metadata.labels里定义的Pod标签,否则Kubernetes将不允许创建statefulset。

持久化存储

在k8s中为什么要做持久化存储

 在k8s中部署的应用都是以pod容器的形式运行的,假如我们部署MySQL、Redis等数据库,需要对这些数据库产生的数据做备份。因为Pod是有生命周期的,如果pod不挂载数据卷,那pod被删除或重启后这些数据会随之消失,如果想要长久的保留这些数据就要用到pod数据持久化存储。

k8s支持哪些存储

[[email protected] ~]# kubectl explain pods.spec.volumes

常用的如下:

emptyDir

nfs

persistentVolumeClaim

glusterfs

cephfs

configMap

secret

我们想要使用存储卷,需要经历如下步骤

1、定义pod的volume,这个volume指明它要关联到哪个存储上的

2、在容器中要使用volumemounts挂载对应的存储

查看pod的UID

kubectl get pods podName -o yaml | grep uid

你可能感兴趣的:(kubernetes,java,tomcat)