[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

相关文章

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

Go语言使用select监听多个channel的示例详解

《Go语言使用select监听多个channel的示例详解》本文将聚焦Go并发中的一个强力工具,select,这篇文章将通过实际案例学习如何优雅地监听多个Channel,实现多任务处理、超时控制和非阻... 目录一、前言:为什么要使用select二、实战目标三、案例代码:监听两个任务结果和超时四、运行示例五

pandas数据的合并concat()和merge()方式

《pandas数据的合并concat()和merge()方式》Pandas中concat沿轴合并数据框(行或列),merge基于键连接(内/外/左/右),concat用于纵向或横向拼接,merge用于... 目录concat() 轴向连接合并(1) join='outer',axis=0(2)join='o

Linux线程同步/互斥过程详解

《Linux线程同步/互斥过程详解》文章讲解多线程并发访问导致竞态条件,需通过互斥锁、原子操作和条件变量实现线程安全与同步,分析死锁条件及避免方法,并介绍RAII封装技术提升资源管理效率... 目录01. 资源共享问题1.1 多线程并发访问1.2 临界区与临界资源1.3 锁的引入02. 多线程案例2.1 为

批量导入txt数据到的redis过程

《批量导入txt数据到的redis过程》用户通过将Redis命令逐行写入txt文件,利用管道模式运行客户端,成功执行批量删除以Product*匹配的Key操作,提高了数据清理效率... 目录批量导入txt数据到Redisjs把redis命令按一条 一行写到txt中管道命令运行redis客户端成功了批量删除k

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

Python标准库之数据压缩和存档的应用详解

《Python标准库之数据压缩和存档的应用详解》在数据处理与存储领域,压缩和存档是提升效率的关键技术,Python标准库提供了一套完整的工具链,下面小编就来和大家简单介绍一下吧... 目录一、核心模块架构与设计哲学二、关键模块深度解析1.tarfile:专业级归档工具2.zipfile:跨平台归档首选3.

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3