【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

相关文章

nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析(结合应用场景)

《nginx-t、nginx-sstop和nginx-sreload命令的详细解析(结合应用场景)》本文解析Nginx的-t、-sstop、-sreload命令,分别用于配置语法检... 以下是关于 nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析,结合实际应

一文详解SpringBoot中控制器的动态注册与卸载

《一文详解SpringBoot中控制器的动态注册与卸载》在项目开发中,通过动态注册和卸载控制器功能,可以根据业务场景和项目需要实现功能的动态增加、删除,提高系统的灵活性和可扩展性,下面我们就来看看Sp... 目录项目结构1. 创建 Spring Boot 启动类2. 创建一个测试控制器3. 创建动态控制器注

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(

Redis 配置文件使用建议redis.conf 从入门到实战

《Redis配置文件使用建议redis.conf从入门到实战》Redis配置方式包括配置文件、命令行参数、运行时CONFIG命令,支持动态修改参数及持久化,常用项涉及端口、绑定、内存策略等,版本8... 目录一、Redis.conf 是什么?二、命令行方式传参(适用于测试)三、运行时动态修改配置(不重启服务