[Kubernetes]5. k8s集群StatefulSet详解,以及数据持久化(SC PV PVC)

本文主要是介绍[Kubernetes]5. k8s集群StatefulSet详解,以及数据持久化(SC PV PVC),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前面通过deployment结合service来部署无状态的应用,下面来讲解通过satefulSet结合service来部署有状态的应用

一.StatefulSet详解

1.有状态和无状态区别

  • 无状态: 无状态(stateless)、牲畜(cattle)、无名(nameless)、可丢弃(disposable)
  • 有状态: 有状态(stateful)、宠物(pet)、具有名(haviing name)、不可丢弃(non-disposable)
  • StatefulSet是用来管理有状态的应用,例如数据库
  • 前面部署的应用,都是不需要存储数据,不需要记住状态的,可以随意扩充副本,每个副本都是一样的可替代的,这时候可以通过deployment结合service来部署
  • 而像数据库、Redis这类有状态的,并且有数据的应用,则不能随意扩充副本,这时候就需要通过statefulSet结合service来部署
  • StatefulSet 会固定每个 Pod 的名字

2.statefulset的组成

  • headless service 用于定义网络标识(DNS
  • StatefulSet 控制器,用于定义具体应用
  • volumeClaimTemplate 存储卷申请模板,用于创建PV,保证数据库的持久化操作

下面就来通过statefulSet结合service部署一个Mongodb

3.创建 Service部署StatefulSet类型的Mongodb

定义一个mongo.yaml,这个yaml和deployment.yaml类似,如下:

  • 下面yaml中的 --- 表示:把多个配置文件放在一个yaml中,下面就是把kind为StatefulSet类型的mongo.yaml和service.yaml放在同一个文件中,当然也可以拆分开来
apiVersion: apps/v1
#类型statefulSet
kind: StatefulSet
metadata:#部署的名字name: mongodb
spec:serviceName: mongodb #必须设置,和下面的name保持一致#创建Pod的副本数replicas: 2#定义标签选择器:定义Deployment如何找到要管理的Pod,与template的label(标签)对应selector:matchLabels:app: mongodb #需要和下面的labels统一,进行关联#定义 Pod 相关数据template:metadata:labels:app: mongodb #指定该资源的内容spec:# 定义容器,可以多个containers:- name: mongo # 容器名字image: mongo # 镜像# [Always | Never | IfNotPresent] #获取镜像的策略 Alawys表示下载镜像 IfnotPresent表示优先使用本地镜像,否则下载镜像,Nerver表示仅使用本地镜像imagePullPolicy: IfNotPresent
---
apiVersion: v1
#类型Service
kind: Service
metadata:#部署的服务名字,这个可以随意name: mongodb
spec:selector:app: mongodb #需要mongdb.yaml中,也就是上面的pod中的template中定义的metadata.labels.app名称统一,这样mongodb和service才能相互找到type: ClusterIP  #默认类型,自动分配一个仅Cluster内部可以访问的虚拟IP,当外部访问项目时,自动分配一个虚拟的pod ip,达到负载均衡操作,下面详细讲解#HeadLess: 不分配IP地址clusterIP: Noneports:- port: 27017 #本 Service 的端口targetPort: 27017 # 容器端口

 拆分开来的文件如下:

mongo.yaml

apiVersion: apps/v1
#类型statefulSet
kind: StatefulSet
metadata:#部署的名字name: mongodb
spec:serviceName: mongodb #必须设置,和下面的name保持一致#创建Pod的副本数replicas: 2#定义标签选择器:定义Deployment如何找到要管理的Pod,与template的label(标签)对应selector:matchLabels:app: mongodb #需要和下面的labels统一,进行关联#定义 Pod 相关数据template:metadata:labels:app: mongodb #指定该资源的内容spec:# 定义容器,可以多个containers:- name: mongo # 容器名字image: mongo # 镜像# [Always | Never | IfNotPresent] #获取镜像的策略 Alawys表示下载镜像 IfnotPresent表示优先使用本地镜像,否则下载镜像,Nerver表示仅使用本地镜像imagePullPolicy: IfNotPresent

service.yaml

apiVersion: v1
#类型Service
kind: Service
metadata:#部署的服务名字,这个可以随意name: mongodb
spec:selector:app: mongodb #需要mongdb.yaml中,也就是上面的pod中的template中定义的metadata.labels.app名称统一,这样mongodb和service才能相互找到type: ClusterIP  #默认类型,自动分配一个仅Cluster内部可以访问的虚拟IP,当外部访问项目时,自动分配一个虚拟的pod ip,达到负载均衡操作,下面详细讲解#HeadLess: 不分配IP地址clusterIP: Noneports:- port: 27017 # 本 Service 的端口targetPort: 27017 # 容器端口

mongo.yaml和deployment.yaml的区别

  • kind不同:deployment.yaml的kind为Deployment,mongo.yaml的kind为StatefulSet
  • mongo.yaml的spec的serverName必须配置,必须和service名字统一起来,这样才能关联
  • mongo.yaml的service.yaml的type必须是ClusterIP(集群内部访问),访问的时候是没有IP地址的,故需设置ClusterIP:none.当然,type类型也可以是NodePort,这样就可以在外部进行端口映射访问操作

4.部署mongo.yaml

(1).先删除其他无用的配置

该操作可以执行,也可以不执行

(2).创建mongo.yaml 

vi .mongo.yaml,然后把上面的配置复制进入即可

[root@node1 ~]# cat  mongo.yaml 
apiVersion: apps/v1
#类型statefulSet
kind: StatefulSet
metadata:#部署的名字name: mongodb
spec:serviceName: mongodb #必须设置,和下面的name保持一致#创建Pod的副本数replicas: 2#定义标签选择器:定义Deployment如何找到要管理的Pod,与template的label(标签)对应selector:matchLabels:app: mongodb #需要和下面的labels统一,进行关联#定义 Pod 相关数据template:metadata:labels:app: mongodb #指定该资源的内容spec:# 定义容器,可以多个containers:- name: mongo # 容器名字image: mongo # 镜像

这篇关于[Kubernetes]5. k8s集群StatefulSet详解,以及数据持久化(SC PV PVC)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/586078

相关文章

Debezium 与 Apache Kafka 的集成方式步骤详解

《Debezium与ApacheKafka的集成方式步骤详解》本文详细介绍了如何将Debezium与ApacheKafka集成,包括集成概述、步骤、注意事项等,通过KafkaConnect,D... 目录一、集成概述二、集成步骤1. 准备 Kafka 环境2. 配置 Kafka Connect3. 安装 D

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

Spring Cloud LoadBalancer 负载均衡详解

《SpringCloudLoadBalancer负载均衡详解》本文介绍了如何在SpringCloud中使用SpringCloudLoadBalancer实现客户端负载均衡,并详细讲解了轮询策略和... 目录1. 在 idea 上运行多个服务2. 问题引入3. 负载均衡4. Spring Cloud Load

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

在 Spring Boot 中使用 @Autowired和 @Bean注解的示例详解

《在SpringBoot中使用@Autowired和@Bean注解的示例详解》本文通过一个示例演示了如何在SpringBoot中使用@Autowired和@Bean注解进行依赖注入和Bean... 目录在 Spring Boot 中使用 @Autowired 和 @Bean 注解示例背景1. 定义 Stud

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I

Go路由注册方法详解

《Go路由注册方法详解》Go语言中,http.NewServeMux()和http.HandleFunc()是两种不同的路由注册方式,前者创建独立的ServeMux实例,适合模块化和分层路由,灵活性高... 目录Go路由注册方法1. 路由注册的方式2. 路由器的独立性3. 灵活性4. 启动服务器的方式5.

Java中八大包装类举例详解(通俗易懂)

《Java中八大包装类举例详解(通俗易懂)》:本文主要介绍Java中的包装类,包括它们的作用、特点、用途以及如何进行装箱和拆箱,包装类还提供了许多实用方法,如转换、获取基本类型值、比较和类型检测,... 目录一、包装类(Wrapper Class)1、简要介绍2、包装类特点3、包装类用途二、装箱和拆箱1、装

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要