【k8s 系列】k8s 学习二十六-3,Statefulset 实战 1

简介: 上一部分与大家分享到 Statefulset 与 RplicaSet 的区别,以及 Statefulset 的特点,能做的一些事情及一些注意事项

【k8s 系列】k8s 学习二十六-3,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  文件中

文件目录是这样的

image.png

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.File
  if 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 error
    f, 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 error
    f, 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 可执行程序加入到镜像中

dockerfile

FROM node:7
ADD myhttp /myhttp
ENTRYPOINT ["./myhttp"]

执行如下指令制作镜像:

看到这里的兄弟,请将镜像传到你自己的账号下面,记得登录哦

docker build -t xiaomotong888/sta-kubia .
docker push xiaomotong888/sta-kubia

上传镜像之后,我们可以通过 docker search 账号名 来查看自己的镜像列表,看到如下内容,说明可以往下继续完成其他步骤了

image.png

编写 Service

接下来便是编写 Service 部分的清单了,我们在玩 Statefulset 管理 pod 的时候,咱们创建的是有状态的 pod,咱们还需要创建一个 headless Service 来给 pod 之间提供网络标识

例如,我们可以这样来创建

sta-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: sta-kubia
spec:
  clusterIP: None
  selector:
    app: sta-kubia
  ports:
  - name: http
    port: 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


image.png

image.png


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/

default/pods/sta-kubia-0/proxy/

image.png

image.png

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

image.png

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~


相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
6月前
|
存储 Kubernetes 监控
K8s集群实战:使用kubeadm和kuboard部署Kubernetes集群
总之,使用kubeadm和kuboard部署K8s集群就像回归童年一样,简单又有趣。不要忘记,技术是为人服务的,用K8s集群操控云端资源,我们不过是想在复杂的世界找寻简单。尽管部署过程可能遇到困难,但朝着简化复杂的目标,我们就能找到意义和乐趣。希望你也能利用这些工具,找到你的乐趣,满足你的需求。
597 33
|
11月前
|
存储 Kubernetes 持续交付
k8s学习
【10月更文挑战第1天】
400 4
|
7月前
|
人工智能 Kubernetes 异构计算
大道至简-基于ACK的Deepseek满血版分布式推理部署实战
大道至简-基于ACK的Deepseek满血版分布式推理部署实战
373 5
|
7月前
|
Kubernetes 持续交付 数据库
阿里云ACK+GitLab企业级部署实战教程
GitLab 是一个功能强大的基于 Web 的 DevOps 生命周期平台,整合了源代码管理、持续集成/持续部署(CI/CD)、项目管理等多种工具。其一体化设计使得开发团队能够在同一平台上进行代码协作、自动化构建与部署及全面的项目监控,极大提升了开发效率和项目透明度。 GitLab 的优势在于其作为一体化平台减少了工具切换,高度可定制以满足不同项目需求,并拥有活跃的开源社区和企业级功能,如高级权限管理和专业的技术支持。借助这些优势,GitLab 成为许多开发团队首选的 DevOps 工具,实现从代码编写到生产部署的全流程自动化和优化。
|
7月前
|
人工智能 Kubernetes 异构计算
大道至简-基于ACK的Deepseek满血版分布式推理部署实战
本教程演示如何在ACK中多机分布式部署DeepSeek R1满血版。
|
11月前
|
存储 Kubernetes 调度
|
10月前
|
Kubernetes 监控 安全
容器化技术:Docker与Kubernetes的实战应用
容器化技术:Docker与Kubernetes的实战应用
|
10月前
|
存储 Kubernetes Devops
Kubernetes集群管理和服务部署实战
Kubernetes集群管理和服务部署实战
210 0
|
10月前
|
存储 Kubernetes 调度
【赵渝强老师】K8s中Deployment控制器与StatefulSet控制器的区别
K8s中的Deployment控制器用于管理无状态应用程序,关注Pod数量、更新方式等;而StatefulSets控制器则管理有状态应用程序,提供持久存储和唯一标识符,适用于需要稳定网络标识符和持久化存储的场景。两者的主要区别在于是否维护状态和顺序。
308 0
|
10月前
|
存储 Kubernetes 调度
【赵渝强老师】K8s的有状态控制器StatefulSet
在Kubernetes中,StatefulSets用于部署有状态应用程序,提供持久存储和唯一标识符。与Deployment不同,StatefulSets确保Pod的标识符在重新调度后保持不变,适用于需要稳定网络标识符和持久存储的场景。本文介绍了StatefulSets的创建、扩容与缩容、更新与回滚等操作,并提供了具体示例和视频讲解。
352 0

推荐镜像

更多