Statefulset 实战 1
上一部分与大家分享到 Statefulset 与 RplicaSet 的区别,以及 Statefulset 的特点,能做的一些事情及一些注意事项
现在我们来尝试使用 Statefulset 来部署我们的应用,我们可以需要有应用程序,然后有持久化卷
开始使用 Statefulset 部署应用
Statefulset 部署应用,我们需要完成这些资源的创建:
- 制作应用程序和镜像
- 编写 Service
- 编写 Statefulset 指定 pod 模板及挂载
制作应用程序和镜像
编写应用程序
此处我们可以制作一个应用程序,会写数据到磁盘的某个路径下面,现在就用 golang 来简单写一个 http 服务器
- 监听 8080 端口
- 提供 GET 和 POST 请求
- 收到 GET 请求的时候,读取 /var/data/stateful.txt 中的内容
- 收到 POST 请求的时候,会将请求的内容写入到 /var/data/stateful.txt 文件中
文件目录是这样的

main.go 可以分为这几个部分
- http 服务器部分
const (filePath = "/var/data/stateful.txt"fileDir = "/var/data"
)func main() {r := gin.Default()r.GET("/", func(c *gin.Context) {str, err := readFileContent(filePath)if err != nil {fmt.Println(" readFileContent err : ", err)return}//输出json结果给调用方c.JSON(200, gin.H{"message": str,})})r.POST("/", func(c *gin.Context) {buf := make([]byte, 1024)n, _ := c.Request.Body.Read(buf)fmt.Println(string(buf[0:n]))err := writeFileContent(filePath, buf[0:n])if err != nil {fmt.Println(" writeFileContent err : ", err)return}//输出json结果给调用方c.JSON(http.StatusOK, gin.H{"message": string(buf[0:n]),})})r.Run(":8080")
}
使用了 golang 中的 gin 框架,提供一个 GET 和 一个 POST 方法,GET 方法用于读取文件内容,POST 方法用于写入文件内容
- 写文件部分
func processFileErr(err error, file string) (*os.File, error) {var f *os.Fileif os.IsNotExist(err) {gErr := os.MkdirAll(fileDir, 0775)if gErr != nil {fmt.Println("MkdirAll file error : ", gErr)return nil, gErr}f, gErr = os.Create(file)if gErr != nil {fmt.Println("Create file error : ", gErr)return nil, gErr}} else {fmt.Println("OpenFile file error : ", err)return nil, err}return f, nil
}func writeFileContent(file string, content []byte) error {f, err := os.OpenFile(file, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0775)if err != nil {var pErr errorf, pErr = processFileErr(err, file)if pErr != nil {fmt.Println("processFileErr error : ", pErr)return pErr}}defer f.Close()fmt.Println("Write content : ", string(content))_, err = f.Write(content)if err != nil {fmt.Println("Write file error : ", err)return err}return nil
}
writeFileContent 方法主要是用来写入数据到文件中
processFileErr 会处理文件不存在的错误信息,同时会创建不存在的路径和文件,并返回创建文件的文件指针
- 读取文件信息部分
func readFileContent(file string) (string, error) {f, err := os.OpenFile(file, os.O_RDWR|os.O_CREATE, 0775)if err != nil {var pErr errorf, pErr = processFileErr(err, file)if pErr != nil {fmt.Println("processFileErr error : ", pErr)return "", pErr}}defer f.Close()buf := make([]byte, 1024)n, err := f.Read(buf)if err == io.EOF {return "", nil}if err != nil {fmt.Println("Read file error : ", err)}fmt.Println("read content : ", string(buf))return string(buf[0:n]), nil
}
读取文件部分,同样需要使用 processFileErr 处理文件不存在的错误信息,主要是从传入的文件中读取文件内容,以字符串的形式作为函数返回值
制作镜像
Dockerfile:
将 myhttp 可执行程序加入到镜像中
FROM node:7
ADD myhttp /myhttp
ENTRYPOINT ["./myhttp"]
执行如下指令制作镜像:
看到这里的兄弟,请将镜像传到你自己的账号下面,记得登录哦
docker build -t xiaomotong888/sta-kubia .
docker push xiaomotong888/sta-kubia
上传镜像之后,我们可以通过 docker search 账号名 来查看自己的镜像列表,看到如下内容,说明可以往下继续完成其他步骤了

编写 Service
接下来便是编写 Service 部分的清单了,我们在玩 Statefulset 管理 pod 的时候,咱们创建的是有状态的 pod,咱们还需要创建一个 headless Service 来给 pod 之间提供网络标识
例如,我们可以这样来创建
sta-service.yaml
apiVersion: v1
kind: Service
metadata:name: sta-kubia
spec:clusterIP: Noneselector:app: sta-kubiaports:- name: httpport: 80
创建的一个 Service
- 名称为 sta-kubia
- 选择的 pod 标签是 sta-kubia
- svc 集群内部的端口是 80
这里需要注意的是,我们之前写 Service 清单的时候,如果不指定 type,那么 Service 默认是 clusterIP,但是现在我们是连 clusterIP 都不想要,我们需要将 clusterIP 置为 None
通过 kubectl create -f sta-service.yaml 创建一个 Service ,可以看到 CLUSTER-IP 一栏为 None 即为正确创建好 Service


curl localhost:8001/api/v1/namespaces/default/pods/sta-kubia-0/proxy/

curl -X POST -d 'helloworld sta-kubia-0' localhost:8001/api/v1/namespaces/default/pods/sta-kubia-0/proxy/


今天就到这里,学习所得,若有偏差,还请斧正
欢迎点赞,关注,收藏
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是阿兵云原生,欢迎点赞关注收藏,下次见~
更多的可以查看 零声每晚八点直播:https://ke.qq.com/course/417774
相关文章:
Statefulset 实战 1
上一部分与大家分享到 Statefulset 与 RplicaSet 的区别,以及 Statefulset 的特点,能做的一些事情及一些注意事项 现在我们来尝试使用 Statefulset 来部署我们的应用,我们可以需要有应用程序,然后有持久化卷 开始使用 Statefuls…...
没有jodatime,rust怎么方便高效的操作时间呢?
关注我,学习Rust不迷路!! 当使用Rust进行日期操作时,可以使用 chrono 库。下面给出了二十个常见的日期操作的例子: 1. 获取当前日期和时间: use chrono::prelude::*;let current_datetime Local::now()…...
如何把pdf转成cad版本?这种转换方法非常简单
将PDF转换成CAD格式的优势在于,CAD格式通常是用于工程设计和绘图的标准格式。这种格式的文件可以在计算机上进行编辑和修改,而不需要纸质副本。此外,CAD文件通常可以与其他CAD软件进行交互,从而使得工程设计和绘图过程更加高效和精…...
MySQL常用函数方法
字符串函数 函数描述举例left(str, length)从左开始截取字符串,截取length个left(2023-08-04, 7) 2023-08right(str, length)从右开始截取字符串,截取length个 right(2023-08-04, 5) 08-04 substring(str, pos, length) substring(被截取字…...
Linux命令200例专栏导读:实用指南助你成为Linux大师
🏆作者简介,黑夜开发者,全栈领域新星创作者✌,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 🏆本文已…...
ICN6202 MIPIDSI转LVDS桥接芯片的功能及特征 调试文档资料
产品特征功能: 输入:MIPI DSI 支持MIPI D-PHY Version 1.00.00 和 MIPI DSI Version 1.02.00. 可接收MIPI DSI 18bpp RGB666 and 24bpp RGB888 packets 4 lane data1 lane clock 4对数据线可以选择1、2、3、4lane data 每对差分数据传输线最大可…...
vscode 格式问题
1、EditorConfig for VS Code 插件 shift alt f 格式化文件(VS Code格式化按键),如下图,每个缩进4空格 代码如下 创建文件名 .editorconfig root true [*] charset utf-8 indent_style space indent_size 2 end_of_…...
OPENCV C++(三)二值化灰度函数+调用摄像头+鼠标响应+肤色检测
RGB转灰度函数 cvtColor(image, gray, COLOR_BGR2GRAY); 图像 目标图像 rgb转灰度 大津法二值化函数 threshold(gray, result1, 84, 255, THRESH_OTSU); 灰度图,目标图,阈值,大于阈值的转换的像素值,方法为大津法 自适应二值…...
zabbix简易入门:基本的网络监控、WEB监控
需求背景: 我们越来越发现:网络越来越复杂,网络、应用、云端……故障点随时可能发生,而我们不能人工盯着所有的问题,所以,网管软件是必须的。那么没有预算的情况下,我们只好自己布署简单的…...
51单片机学习--DS1302可调时钟
之前学习过用定时器做的时钟,但是那样不仅误差大还费CPU,接下来利用DS1302时钟模块做一个可调实时时钟 这一次直接编写DS1302模块,首先要在DS1392.c 中根据下面的模块原理图进行位声明: sbit DS1302_SCLK P3^6; sbit DS1302_IO …...
Matlab统计字符串中共有多少种字符以及每种字符出现次数的功能实现(Matlab R2021a)
在做2023年深圳杯B题的时候,需要使用隐写技术(将特定信息嵌入信息载体且不易被察觉,可被广泛地应用于著作权保护、数据附加等领域)将《中华人民共和国著作权法》全篇10314个字符写入图片,首先我想到的是利用霍夫曼编码…...
HTTPS文件传输
目录 0.https概述1.单钥匙锁2.双钥匙锁 - 防篡改3.双钥匙锁 - 防泄漏4.单双钥匙锁相互配合 0.https概述 HTTPS其实就是HTTP协议加上TLS/SSL,SSL是个加密套件,负责对HTTP的数据进行加密,TLS是SSL的升级版,现在提到HTTPS࿰…...
LOL-v2数据集和VE-LOL数据集的区别
LOL-v2数据集和VE-LOL数据集的区别 LOL-v2 LOL-v2数据集[64]包括两个不同的子集,即LOL-v2-real和LOL-v2-synthetic。LOL-v2-real子集是通过改变ISO和曝光时间在真实场景中捕获的,包括689对用于训练和测试的图像。在LOL-v2-synthetic子集中,…...
RabbitMQ(一) - 基本结构、SpringBoot整合RabbitMQ、工作队列、发布订阅、直接、主题交换机模式
RabbitMQ结构 Publisher : 生产者 Queue: 存储消息的容器队列; Consumer:消费者 Connection:消费者与消息服务的TCP连接 Channel:信道,是TCP里面的虚拟连接。例如:电缆相当于TCP,信道是一条独立光纤束&…...
涉及IMU的专业术语
文章目录 零偏维纳过程/布朗运动随机游走航迹推算 零偏 IMU(惯性测量单元)是一种用于测量物体在空间中的加速度和角速度的装置。它通常由加速度计和陀螺仪组成,这些传感器可以帮助确定物体的运动状态和方向。 在IMU中,“零偏”&…...
二维数组对角线判断
二维数组对角线判断 对于两个点(x1, y1)和(x2, y2)。如何判断二者是否在同一条正对角线,反对角线,或者正或反对角线上? 正对角线判断 x2-x1 y2 -y1 证明:任意一点(x1k, y1k),(k…...
数据可视化(六)多个子图及seaborn使用
1.多个子图绘制 #绘制多个子图 #subplot(*args,**kwargs) 每个subplot函数只能绘制一个子图 #subplots(nrows,ncols) #fig_add_subplot(行,列,区域) #绘制子图第一种方式 plt.subp…...
opencv-34 图像平滑处理-双边滤波cv2.bilateralFilter()
双边滤波(BilateralFiltering)是一种图像处理滤波技术,用于平滑图像并同时保留边缘信息。与其他传统的线性滤波方法不同,双边滤波在考虑像素之间的空间距离之外,还考虑了像素之间的灰度值相似性。这使得双边滤波能够有…...
Leetcode 268. Missing Number
Problem Given an array nums containing n distinct numbers in the range [0, n], return the only number in the range that is missing from the array. Algorithm Sum all the numbers as x x x and use n ( n 1 ) 2 − x \frac{n(n1)}{2} - x 2n(n1)−x. Code …...
MybatisPlus实战笔记
概述 Mybatis支持定制化SQL、存储过程以及高级映射,避免几乎所有的 JDBC 代码和手动设置参数以及获取结果集。可以使用简单的 XML 或注解来配置和映射原生信息,将接口和Java的POJO映射成数据库中的记录。 缺点: SQL工作量很大,尤…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...
基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...
AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁
赛门铁克威胁猎手团队最新报告披露,数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据,严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能,但SEMR…...
Vue3中的computer和watch
computed的写法 在页面中 <div>{{ calcNumber }}</div>script中 写法1 常用 import { computed, ref } from vue; let price ref(100);const priceAdd () > { //函数方法 price 1price.value ; }//计算属性 let calcNumber computed(() > {return ${p…...
【PX4飞控】mavros gps相关话题分析,经纬度海拔获取方法,卫星数锁定状态获取方法
使用 ROS1-Noetic 和 mavros v1.20.1, 携带经纬度海拔的话题主要有三个: /mavros/global_position/raw/fix/mavros/gpsstatus/gps1/raw/mavros/global_position/global 查看 mavros 源码,来分析他们的发布过程。发现前两个话题都对应了同一…...
基于Java项目的Karate API测试
Karate 实现了可以只编写Feature 文件进行测试,但是对于熟悉Java语言的开发或是测试人员,可以通过编程方式集成 Karate 丰富的自动化和数据断言功能。 本篇快速介绍在Java Maven项目中编写和运行测试的示例。 创建Maven项目 最简单的创建项目的方式就是创建一个目录,里面…...
