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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/23551.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cocos creator(2d) 使用 shader + uv 实现单张图片衔接滚动效果

在游戏中,当我们需要让背景图片无缝衔接无限滚动时(打飞机这种背景一直滚动,或者肉鸽游戏地图一直在走等等),通常的做法是 在游戏中放两个背景node,在update中控制这两张背景图片的移动,并让其收尾衔接即可。(具体代码…

奥威BI系统|秒分析,更适合分析大数据

根据以往的经验,当数据量多到一定程度就容易导致系统卡顿、崩溃。这种现象给企业级数据分析造成了极大的困扰。随着业务发展扩大和分析需求精细化,企业需要一套能秒分析大数据的系统。而奥威BI系统就是这样一款可以秒分析大数据的商业智能系统。 奥威BI…

考研408 | 【计算机网络】概述

计算机网络体系结构 计算机网络概述:1.概念,组成,功能,分类2.标准化工作及相关组织3.性能指标体系结构&参考模型:1.分层结构2.协议,接口,服务3.ISO/OSI模型4.TCP/IP模型 目录 计算机网络体…

外卖多门店小程序开源版开发

外卖多门店小程序开源版开发 外卖多门店小程序开源版的开发可以按照以下步骤进行: 确定需求:明确外卖多门店小程序的功能和特点,包括用户注册登录、浏览菜单、下单支付、订单管理等。技术选型:选择适合开发小程序的技术框架&…

七、Spring 面向切面编程(AOP)学习总结

文章目录 一、初识面向切面编程(AOP)1.1 什么是 AOP1.2 AOP的应用场景1.3 Aop 在 Spring 中的作用1.3.1 Aop 的核心概念 1.4 使用 Spring 实现 AOP1.4.1 方式一:使用 Spring API 接口实现 AOP 【主要是SpringAPI接口实现】1.4.2 方式二&#…

掌握主动权:职场中如何主动寻找并拓宽工作领域

引言 在现代职场的竞争环境中,主动性是一种重要的优势。对于企业而言,员工的主动性是其成功的关键因素之一。而对于个人职业发展来说,主动性能帮助我们把握更多的机会,提升我们的职业能力。因此,学会在职场中主动寻找…

mybatisJava对象、list和json转换

1. 参考mybatis-plus mybatis Java对象、list和json转换 网上好多不靠谱,参考mybatis-plus中TableField,mybatis中自定义实现 这样不需要对象中属性字符串接收,保存到表中,都是转义字符,使用时还要手动转换为对象或者…

车载总线系列——J1939三

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人…

Golang之路---04 并发编程——信道/通道

信道/通道 如果说 goroutine 是 Go语言程序的并发体的话,那么 channel(信道) 就是 它们之间的通信机制。channel,是一个可以让一个 goroutine 与另一个 goroutine 传输信息的通道,我把他叫做信道,也有人将…

PLC4X踩坑记录

plc4x引起的oom 使用Jprofiler查看dump文件 由上可以看出有大量的NioEventLoop对象没有释放 PlcConnection#close 设备断连重连后导致的oom,看源码close方法主要是channel通道关闭。 修改NettyChannelFactory源码 plc4x设计思想是一个设备一个连接,…

k8s ingress获取客户端客户端真实IP

背景 在Kubernetes中,获取客户端真实IP地址是一个常见需求。这是因为在负载均衡架构中,原始请求的源IP地址会被替换成负载均衡器的IP地址。 获取客户端真实IP的需求背景包括以下几点: 安全性:基于客户端IP进行访问控制和认证授…

工厂模式(C++)

定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟(目的:解耦,手段:虚函数)到子类。 应用场景 在软件系统中,经常面临着创建对象的工作;由于需求的变化,需要创建的对象的具体类…

Spring Boot、Spring Cloud、Spring Alibaba 版本对照关系及稳定兼容版本

Spring Boot、Spring Cloud、Spring Alibaba 版本对照关系及稳定兼容版本 引言 在 Java 生态系统中,Spring Boot、Spring Cloud 和 Spring Alibaba 是非常流行的框架,它们提供了丰富的功能和优雅的解决方案。然而,随着不断的发展和更新&…

【ARM Coresight 系列文章 2.3 - Coresight 寄存器】

文章目录 Coresight 寄存器介绍1.1 ITCTRL,integration mode control register1.2 CLAIM寄存器1.3 DEVAFF(Device Affinity Registers)1.4 LSR and LAR1.5 AUTHSTATUS(Authentication Status Register) Coresight 寄存器介绍 Coresight 对于每个 coresight 组件&am…

架构训练营学习笔记:5-3接口高可用

序 架构决定系统质量上限,代码决定系统质量下限,本节课串一下常见应对措施的框架,细节不太多,侧重对于技术本质有深入了解。 接口高可用整体框架 雪崩效应:请求量超过系统处理能力后导致系统性能螺旋快速下降 链式…

STM32CubeMx之FreeRTOS的中断优先级+配置

编译运行即可 例如我编写的是一个灯亮500ms 一个等200ms的亮灭 如果他们的优先级是同等的,那么任务都可以实现,时间片会自动切换 但是如果亮500ms的灯 任务优先级更高 还用HALdelay的话 就会让任务二饿死,从而就会只看到任务一的内容 解…

回归预测 | MATLAB实现SO-CNN-BiGRU蛇群算法优化卷积双向门控循环单元多输入单输出回归预测

回归预测 | MATLAB实现SO-CNN-BiGRU蛇群算法优化卷积双向门控循环单元多输入单输出回归预测 目录 回归预测 | MATLAB实现SO-CNN-BiGRU蛇群算法优化卷积双向门控循环单元多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现SO-CNN-BiGRU蛇群算法…

Cilium系列-13-启用XDP加速及Cilium性能调优总结

系列文章 Cilium 系列文章 前言 将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能. 但是通过对 Cilium 不同模式的切换/功能的启用, 可以进一步提升 Cilium 的网络性能. 具体调优项包括不限于: 启用本地路由(Native Routing)完全替换 KubeProx…

什么是微服务

微服务的架构特征: 单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责自治:团队独立、技术独立、数据独立,独立部署和交付面向服务:服务提供统一标准的接口&#xff0…

九、pig安装

1.上传pig包 2.解压文件 3.改名 4.赋权 5.配置环境变量 export PIG_HOME/usr/local/pig export PATH$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HIVE_HOME/bin:$HBASE_HOME/bin:$SQOOP_HOME/bin:$PIG_HOME/bin 6.测试