Statefulset实战 2

简介: Statefulset实战 2

上一部分我们分享到,Statefulset 部署应用,我们需要完成这些资源的创建:

  • 制作应用程序和镜像
  • 编写 Service
  • 编写 Statefulset 指定 pod 模板及挂载

我们已经完成前面 2 部分,若还有疑问的可以看上上一部分的文章

编写 Statefulset 清单

现在可以来专注的编写 Statefulset 资源了

编写 Statefulset 资源其实也比较简单,注意三大部分

  1. Statefulset 自身的基本信息
  2. 指定好 serviceName 及 pod 的模板,且配置好挂载路径
  3. 指定好持久化卷声明的模板

statefulset.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: sta-kubia
spec:
  serviceName: sta-kubia
  replicas: 2
  selector:
    matchLabels:
      app: sta-kubia
  template:
    metadata:
      labels:
        app: sta-kubia
    spec:
      containers:
      - name: sta-kubia
        image: xiaomotong888/sta-kubia
        ports:
        - name: http
          containerPort: 8080
        volumeMounts:
        - name: data
          mountPath: /var/data
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      resources:
        requests:
          storage: 1Mi
      accessModes:
      - ReadWriteOnce
  • 设置 statefulset 自身的名称为 sta-kubia,设置 2 个副本数,管理的 pod 标签为 sta-kubia
  • 设置容器模板,镜像为 xiaomotong888/sta-kubia,容器端口为 8080 ,挂载路径为 /var/data
  • 设置持久化卷声明模板,请求的资源内存为 1M,访问模式为 ReadWriteOnce

还是老规矩,通过 kubectl create -f statefulset.yaml 的方式部署 statefulset ,我们来分别查看一下 pod,持久化卷声明 pvc ,持久化卷 pv

查看 pod 状态

通过指令 kubectl get po 查看 pod 的情况

我们可以查看到 sta-kubia-1 是在 sta-kubia-0 完全启动好,状态变成 Running 状态的时候才开始创建容器的

这是 statefulset 自身的机制,会去一个一个的创建 pod,创建 pod 后会准确的确认该 pod 运行 ok,才会进行创建下一个

这样也是保证安全性的一个设计

任意查看一个 pod 的详情

kubectl describe po sta-kubia-0

可以看到该 pod 会正确的对应上一个卷的声明,且索引和自己 pod 的索引一致

查看 持久化卷声明 pvc 和 查看 持久化卷 pv

kubectl get pvc
kubectl get pv

我们可以看到 查看 持久化卷声明 pvc 和 查看 持久化卷 pv,总共分别有 2 个,且互相正确对应上的

如何与我们的 pod 进行通信

之前我们知道,我们是通过 Service 与 pod 进行通信,客户端只需要访问 节点的地址和 Service 的端口就可以了**(前提是我们暴露了 Service 的端口)**

还有一种方式就是进入到其中一个 pod 的内部,去访问集群中 Service 的地址和端口

xdm 还记得其实我们还可以使用一种简单的方式,那就是访问通过 API 服务器的方式来访问我们的 pod 元数据,不记得细节的 xdm 可以看看我之前分享的文章 【k8s 系列】k8s 学习二十四,如何访问 pod 元数据

访问 k8s 的 API Server

  • 直接运行代理
kubectl proxy

我们可以看到咱开启的代理是通过 8001 端口与 Api Server 进行交互的

  • 访问具体的 pod 接口

这个时候,我们就可以通过访问这样的 url 通过代理来请求 ApiServer 了,这算是一个正向代理

还记得,我们镜像中写的应用吗,应用是一个 http 服务器,提供 GET 和 POST 请求?

  • GET 是用来读取指定文件的内容
  • POST 请求是用来将请求内容写入到指定文件中

由于 pod 创建出来,指定的文件还没有,我们可以先使用 POST 请求我们的 pod,然后再使用 GET 请求 pod

POST 请求 pod

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

此处我们 POST 请求 sta-kubia-0 ,并带上数据 helloworld sta-kubia-0 字符串,请求成功,http 服务器会给我们返回写入成功的内容

GET 请求 pod

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

GET 请求数据,会将指定文件中的内容打印出来

请千万记住结尾是 proxy/ 而不是 proxy ,否则你是会收到一个空白回应的, k8s 自身也是通过 url 拼接的方式来组装请求地址的

我们可以知道这个 url 是这样来组装的:

地址:端口/api版本/命名空间/pod名称/proxy

如上我们看到,GET 请求和 POST 请求都被正常处理了,那么我们来用图解的方式,看看我们的 curl 请求是怎样到达实际的 ApiServer 的

我们先来看看 ApiServer 的地址和我们访问的 pod 的地址:

ApiServer 的地址

sta-kubia-0 地址

从 curl 请求到 pod sta-kubia-0 的请求过程如下:

  • 从最初发出 curl 请求之后,会经过 kubectl proxy 进行代理,kubectl proxy 会去代理到 8001 端口继续向下访问
  • kubectl 又会将请求代理到 ApiServer 上,此时请求的是 Apiserver 的地址:8443 端口,看到这里,整个请求实际上是经过了 2 个代理
  • ApiServer 收到请求后,会去请求实际的 pod sta-kubia-0 地址(172.17.0.1)和端口(8080)
  • 最终 pod 中的容器响应后,数据怎么来,请求就顺利请求路径一层一层的相应,最终,我们在界面上就看到了 pod sta-kubia 的相应结果了

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

欢迎点赞,关注,收藏

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

好了,本次就到这里

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

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

更多的可以查看 零声每晚八点直播:https://ke.qq.com/course/417774

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
存储 Prometheus 监控
Grafana 系列文章(十四):Helm 安装 Loki
Grafana 系列文章(十四):Helm 安装 Loki
|
存储 资源调度 Cloud Native
阿里云上云迁移工具案例实践:华为云迁移到阿里云
阿里云上云迁移工具案例实践:华为云迁移到阿里云
阿里云上云迁移工具案例实践:华为云迁移到阿里云
|
存储 关系型数据库 MySQL
MySQL数据库进阶第六篇(InnoDB引擎架构,事务原理,MVCC)
MySQL数据库进阶第六篇(InnoDB引擎架构,事务原理,MVCC)
|
10月前
|
SQL 存储 监控
obdiag:一款OceanBase 数据库诊断的利器
本次分享的主题是obdiag:一款 OceanBase 数据库诊断的利器,由蚂蚁集团 OceanBase 技术专家汤庆分享。主要分为四个部分: 1. OceanBase 概述 2. Obdiag 项目价值 3. Obdiag 设计与实现 4. Obdiag 未来规划
309 14
|
12月前
|
弹性计算 数据管理 应用服务中间件
活动实践 | 借助OSS搭建在线教育视频课程分享网站
本教程指导用户在阿里云ECS实例上搭建在线教育网站,包括重置ECS密码、配置安全组、安装Nginx、创建网站页面、上传数据至OSS、开通OSS传输加速、配置生命周期策略及清理资源等步骤,实现高效、低成本的数据管理和网站运营。
活动实践 | 借助OSS搭建在线教育视频课程分享网站
|
存储 缓存 NoSQL
【赵渝强老师】基于Redis的旁路缓存架构
本文介绍了引入缓存后的系统架构,通过缓存可以提升访问性能、降低网络拥堵、减轻服务负载和增强可扩展性。文中提供了相关图片和视频讲解,并讨论了数据库读写分离、分库分表等方法来减轻数据库压力。同时,文章也指出了缓存可能带来的复杂度增加、成本提高和数据一致性问题。
219 4
【赵渝强老师】基于Redis的旁路缓存架构
|
12月前
|
机器学习/深度学习 Python
机器学习中模型选择和优化的关键技术——交叉验证与网格搜索
本文深入探讨了机器学习中模型选择和优化的关键技术——交叉验证与网格搜索。介绍了K折交叉验证、留一交叉验证等方法,以及网格搜索的原理和步骤,展示了如何结合两者在Python中实现模型参数的优化,并强调了使用时需注意的计算成本、过拟合风险等问题。
717 6
|
机器学习/深度学习 人工智能 自然语言处理
基于PAI-QuickStart搭建一站式模型训练服务体验
【8月更文挑战第5天】基于PAI-QuickStart搭建一站式模型训练服务体验
379 0
|
jenkins Java 测试技术
CI/CD 流水线的设计与实施
【8月更文第30天】持续集成(Continuous Integration, CI)和持续交付(Continuous Delivery, CD)是现代软件开发中的重要组成部分。CI/CD 不仅可以加速产品的发布周期,还能提高软件的质量并减少部署过程中的风险。本文将详细介绍 CI/CD 流水线的设计与实施,并提供一些实用的工具和最佳实践。
1460 2
|
iOS开发
iOS多线程之NSOperationQueue-依赖、并发数、优先级、自定义Operation等最全的使用总结
iOS多线程之NSOperationQueue-依赖、并发数、优先级、自定义Operation等最全的使用总结
780 0