Kubernetes实现应用零宕机

news2024/10/6 20:32:44

Kubernetes实现应用零宕机

    • 容器镜像位置
    • Pod数量(应用程序实例)
    • Pod中断预算
    • 部署策略
    • 自动回滚部署
    • Probe探针
    • 初始启动时间延迟
    • 优雅终止期GrancePeriodSeconds
    • Pod反亲和力
    • 资源
    • 自动缩放Autoscaling
    • 总结

容器已经彻底改变了应用托管格局!它带来了许多需要复杂设置的设施。拥有多个实例,具有滚动重启、零停机、健康检查等功能。以前真是费时费力(实现 VRRP 解决方案、使用 monit 之类的应用程序监控重启、负载均衡 haproxy 之类的)!

因此,现在使用 Kubernetes 可以更轻松地访问一切,但如果您想为应用程序的生命周期构建完美的设置,您仍然必须了解它的工作原理以及根据您的情况应遵循哪种策略。

在本文中,我将解释为什么以及如何使用 Kubernetes 实现零停机应用程序。

容器镜像位置

如果您已经使用Docker一段时间,那么这看起来很简单。拉取和使用容器镜像非常简单。但是,在生产环境中,如果您不是镜像所有者,您通常不想依赖远程且不受控制的镜像注册表。为什么呢?

1.注册表可能会消失,并且无法再拉取镜像(Kubernetes上出现ImagePullBackOff错误);
2.正在使用的镜像标签被删除(相同的ImagePullBackOff错误);
3.镜像标签没有改变,但镜像内容不再相同(非不可变镜像,因此镜像哈希值不同)。集群不同节点上的镜像之间的行为不相同(取决于标签何时更改并在集群节点上拉取);
4.不符合你要求控制这些镜像的安全规范(SOC2、HIPPA…);

Pod数量(应用程序实例)

这听起来很明显,但如果你正在寻求高可用性,则你的应用程序至少需要2个Kubernetes副本(2个Pod)。例子:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 2
  template:
  ......

我多次听到关于Kubernetes的一个常见错误是:“我不需要两个实例,因为Kubernetes执行滚动更新,因此它将在关闭当前实例之前启动一个新实例”。确实如此,但它仅适用于部署更新!
以下是不适用此规则的其它场景:

  • 当丢失运行应用程序的节点时(节点崩溃、硬件故障…)。应用程序pod必须从头开始:
    • 1.镜像拉取(如果节点上尚未存在):拉取时间取决于镜像大小
    • 2.磁盘附件(如果有):需要几秒钟(通常观察到最多1分钟)
    • 3.应用程序启动:可能会有所不同,具体取决于受影响的资源和应用程序类型(Java应用程序通常需要更长的时间才能启动)
    • 4.probes:它们正在等待你的应用程序准备就绪提供服务,并增加了几秒钟的时间
  • 当集群请求节点耗尽时(例如在K8S升级或节点类型更改期间)
    • 要替换的节点上的 Pod 会收到SIGTERM信号以正常停止。Pod 正在从RUNNING状态切换到TERMINATING状态。此处,Kubernetes 服务已更新,以停止向TERMINATING pod 发送流量。因此,您不会再收到流量并且会出现停机时间。然后创建一个新的 Pod(请参阅上面的场景),在此期间,您不会收到任何流量。不幸的是,Kubernetes 在杀死一个 pod 之前不会启动一个新的 pod。

这就是为什么设置两个实例是避免停机的最低要求。

Pod中断预算

PodDisruptionBudget(PDB)是一个Kubernetes对象,它指定在部署、维护或任何给定时间不可用的Pod数量。这有助于确保你的应用程序保持可用,即使某些pod被终止或驱逐也是如此。让我们举一个例子,我的应用程序有三个pod(实例),我总是希望始终拥有至少两个running,我可以应用一个PDB对象,这将保证我始终至少两个正在运行的pod。

apiVersion: policy/v1betal
kind: PodDisruptionBudget
metadata:
  name: my-pdb
  namespace: sit
spec:
  maxUnavailable: 1
  selector:
    matchLabels:
	  app: my-app

部署策略

Kubernetes部署有两种策略:
1.RollingUpdate:默认更新,部署顺利。重新创建:在启动较新版本的应用程序之后强制旧版本应用程序逐步关闭。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

默认情况下,应用RollingUpdate策略,但是你可以使用其它选项(例如最大不可用百分比和最大激增)来调整部署的方式。当你面临繁重的流量负载并且想要控制部署速度以最大程度地减少性能影响时,这些选项非常有用。

自动回滚部署

不幸的是,自动回滚并不是Kubernetes默认的功能。一般来说,你必须使用 Helm、ArgoCD、Spinnaker等第三方工具才能实现自动回滚。

大多数人想要的很简单:如果我的应用程序无法正常启动,不要向其发送流量并回滚。
例如,对于Helm,使用Helm实现它的一些选项很有趣:

  • wait
  • wait-for-jobs
  • atomic

为了获得运行良好的解决方案,必须设置并正确配置探针(请参阅下一节)。如果pod没有通过其活性探针正常启动,则会自动回滚。

Probe探针

探针经常被低估,但是它对于实现零停机非常重要!
验证应用程序健康状况的两个最重要的探测器是"Liveness" 和 "Readiness"探测器。

Kubernetes探针工作流程
Liveness探针可确保你的应用程序处于活动状态,并将决定pod是否存活!
如果活性探测未成功:
1.Pod停止接收流量
2.Pod重新启动,尝试恢复健康状态。任何进一步的重新启动都会应用指数退避(指数延迟)

Readiness探针决定是否将流量发送到你的Pod。

  • 如果你的流量出现突发(并且活性探针正在响应),但你的应用程序开始变慢,则就绪状态可以决定停止向你的应用程序发送流量。让它恢复到更加健康的状态。
  • 如果就绪探针没有响应,则不会重新启动你的Pod。它仅请求负载均衡器停止向该Pod发送流量。

初始启动时间延迟

初始启动时间可能需要延迟.它可能发生在不同的情况下:

  • 你的应用程序使用大量CPU来启动(例如SpringBoot应用程序)。
  • 你的应用程序需要在启动时执行更多操作(新增功能),并且你没有升级分配的CPU资源。
  • 你的应用程序必须加载数据库中的架构和其中的数据,并且在数据库准备就绪之前它才可用。

这是可能发生片状启动的示例,如果你遇到这种情况或想预防它,你应该像下面这样更新initialDelaySeconds:

livenessProbe:
  initialDelaySeconds: 60
  httpGet:
  ...

注意:存在专用启动探测器,一般来说,initialDelaySeconds选项就足够了.

优雅终止期GrancePeriodSeconds

这个Kubernetes选项并不直接与零停机功能相关,而是更多地涉及忽略应用程序正常关闭的重要性的缺点效应。

仅当应用程序能够拦截 SIGTERM时,优雅终止期才能起作用!如果应用程序未编码为拦截 SIGTERM,则它只会硬终止应用程序,无论是否存在大于30秒的优雅终止期,这都可能导致数据丢失。

部管理 SIGTERM 可能会带来几个问题:

  • 糟糕的用户体验:用户遇到错误,空白页面或更糟的情况
  • 丢失数据:数据尚未提交,用户事务丢失
  • 不可恢复的数据:刷新磁盘上的数据突然停止,你的应用程序无法处理它

还存在其它原因,但你会看到让应用程序足够快地关闭是多么重要。
硬件故障总是有可能的,因此你的应用程序应该始终能够在此类故障后恢复。然而,类似的常规故障不应该频繁发送。
多给你一点时间让你的应用程序正确停止通常是很好的做法(<5 分钟)。Kubernetes默认值为30秒,但你可以使用终止GracePeriodSeconds选项进行调整。

Pod反亲和力

Pod反关联性可让你避免同一节点上存在同一应用程序的多个实例(Pod)。当所有实例都位于同一节点上时发生节点奔溃时,你可以想象会发生停机。
为了避免这种情况,你可以要求Kubernetes避免所有Pod都位于同一节点上。存在两个版本:
1.软反亲和性Soft Anti-Affinity
a.PreferredDuringSchedulingIgnoredDuringExecution:将尽最大努力避免同一应用程序的多个实例部署在同一节点上,但如果缺乏资源,它将在同一节点上添加两个实例。这个版本具有成本效益,并且在95%的情况下都能发挥作用。

2.Hard Anti-Affinity
a.RequiredDuringSchedulingIgnoredDuringExecution:这将是一个硬性要求,不能在同一节点上有两个pod。但如果你要求同一应用程序有50个pod,则需要50个节点。

affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: security
            operator: In
            values:
            - S1
        topologyKey: topology.kubernetes.io/zone
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: security
              operator: In
              values:
              - S2
          topologyKey: topology.kubernetes.io/zone

资源

资源是常见的问题之一。当设置的资源不足时,你的应用程序可以:

  • 内存不足(OOM)并被内核驱逐。所以你会遇到停机、连接严重关闭等情况…
  • 你设置的CPU够用了吗? 你的应用程序可能需要很长时间才能响应,甚至有时在活动检查成功之前无法启动。运行 100% 的 CPU 可能会强制自动缩放程序添加过多的实例。而您只需要利用当前的 CPU 数量即可。除非您知道自己在做什么,否则低于 100m 通常不好。

自动缩放Autoscaling

自动缩放是避免流量负载下停机的好方法。默认基于CPU(可以使用其他自定义指标)。这是自动部署更多实例(Pod)的简单方法。
自动缩放并不是魔法!你必须在Kubernetes上正确配置你的应用程序。
因此,例如,当你的pod短时间内运行超过60%的CPU时,Kubernetes会触发一个新的pod来处理负载并减少当前正在运行的应用程序的使用率。

以下是Kubernetes上述内容的实例:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
spec:
...
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50

总结

Kubernetes确实有神奇的作用,但只有当应用程序尽可能是云原生且配置正确时,它才能发挥神奇作用。
总之,当你想将应用程序引入Kubernetes时,你至少应该注意:

  • 最少两个实例
  • 添加健康检查(探针)
  • 应用程序必须处理Sigterm
  • 配置自动缩放器
  • 给予足够的资源
  • 使用pod反亲和力
  • 添加PDB

如果一切设置正确,Kubernetes体验将令人难以置信,你将大大减少应用停机情况。

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

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

相关文章

嵌入式Linux系统编程 — 4.2 sizeof 和 strlen 的作用和区别

目录 1 strlen函数 2 sizeof函数 3 sizeof 和 strlen 的作用和区别&#xff08;面试必问&#xff09; 3.1 作用 3.2 主要区别 1 strlen函数 strlen() 函数是 C 语言标准库中的一个函数&#xff0c;用于计算字符串的长度。它不包括字符串末尾的空字符&#xff08;\0&#…

原、反、补码之间的相互转换以及计算机硬件实现有符号数、无符号数、定点小数、定点整数的加减法运算

目录 原、反、补码之间的相互转换 无符号整数的加减运算 无符号整数的加法运算 无符号整数的减法运算 有符号整数的加减运算 有符号整数补码的加法运算 有符号整数补码的减法运算 定点小数的加减运算 定点小数补码的加法运算 定点小数补码的减法运算 定点小数VS定点整…

CSS|05 继承性与优先级

继承性 一、继承性的特点&#xff1a; 1.外层元素身上的样式会被内层元素所继承 2.如果内层元素与外层元素身上的演示相同时&#xff0c;外层元素的样式会被内层元素所覆盖 二、关于继承性的问题 是不是所有样式都能被继承&#xff1f; 答&#xff1a;并不是所有样式能被继承…

1991java Web体检预约管理系统eclipse定制开发mysql数据库BS模式java编程jdbc

一、源码特点 JSP体检预约管理系统是一套完善的web设计系统&#xff0c;对理解JSP java 编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,eclipse开发&#xff0c;数据库为Mysql5.0&#xff0c;使用…

Unity3D Text使用超链接跳转事件

系列文章目录 Unity工具 文章目录 系列文章目录&#x1f449;前言&#x1f449;一、第一种使用TextMeshPro加入超链接&#x1f449;二、继承Text组件,重载OnPopulateMesh方法&#x1f449;三.壁纸分享&#x1f449;总结 &#x1f449;前言 有时候会用到跳转的问题,所以添加一…

详细分析Oracle修改默认的时间格式(四种方式)

目录 前言1. 会话级别2. 系统级别3. 环境配置4. 函数格式化5. 总结 前言 默认的日期和时间格式由参数NLS_DATE_FORMAT控制 如果需要修改默认的时间格式&#xff0c;可以通过修改会话级别或系统级别的参数来实现 1. 会话级别 在当前会话中设置日期格式&#xff0c;这只会影响…

【UE开发】游戏库存UI系统Demo

1.项目介绍 1.描述&#xff1a;一种用于存储记录玩家物品的游戏内可视化操作系统。 2.演示&#xff1a;https://www.bilibili.com/video/BV1f53neVEfW/?vd_source50dea901fd12253f417c48b937975b0d 3.大纲&#xff1a; 4.样式&#xff1a; 2.W_Inventory_Main_01&#xff08;…

云效BizDevOps上手亲测

云效BizDevOps上手亲测 什么是云效项目协作Projex配置2023业务空间原始诉求字段原始诉求工作流创建原始诉求配置2023产品空间创建主题业务原始诉求关联主题配置2023研发空间新建需求需求关联主题 与传统区别云效开发流程传统开发流程云效BizDevOps 操作体验 什么是云效 在说到…

java+mysql图书管理系统

完整代码地址 1.运行效果图 2.主要代码 2.1.连接数据库 package com.my.homework.utils;import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException;public class JDBCUtils {public static Connection getConnection() throws Exception {…

安装containerd

containerd文档地址 containerd介绍 早在2016年3月&#xff0c;Docker 1.11的Docker Engine里就包合了containerd&#xff0c;而现在则是把containerd从Docker Engine里彻底剥离出来&#xff0c; 为一个独立的开源项目独立发展&#xff0c;目标是提供一个更加开放、稳定的容器…

使用FRP 0.58版本进行内网穿透的详细教程

什么是FRP&#xff1f; FRP&#xff08;Fast Reverse Proxy&#xff09;是一款高性能的反向代理应用&#xff0c;主要用于内网穿透。通过FRP&#xff0c;您可以将内网服务暴露给外网用户&#xff0c;无需进行复杂的网络配置。 准备工作 服务器&#xff1a;一台具备公网IP的服…

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第49课-机器人自动跳舞

【WEB前端2024】3D智体编程&#xff1a;乔布斯3D纪念馆-第49课-机器人自动跳舞 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎…

谷歌发布两款新Gemma 2大语言模型;阿里云开源Qwen2-72B模型荣登榜首

&#x1f989; AI新闻 &#x1f680; 谷歌发布两款新Gemma 2大语言模型 摘要&#xff1a;谷歌发布Gemma 2大语言模型&#xff0c;包括90亿和270亿参数两种版本。Gemma 2在推理性能、效率和安全性上较第一代有显著提升。27B模型的性能媲美更大规模的主流模型&#xff0c;且部署…

提升自来水公司经济效益的策略研究

现阶段&#xff0c;如何提高自来水公司经济效益的问题已经得到社会的广泛关注。文章将立足于成本管理的角度&#xff0c;在对自来水公司生产现状分析的基础上&#xff0c;总结影响自来水公司经济效益的相关因素&#xff0c;最后从成本管理的角度出发&#xff0c;对如何提高自来…

Hadoop-01-基础环境搭建 超详细 Hadoop Java 环境变量 3节点云服务器 2C4G XML 集群配置 HDFS Yarn MapRedece

背景介绍 这里是三台公网云服务器&#xff0c;每台 2C4G&#xff0c;搭建一个Hadoop的学习环境&#xff0c;供我学习。 之前已经在 VM 虚拟机上搭建过一次&#xff0c;但是没留下笔记&#xff0c;这次趁着前几天薅羊毛的3台机器&#xff0c;赶紧尝试在公网上搭建体验一下。 注…

huggingface加速下载模型

文章目录 所需环境huggingface-cli 用法登录token 获取 huggingface 镜像huggingface 缓存hf-transfer 拉满下载带宽如果开了的话&#xff0c;记得关掉科学上网&#xff01;&#xff01;&#xff01; 所需环境 python huggingface-cli 用法 huggingface-cli的更多用法点击这…

挂售转卖竞拍商城系统/竞拍系统/转拍闪拍系统+前端

挂售转卖竞拍商城系统源码/竞拍系统/转拍闪拍系统/后端PHP前端UNIAPP源码 玩法简介 ①、后台可添加商品进行挂单 ②、后台设置场次以及场次开始时间 ③、用户抢单 ④、抢单以后可选择提货或者转售 ⑤、玩家寄售需按照后台设置百分比进行加价 ⑥、玩家寄售需支付手续费(余额支付…

代码随想录——加油站(Leetcode 134)

题目链接 贪心 class Solution {public int canCompleteCircuit(int[] gas, int[] cost) {int curSum 0;int totalSum 0;int start 0;for(int i 0; i < gas.length; i){// 当前剩油量curSum gas[i] - cost[i];// 总剩油量totalSum gas[i] - cost[i];// 当前剩油量小…

【Linux】高级IO——五种IO模型和基本概念 ,非阻塞IO,fcntl,实现非阻塞IO,同步通信和异步通信

文章目录 Linux高级IO1. 五种IO模型1.1 阻塞IO1.2 非阻塞IO1.3 信号驱动IO1.4 IO多路转接1.5 异步IO 2. 同步通信和异步通信3. 阻塞和非阻塞 Linux高级IO 1. 五种IO模型 IO是什么&#xff1f; IO是计算机领域中的缩写&#xff0c;指的是输入/输出&#xff08;Input/Output&…

(番外篇)指针的一些相关习题讲解(速进,干货满满)(1)

前言&#xff1a; 我已经好久没写过博客了&#xff0c;这几天确实有点偷懒了&#xff0c;上次博客我们已经讲完了指针的部分内容&#xff0c;但我觉着没有习题是不够的&#xff0c;于是我出了这一篇番外篇&#xff0c;来让各位读者朋友们进行指针强化&#xff0c;这些题目都是小…