【kubernetes】控制器Statefulset入门及应用

2024-09-05 13:04

本文主要是介绍【kubernetes】控制器Statefulset入门及应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一,概念

为了管理有状态服务(如数据库mysql等)的问题,采用Statefulset来管理

【有状态服务】

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

【无状态服务】

RC、Deployment、DaemonSet都是管理无状态的服务,它们所管理的Pod的IP、名字,启停顺序等都是随机的。个体对整体无影响,所有pod都是共用一个数据卷。

二,常用字段

# kubectl explain statefulsetapiVersion	<string>         #定义statefulset资源的api版本
kind	    <string>         #定义的资源类型
metadata	<Object>         #元数据
spec	    <Object>         #定义容器相关的信息
# kubectl explain statefulset.specpodManagementPolicy	 <string>   #pod管理策略
replicas	         <integer>  #副本数
revisionHistoryLimit <integer>  #保留的历史版本
selector	<Object> -required- #标签选择器,选择它所关联的pod
serviceName	<string> -required- #headless service的名字
template	<Object> -required- #生成pod的模板
updateStrategy	     <Object>   #更新策略
volumeClaimTemplates <[]Object> #存储卷申请模板
# 对于template而言,其内部定义的就是pod,pod模板是一个独立的对象
# kubectl explain statefulset.spec.templatemetadata	<Object>
spec	    <Object>  #定义容器属性的

【注意】:

  • 第一个spec声明的是statefulset定义多少个Pod副本(默认为1)、匹配Pod标签的选择器、创建pod的模板、存储卷申请模板。
  • 第二个spec是spec.template.spec:主要用于Pod里的容器属性等配置。在声明Pod对象时,要定义的各种属性,所以这部分也叫做PodTemplate(Pod模板)。
  • 在.spec.selector中定义的标签选择器,必须能够匹配到spec.template.metadata.labels里定义的Pod标签,否则Kubernetes将不允许创建statefulset。

三,案例

本案例,用于模拟部署web站点。

# cat statefulset.yaml apiVersion: v1                   # 定义api版本
kind: Service                    # 定义要创建的资源:service
metadata: name: nginx                    # 定义service的名字labels:app: nginx                  # service的标签
spec:ports:- port: 80name: webclusterIP: None                # 创建一个没有ip的serviceselector:app: nginx                   # 选择拥有app=nginx标签的pod
---
apiVersion: apps/v1
kind: StatefulSet
metadata: name: web
spec:selector:matchLabels:app: nginxserviceName: "nginx"              # headless service的名字(上方创建的service的名字)replicas: 2                       # 副本数template:                         # 定义pod的模板metadata: labels:app: nginxspec: containers:- name: nginximage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80name: webvolumeMounts:- name: wwwmountPath: /usr/share/nginx/htmlvolumeClaimTemplates:             # 存储卷申请模板- metadata:name: wwwspec:accessModes: ["ReadWriteOnce"]storageClassName: "nfs"       # 指定从哪个存储类申请pvresources:requests: storage: 1Gi              # 需要1G的pvc,会自动跟符合条件的pv绑定 

创建kubectl apply -f statefulset.yaml 后,查看如下资源是否创建成功:

# 查看statefulset是否创建成功
kubectl get statefulset# 查看是否是有序的pod
kubectl get pods -l app=nginx#查看pvc
kubectl get pvc#查看pv
kubectl get pv

【备注】:

StatefulSet由以下几个部分组成:

  1. Headless Service:用来定义pod网路标识,生成可解析的DNS记录
  2. volumeClaimTemplates:存储卷申请模板,创建pvc,指定pvc名称大小,自动创建pvc,且pvc由存储类供应。
  3. StatefulSet:管理pod的

Statefulset总结:

1、Statefulset管理的pod,pod名字是有序的,由statefulset的名字-0、1、2这种格式组成
2、创建statefulset资源前,必须先创建出一个service。

  • 如果创建的service没有ip,那对这个service做dns解析,会找到它所关联的所有pod ip;
  • 如果创建的service有ip,那对这个service做dns解析,会解析到service本身ip;

3、在管理的pod中,删除pod后再新创建,pod名字跟删除的pod名字一样。
4、statefulset具有字段volumeclaimtemplate(卷申请模板),它会自动创建已绑定的pv和pvc
5、创建的pod,数据目录是独享的。
6、关联的Pod分配一个dnsName,域名组成:pod-name.svc-name.svc-namespace.svc.cluster.local

【扩展】:

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

(2)K8s中资源的全局FQDN格式:
Service_NAME.NameSpace_NAME.Domain.LTD.
Domain.LTD.=svc.cluster.local.     #这是默认k8s集群的域名。

FQDN( 全称 Fully Qualified Domain Name),即全限定域名:同时带有主机名和域名的名称
FQDN = Hostname + DomainName
(例如: 主机名是 boke ,域名是 baidu.com,则FQDN= boke.baidu.com)

这篇关于【kubernetes】控制器Statefulset入门及应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

从入门到精通详解Python虚拟环境完全指南

《从入门到精通详解Python虚拟环境完全指南》Python虚拟环境是一个独立的Python运行环境,它允许你为不同的项目创建隔离的Python环境,下面小编就来和大家详细介绍一下吧... 目录什么是python虚拟环境一、使用venv创建和管理虚拟环境1.1 创建虚拟环境1.2 激活虚拟环境1.3 验证虚

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

PostgreSQL简介及实战应用

《PostgreSQL简介及实战应用》PostgreSQL是一种功能强大的开源关系型数据库管理系统,以其稳定性、高性能、扩展性和复杂查询能力在众多项目中得到广泛应用,本文将从基础概念讲起,逐步深入到高... 目录前言1. PostgreSQL基础1.1 PostgreSQL简介1.2 基础语法1.3 数据库

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

Python中yield的用法和实际应用示例

《Python中yield的用法和实际应用示例》在Python中,yield关键字主要用于生成器函数(generatorfunctions)中,其目的是使函数能够像迭代器一样工作,即可以被遍历,但不会... 目录python中yield的用法详解一、引言二、yield的基本用法1、yield与生成器2、yi

Python多线程应用中的卡死问题优化方案指南

《Python多线程应用中的卡死问题优化方案指南》在利用Python语言开发某查询软件时,遇到了点击搜索按钮后软件卡死的问题,本文将简单分析一下出现的原因以及对应的优化方案,希望对大家有所帮助... 目录问题描述优化方案1. 网络请求优化2. 多线程架构优化3. 全局异常处理4. 配置管理优化优化效果1.

Java List 使用举例(从入门到精通)

《JavaList使用举例(从入门到精通)》本文系统讲解JavaList,涵盖基础概念、核心特性、常用实现(如ArrayList、LinkedList)及性能对比,介绍创建、操作、遍历方法,结合实... 目录一、List 基础概念1.1 什么是 List?1.2 List 的核心特性1.3 List 家族成

从基础到高阶详解Python多态实战应用指南

《从基础到高阶详解Python多态实战应用指南》这篇文章主要从基础到高阶为大家详细介绍Python中多态的相关应用与技巧,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、多态的本质:python的“鸭子类型”哲学二、多态的三大实战场景场景1:数据处理管道——统一处理不同数据格式

c++日志库log4cplus快速入门小结

《c++日志库log4cplus快速入门小结》文章浏览阅读1.1w次,点赞9次,收藏44次。本文介绍Log4cplus,一种适用于C++的线程安全日志记录API,提供灵活的日志管理和配置控制。文章涵盖... 目录简介日志等级配置文件使用关于初始化使用示例总结参考资料简介log4j 用于Java,log4c