Kubectl 部署有状态应用(上)

news2024/9/25 23:20:43

前面介绍了Deployment以及如何部署无状态应用。

  • Kubectl 部署无状态应用
  • Deployment Controller详解(上)
  • Deployment Controller详解(下)

本文将继续介绍如何在k8s上部署有状态应用。

有状态和无状态服务的区别

  • 无状态:
    • 上面所说的deployment 认为所有的pod都是一样的
    • 不用考虑顺序的要求
    • 不用考虑在哪个node节点上运行
    • 可以随意扩容和缩容
  • 有状态
    • 实例之间有差别,每个实例都有自己的独特性,元数据不同,例如etcd,zookeeper
      实例之间不对等的关系,以及依靠外部存储的应用

StatefulSet

Deployments和ReplicaSets是为无状态服务而设计,StatefulSet则是为了解决有状态服务的问题。StatefulSet 作为 Controller 为 Pod 提供唯一的标识。它可以保证部署和 scale 的顺序,其应用场景包括:

  • 稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现
  • 稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没有Cluster IP的Service)来实现
  • 有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从0到N-1,在下一个Pod运行之前所有之前的Pod必须都是Running和Ready状态),基于init containers来实现
  • 有序收缩,有序删除(即从N-1到0)

好像不太懂?简单来说,部署的无状态应用,每一次的更新部署、都会更新IP以及存储等等。对于业务来说,后端频繁更换ip和存储是一件非常不友好的事情,但有状态服务部署后每次更新都会拥有稳定的存储以及网络标志。

本文目标

  • 如何创建 StatefulSet
  • StatefulSet 如何管理其 Pod
  • 如何删除 StatefulSet
  • 如何扩展 StatefulSet
  • 如何更新 StatefulSet 的 Pod

1. 创建 StatefulSet

首先创建一个nginx service以及两个web StatefulSet

vim statefulset.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "nginx"
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: registry.k8s.io/nginx-slim:0.8
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

 statefulset.yaml

接下来我们打开两个终端,其中一个用于部署,另一个观察部署情况。

第一个终端运行kubectl get pods --watch -l app=nginx观察 StatefulSet Pod 的创建。

第二个终端执行kubectl apply -f statefulset.yaml创建Service 和 StatefulSet。

有以下输出:

service/nginx created
statefulset.apps/web created

上面的命令创建两个 Pod,每个 Pod 运行一个 nginx Web 服务器。

插曲

当执行完 kubectl apply -f statefulset.yaml后,发现另一个终端出现以下输出:


排查思路:

  1. 查看pods


2. 查看pod详细信息
执行kubectl describe pod web-1


发现Events中确实创建并且run起来了,但是pod重启失败。

造成Back-off restarting failed container nginx in pod 的原因主要是因为容器内PID为1的进程退出导致(通常用户在构建镜像执行CMD时,启动的程序,均是PID为1)。一般遇到此问题,使用者需自行排查原因,可从如下几个方向入手:

    1. 镜像封装是否有问题,如是否有PID为1的常驻进程
    • 举例1:在容器dockerfile中,最后的CMD执行的是nginx start,执行后,nginx服务一直在前台打印日志,服务常驻,进程持续存在,则不会有问题
    • 举例2:在容器dockerfile中,最后的CMD执行的是nohup nginx start &,执行后,该命令就结束了,对应的进程也就没了,容器back-off重启
    1. 常驻进程是否异常退出
    • 服务启动后,会尝试连接一个第三方服务,重试10次连接失败,则程序终止退出,本地环境和这个三方环境通,换了个k8s之后,这个服务不通了,则会出现服务退出,进程结束,容器back-off
    1. 镜像使用方式不对
  • 例如镜像封装的时候,并没有指定启动参数,需要使用者在使用该镜像的时候,自己添加启动命令及参数(command,args),如果不添加,容器内可能没有正确的执行命令,运行即退出

解决方式

容器没有任务的时候会处于非running状态,要保持running状态大家推荐的方法是在容器起来之后去循环访问一个系统自带的文件/dev/null,默认情况下里面是空的,tail -f就是实时打印日志的命令。
在yaml 文件中加入

command: ["/bin/bash", "-ce", "tail -f /dev/null"]

此时,执行kubectl delete statefulset web。删掉旧服务,并重新执行kubectl apply -f statefulset.yaml部署。发现:

kubectl get pods
-----
NAME    READY   STATUS    RESTARTS   AGE
web-0   1/1     Running   0          6s
web-1   1/1     Running   0          5s

回到原文。

经过小插曲的修改后,执行kubectl get statefulset web

kubectl get statefulset web
------
NAME   READY   AGE
web    2/2     13m

发现两个pod都已经ready了。

有序 Pod 创建过程

对于具有n个副本的StatefulSet ,当部署 Pod 时,它们是按顺序创建的,从{0…n-1}排序。从第一个终端中命令的输出将如下例所示:

web-0   0/1     Pending             0                0s
web-0   0/1     Pending             0                0s
web-0   0/1     ContainerCreating   0                0s
web-0   1/1     Running             0                1s
web-1   0/1     Pending             0                0s
web-1   0/1     Pending             0                0s
web-1   0/1     ContainerCreating   0                0s
web-1   1/1     Running             0                1s

未完,待续…

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

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

相关文章

视频监控技术经历了哪些发展阶段?视频监控技术未来趋势展望

随着城市经济的发展和进步,视频监控也已经应用在人们衣食住行的方方面面,成为社会主体的一个重要组成部分。随着视频监控的重要性越来越凸显,大家对视频监控技术的发展也非常关注。今天我们来简单阐述一下,视频监控技术经历的几个…

智能优化算法应用:基于蜣螂算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于蜣螂算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于蜣螂算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.蜣螂算法4.实验参数设定5.算法结果6.参考文献7.MA…

Selenium自动化测试框架(附教程+源码)

说起自动化测试,我想大家都会有个疑问,要不要做自动化测试? 自动化测试给我们带来的收益是否会超出在建设时所投入的成本,这个嘛别说是我,即便是高手也很难回答,自动化测试的初衷是美好的,而测试…

德勤中国合伙人姚承懿:只是“线上化”的数字化转型不会成功

投资者们都期待超出预期的增长,倾向规避未知风险。当下的宏观经济形势复杂,外部条件多变,那些善于驾驭风险,给市场以确定性的企业,能够得到投资者更多的青睐。 合规与增长是支撑上市公司市值的关键要素。有统计数据显…

孔夫子二手书采集

文章目录 项目演示软件采集单本数据网页搜索数据对比 使用场景概述部分核心逻辑Vb工程图数据导入与读取下拉框选择参数设置线程 使用方法下载软件授权导入文件预览处理后的数据 项目结构附件说明 项目演示 操作视频详见演示视频,以下为图文演示 软件采集单本数据 …

OAuth2.0入门(01)

目录 引言1. OAuth2.0基础概念1.1 授权与认证的区别1.2 OAuth2.0核心角色1.3 OAuth2.0授权类型授权码模式简化(隐式)模式密码模式客户端模式 2. OAuth2.0工作流程2.1 授权流程2.2 令牌获取流程 总结 引言 OAuth2.0是当前互联网领域中广泛使用的授权框架,它为用户资…

Unity向量按照某一点进行旋转

Unity向量按照某一点进行旋转 一、unity的旋转二、向量按照原点进行旋转注意案例 三、向量按照指定位置进行旋转案例 一、unity的旋转 首先要知道一点就是在Unity的旋转中使用过四元数进行旋转的,如果对一个物体的rotation直接赋值你会发现结果不是你最终想要的结果…

TCP:IP原理

TCP/IP 原理 TCP/IP 协议不是 TCP 和 IP 这两个协议的合称,而是指因特网整个 TCP/IP 协议族。从协议分层模型方面来讲,TCP/IP 由四个层次组成:网络接口层、网络层、传输层、应用层。 网络访问层(Network Access Layer) 网络访问层(Network …

目标检测与测距算法在极端天气下的应用

引言: 在现代社会中,极端天气条件对人们的生活和工作带来了很大的挑战。对于一些特定领域,如交通运输、安全监控等,准确的目标检测与测距算法在极端天气下尤为重要。本文将分点概述极端天气下目标检测与测距算法的关键问题及解决办…

《Nature》预测 2024 科技大事:GPT-5预计明年发布等

《Nature》杂志近日盘点了 2024 年值得关注的科学事件,包括 GPT-5 与新一代 AlphaFold、超算 Jupiter、探索月球任务、生产「超级蚊子」、朝向星辰大海、试验下一代新冠疫苗、照亮暗物质、意识之辩第二回合、应对气候变化。 今年以来,以 ChatGPT 为代表…

python的import功能,你需要了解的导入机制

1 基本概念 概念 解释 import 即导入,方式就是在import位置将代码文件拷贝过去。 模块(module) python中一个.py文件定义为一个模块 常用的几种模块导入方式: import module_nameimport module_name.function_nameimport mod…

springboot+vue项目如何在linux上部署

在linux上部署项目,是我们实训项目作业的最后一步,此时我们的项目编码测试已经完成,接下来就需要在服务器上部署上线,那么如何部署上线,接下来我会在虚拟机上的CentOS7系统上实现部署, 一.下载JDK 因为我…

sqlilabs第三十二三十三关

Less-32(GET - Bypass custom filter adding slashes to dangerous chars) 手工注入 由 宽字符注入可知payload 成功触发报错 http://192.168.21.149/Less-32/ ?id1%df 要写字符串的话直接吧字符串变成ascii码 注意16进制的表示方式 自动注入 sqlmap -u http:…

python定义代码块的符号,python中代码块所属关系

大家好,小编来为大家解答以下问题,python中代码块所属关系的语法,python定义代码块的符号,今天让我们一起来看看吧! 本文章主要用于平时Python3学习和使用中积累的比较常用的代码块。代码都是经过验证可行的python简单…

电脑提示vcruntime140.dll找不到怎么办,解决vcruntime140.dll丢失的方法

当我们在使用Windows系统运行特定程序或软件的时候,有时会遇到"vcruntime140.dll丢失"的问题。这个动态链接库(DLL)文件在程序的正常运行中起着关键的作用,因此出现该错误往往会导致程序无法启动或运行异常。在本文中&a…

测试老鸟,对软件测试行业的看法,“我“测试人何去何从?

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 首先一个软件做出…

css的定位

为什么需要定位? 场景: 某个元素可以自由的在一个盒子内移动位置,并且压住其他盒子当我们滚动窗口的时候,盒子是固定屏幕某个位置的。 这二个需求,使用标准流和浮动的方式是无法实现的或者是不容易实现,所以…

华为OD机试 - 学生方阵 - 矩阵(Java 2023 B卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述1、输入2、输出 四、解题思路1、题目解析2、解体思路 五、Java算法源码再重新读一遍题目,看看能否优化一下~ 六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 专栏导…

【Midjourney】登录和使用:详细指南!

关于Midjourney 链接: Midjourney Midjourney 是一项使用人工智能自动生成图像的服务。你可以通过向人工智能发出称为“提示”的指令来生成你想要的图像。例如,可以生成风景、人物、建筑等各种图像,还可以调整图像风格(绘画、插画风格、摄影风…

Certum的EV增强型证书

EV增强型https证书是一种特别的数字证书,只有这一款域名数字证书可以直接在地址栏显示企业名称(支持中文名称)。因此,很多企业为了提升企业的品牌形象,向客户展示企业的专业性和可靠性,往往会选择这种类型的数字证书。今天就随SSL…