当前位置: 首页 > news >正文

K8S精进之路-控制器StatefulSet有状态控制 -(2)

状态说明


  在进行StatefulSet部署之前,我们首先可能要了解一下,什么是"有状态应用"和"无状态应用"。无状态应用就是pod无论部署在哪里,在哪台服务器上提供服务,都是一样的结果,比如经常用的nginx。有状态应用中,最经常用的那就属数据库了,因为数据库一般都是绑定了网络状态和存储状态。特别是主从数据库,哪些是主数据库,哪些是从数据库,都有明显的状态标识。离开标识的这台机器,可能就用不了了。

那在K8S中主要表现的状态有哪些呢,如果抽象成现实应用中,一般就是网络拓扑状态和存储状态。

网络拓扑:这意味着在k8s中运行中的应用对应的各个pod实例,都会有固定的启动顺序,而且不管实例pod销毁后新建,网络标识还是原来的网络标识,其它应用要找到它,还是通过原来的网络标识一样能找到。

存储状态:比如,当数据库实例销毁重建后,我存储的数据还是照样是原来的那份数据。数据库存储的数据是有状态的,是直接和这个应用绑定的,不论你pod实例重建多少次都会取到这份自己的数据。

我们先看看StatefulSet是怎样固定网络拓扑状态的。在网络中一般要标识一个地址,都是通过IP地址或者是域名。但是IP地址是不方便被记忆的,所以用一个域名是非常方便的。在K8S中,通过系统的Service DNS是可以确定一个POD的网络标识的。

固定网络拓扑

我们新建一个Headless的Service和nginx

apiVersion: v1
kind: Service
metadata:name: nginxlabels:app: nginx
spec:ports:- port: 80name: webclusterIP: Noneselector:app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: web
spec:serviceName: "nginx"replicas: 2selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.22.1ports:- containerPort: 80name: web

创建之后发现两个Pod运行,分别为web-0,web-1,IP地址分别是10.244.3.18,10.244.2.20。虽然分配了ip但是ip是动态,唯一固定的是这两个pod的域名和它们创建启动的顺序,先创建web-0,然后是web-1。我们通过<pod-name>.<svc-name>.<namespace>.svc.cluster.local的方式来固定这两个pod的地址。
在这里插入图片描述
我们通过web-0.nginx.default.svc.cluster.local和web-1.nginx.default.svc.cluster.local可以在集群内部访问到这两个Pod。我们接下来通过k8s的coredns来解析这两个域名。先找到coredns的ip地址,然后通过dig来解析。
在这里插入图片描述

在这里插入图片描述
解析后发现pod的域名刚好指向这两个pod的ip地址。我现在删除上面的pod,然后重建,再解析他们的域名,发现ip地址变了,但是域名还是那个域名。

kubectl delete -f teststatefulpod.yaml ; kubectl apply -f teststatefulpod.yaml

在这里插入图片描述

固定存储状态

对于应用的存储,这里用pvc来固定应用的存储位置。相对开发人员这里只要熟悉pvc的配置即可,pv的配置一般由运维人员去配置安装。这里我们用分布式存储Rook+Ceph,安装方式可以参考这篇文章<<Centos7.9在K8s安装生产级别的分布式存储Rook+Ceph>>。

我们创建一个带存储的nginx配置

apiVersion: v1
kind: Service
metadata:name: nginxlabels:app: nginx
spec:ports:- port: 80name: webclusterIP: Noneselector:app: nginxstorage: 1Gi
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: web
spec:serviceName: "nginx"replicas: 2selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.22.1ports:- containerPort: 80name: webvolumeMounts:- name: wwwmountPath: /usr/share/nginx/htmlvolumeClaimTemplates:- metadata:name: wwwspec:storageClassName: rook-ceph-blockaccessModes:- ReadWriteOnceresources:requests:storage: 1Gi

创建完成后,会出现两个自动创建的pvc,而且是根据pod名创建的。
在这里插入图片描述
我们分别对这两个nginx的首页加上特殊标志。

kubectl exec web-0 -- sh -c 'echo hello $(hostname) > /usr/share/nginx/html/index.html'
kubectl exec web-1 -- sh -c 'echo hello $(hostname) > /usr/share/nginx/html/index.html'

然后通过ip分别访问这两个nginx.各自首页分别返回了内容,一个是web-0,一个web-1.
在这里插入图片描述
然后删除这两个pod应用,再重建,发现pod虽然重建ip也变了,但是挂载的磁盘还是原来的,内容也没有变。存储状态也是一直保存着的。

kubectl delete -f teststatefulpod.yaml
kubectl apply -f teststatefulpod.yaml

在这里插入图片描述

在这里插入图片描述

相关文章:

  • 基于springboot vue 大学生竞赛管理系统设计与实现
  • 速盾:高防cdn防御的时候会封ip吗?
  • 【线程】线程安全的单例模式
  • C\C++内存管理详解
  • 基于Jeecg-boot开发系统--后端篇
  • Linux-df命令使用方法
  • Vue3 路由传参:玩转 params,让页面交互更流畅!
  • 设计模式-PIMPL 模式
  • RNN模型学习
  • C++ 排序算法
  • 自适应查询优化(Adaptive Query Optimization, AQO)技术简介
  • react crash course 2024(5) useState钩子
  • DPDK 简易应用开发之路 2:UDP数据包发送及实现
  • 记录打鼾软件
  • 2024最新版 Tuxera NTFS for Mac 2023绿色版图文安装教程
  • HashMap ConcurrentHashMap
  • iOS 系统授权开发
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • QQ浏览器x5内核的兼容性问题
  • React-flux杂记
  • redis学习笔记(三):列表、集合、有序集合
  • spring学习第二天
  • 彻底搞懂浏览器Event-loop
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 多线程事务回滚
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 如何编写一个可升级的智能合约
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 探索 JS 中的模块化
  • 王永庆:技术创新改变教育未来
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 一文看透浏览器架构
  • 在Mac OS X上安装 Ruby运行环境
  • Java总结 - String - 这篇请使劲喷我
  • #VERDI# 关于如何查看FSM状态机的方法
  • (¥1011)-(一千零一拾一元整)输出
  • (02)Hive SQL编译成MapReduce任务的过程
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (3)(3.5) 遥测无线电区域条例
  • (php伪随机数生成)[GWCTF 2019]枯燥的抽奖
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (定时器/计数器)中断系统(详解与使用)
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (回溯) LeetCode 77. 组合
  • (七)Flink Watermark
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (算法)N皇后问题
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET 某和OA办公系统全局绕过漏洞分析
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题