【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

相关文章

将Python应用部署到生产环境的小技巧分享

《将Python应用部署到生产环境的小技巧分享》文章主要讲述了在将Python应用程序部署到生产环境之前,需要进行的准备工作和最佳实践,包括心态调整、代码审查、测试覆盖率提升、配置文件优化、日志记录完... 目录部署前夜:从开发到生产的心理准备与检查清单环境搭建:打造稳固的应用运行平台自动化流水线:让部署像

Linux中Curl参数详解实践应用

《Linux中Curl参数详解实践应用》在现代网络开发和运维工作中,curl命令是一个不可或缺的工具,它是一个利用URL语法在命令行下工作的文件传输工具,支持多种协议,如HTTP、HTTPS、FTP等... 目录引言一、基础请求参数1. -X 或 --request2. -d 或 --data3. -H 或

在Ubuntu上部署SpringBoot应用的操作步骤

《在Ubuntu上部署SpringBoot应用的操作步骤》随着云计算和容器化技术的普及,Linux服务器已成为部署Web应用程序的主流平台之一,Java作为一种跨平台的编程语言,具有广泛的应用场景,本... 目录一、部署准备二、安装 Java 环境1. 安装 JDK2. 验证 Java 安装三、安装 mys

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

java中VO PO DTO POJO BO DO对象的应用场景及使用方式

《java中VOPODTOPOJOBODO对象的应用场景及使用方式》文章介绍了Java开发中常用的几种对象类型及其应用场景,包括VO、PO、DTO、POJO、BO和DO等,并通过示例说明了它... 目录Java中VO PO DTO POJO BO DO对象的应用VO (View Object) - 视图对象

Go信号处理如何优雅地关闭你的应用

《Go信号处理如何优雅地关闭你的应用》Go中的优雅关闭机制使得在应用程序接收到终止信号时,能够进行平滑的资源清理,通过使用context来管理goroutine的生命周期,结合signal... 目录1. 什么是信号处理?2. 如何优雅地关闭 Go 应用?3. 代码实现3.1 基本的信号捕获和优雅关闭3.2

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

python中的与时间相关的模块应用场景分析

《python中的与时间相关的模块应用场景分析》本文介绍了Python中与时间相关的几个重要模块:`time`、`datetime`、`calendar`、`timeit`、`pytz`和`dateu... 目录1. time 模块2. datetime 模块3. calendar 模块4. timeit

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin