暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

K8S滚动发布

IT那活儿 2024-11-04
145

点击上方“IT那活儿”公众号--专注于企业全栈运维技术分享,不管IT什么活儿,干就完了!!!


几种滚动发布方式

1.1 滚动更新

滚动更新通过设置MaxSurge和MaxUnavailable来规定可以有多少个额外的Pod和可以忍受多少个Pod无法提供服务两个参数可以为0,但是不能同时为0,在整个更新的过程中都是平滑无缝衔接。1.2 金丝雀发布

金丝雀发布,又称:灰度发布,在k8s中通过暂停滚动跟新来实现灰度发布。
灰度发布,是将一个新的版本放入到整个集群中,当没有发现问题后再将其他Pod进行更新。1.3 蓝绿发布
蓝绿发布相当于两个不相关的deployment,访问完全通过流量控制来达到目的,当在使用过程中出现问题,在通过流量切换切换回老的版本。

Deployment更新策略

strategy

重建:Recreate
spec:
  replicas: 3
  strategy:
    type: Recreate

滚动更新: rollingUpdate
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 2        # 一次可以添加多少个Pod
      maxUnavailable: 0  # 滚动更新期间最大多少个Pod不可用

注意:
  • 两者不能同时为0maxSurge:和期望ready的副本数比,超过期望副本数最大比例(或最大值),这个值调的越大,副本更新速度越快。      
    数值:0, 副本数;
    百分比:[0%, 100%] 向上取整,比如10个副本,5%的话==0.5个,但计算按照1。
  • maxUnavailable:  和期望ready的副本数比,不可用副本数最大比例(或最大值),这个值越小,越能保证服务稳定,更新越平滑;
    数值:0,副本数;

    百分比:[0%, 100%] 向下取整,比如10个副本,5%的话==0.5个,但计算按照0个。


pod 启停过程

pod对象从创建到终止的这段时间范围被称为生命周期,它主要包含以下几个过程:
  • 1)运行初始化容器(init container)过程
  • 2)运行主容器(main container) 
    a. 容器启动后钩子(post start)、容器终止前钩子(pre stop)
    b. 容器的存活性探测(liveness probe)、就绪性探测(readiness probe)
  • 3)pod终止过程
终止过程主要分为如下几个步骤:
  • 用户发出删除 pod 命令;
  • K8S 会给旧POD发送SIGTERM信号;将 pod 标记为“Terminating”状态;pod 被视为“dead”状态,此时将不会有新的请求到达旧的pod;
  • 并且等待宽限期(terminationGracePeriodSeconds 参数定义,默认情况下30秒)这么长的时间;
  • 第三步同时运行,监控到 pod 对象为“Terminating”状态的同时启动 pod 关闭过程;
  • 第三步同时进行,endpoints 控制器监控到 pod 对象关闭,将pod与service匹配的 endpoints 列表中删除;
  • 如果 pod 中定义了 preStop 处理程序,则 pod 被标记为“Terminating”状态时以同步的方式启动执行;若宽限期结束后,preStop 仍未执行结束,第二步会重新执行并额外获得一个2秒的小宽限期(最后的宽限期,所以定义prestop 注意时间,和terminationGracePeriodSeconds 参数配合使用);
  • Pod 内对象的容器收到 SIGTERM 信号(SIGTERM 相当于kill);
  • 宽限期结束之后,若存在任何一个运行的进程,pod 会收到 SIGKILL 信号(SIGKILL相当于kill -9);
  • Kubelet 请求 API Server 将此 Pod 资源宽限期设置为0从而完成删除操作。
参考文档: Pod 的生命周期 | Kubernetes
了解 Pod 的状态(Status):
Pod 的状态部分包含以下信息:
  • Pod 和托管它的工作节点的 IP 地址;
  • Pod 何时启动· Pod 的服务质量 (QoS) 等级 (相关知识参考https://zhuanlan.zhihu.com/p/643442823);
  • Pod 处于哪个阶段;
  • 集群的条件,以及其各个容器的状态。
了解 pod 阶段(Phase):
  • Pod 的 status 字段是一个 PodStatus 对象,其中包含一个 phase 字段;
  • Pod 的阶段(Phase)是 Pod 在其生命周期中所处位置的简单宏观概述。该阶段并不是对容器或 Pod 状态的综合汇总,也不是为了成为完整的状态机。
下面是 phase 可能的值:
phase取值
描述
Pending(悬决)
创建 Pod 对象后,这是其初始阶段。在 pod 被调度到节点并且拉取并启动其容器的镜像之前,它一直处于此阶段。
Running(运行中)
该 Pod 的至少一个容器正在运行。因此 Pod 包含多个容器,只要有一个正在运行,Pod 的状态就是 Running
Succeeded(成功)
当所有容器成功完成时,不打算无限期运行的 Pod 会被标记为“成功”。注意:Pod 的生命周期很多时候由工作负载(workload)来管理,因此会有不同的策略
Failed(失败)
Pod 中的所有容器都已终止,并且至少有一个容器是因为失败终止。也就是说,容器以非 0 状态退出或者被系统终止。
Unknown(未知)

Pod 的状态未知,因为 Kubelet 已停止报告与 API 服务器的通信。工作节点可能出现故障或与网络断开连接。

  • 说明:
    当一个 Pod 被删除时,执行一些 kubectl 命令会展示这个 Pod 的状态为 Terminating(终止)。这个 Terminating 状态并不是 Pod 阶段之一。Pod 被赋予一个可以体面终止的期限,默认为 30 秒。你可以使用 --force 参数来强制终止 Pod。
了解容器状态(Status):
容器状态包含几个字段。state 字段指示容器的当前状态,而 lastState 字段显示前一个容器终止后的状态。容器状态还指示容器的内部ID(containerID)、容器正在运行的镜像和imageID、容器是否准备好以及重新启动的频率(restartCount)
容器状态最重要的部分是它的状态。 
容器状态
描述
Waiting
容器正在等待启动。原因(reason)和消息(message)字段指示容器处于此状态的原因。
Running
容器已创建并且进程正在其中运行。startedAt 字段指示该容器启动的时间。
Terminated
容器中运行的进程已终止。startedAt 和 finishedAt 字段指示容器何时启动以及何时终止。主进程终止的退出代码位于 exitCode 字段中。
Unknown
无法确定容器的状态。例如失联了。


滚动更新涉及的要点

4.1 更新模式
spec:
 replicas: 2
 strategy:
   type: RollingUpdate
   rollingUpdate:
     maxSurge: 2        # 一次可以添加多少个Pod
     maxUnavailable: 0  # 滚动更新期间最大多少个Pod不可用

4.2 等待关闭宽限期(terminationGracePeriodSeconds> prestop耗时>0),进行prestop配置
lifecycle:
            postStart:
              exec:
                command:
                  - bin/sh
                  - '-c'
                  - >-
                    curl -s -X PUT
                    "http://nacos.xxxx.com:8848/nacos/v1/ns/instance?serviceName=$jar_name&username=$nacos_username&password=$nacos_password&namespaceId=$nacos_namespace&ip=$PodIP&port=$PORT&cluster=DEFAULT&metadata={}&enabled=true"
            preStop:
              exec:
                command:
                  - /bin/sh
                  - '-c'
                  - >-
                    curl -s -X PUT
                    "http://nacos.xxxx.com:8848/nacos/v1/ns/instance?serviceName=$jar_name&username=$nacos_username&password=$nacos_password&namespaceId=$nacos_namespace&ip=$PodIP&port=$PORT&cluster=DEFAULT&metadata={}&enabled=false"

4.3 使用探活(liveness)就绪(readiness)探针(Probe)检查容器的健康状况
  • liveness :涉及服务自动重启。
  • 检测失败后的动作由restartPolicy 决定,restartPolicy 字段,可能的值为 Always、OnFailure 和 Never。默认为 Always。
  • readiness:涉及服务是否有流量进入(只有在注册地址是svc域名时才有效)。
livenessProbe:
            failureThreshold: 3
            httpGet:
              path: /actuator/health
              port: 18081
              scheme: HTTP
            initialDelaySeconds: 180
            periodSeconds: 20
            successThreshold: 1
            timeoutSeconds: 1
          readinessProbe:
            failureThreshold: 8
            httpGet:
              path: /actuator/health
              port: 18081
              scheme: HTTP
            initialDelaySeconds: 30
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 1


END


本文作者:郑金龙(上海新炬中北团队)

本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论